




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第1章Oracle 的體系結構這一章的內容是比較枯燥的,但它是理解以后章節的基礎。如果有讀者在開始時有些 內容沒有完全理解也不用太著急,可以繼續學習后面的內容,等使用了一段時間Oracle 系統之后,一些概念就變得容易理解了。1.1 Oracle 引入復雜的體系結構的原因數據庫管理系統引入非常復雜的內存和外存體系結構的主要原因是有效地管理稀有的 系統資源。資源不足不只是數據庫管理系統所面對的。其實,在我們五千年的人類發展歷 史中,我們的祖先們一直在同資源不足作斗爭。歷史上糧食和土地等一直都是稀有資源, 還記得我們的祖先們用什么方法來管理這些稀有資源的嗎?用戰爭,我們的先民們為糧食 而戰, 為土
2、地而戰; 我們當代人類為石油而戰, 為市場而戰, 為金錢而戰。那么在 Oracle 數據庫中什么是稀有資源?它們又是如何來管理的呢?如果讀者接觸過 數據庫或讀過相關的書,應該還有印象,數據庫的數據量和輸入/輸出量都是相當大的,而 第1章 Oracle的體系結構這些數據一般都存在硬盤(外存)上,因此硬盤為數據庫的一類資源。為了方便介紹, 圖1-1給出了硬盤的內部結構示意圖。圖1-1從圖1-1可以看出,所有硬盤上數據的訪問都是靠硬盤的旋轉和磁頭的移動來完成的, 這種旋轉和移動是機械運動。因為在計算機中所有數據的修改操作必須在內存中進行,所以 內存也是數據庫的一類資源。表1-1給出內存和外存的簡單比
3、較以幫助讀者理解本書的內容。表 1-1內存外存(硬盤)數據訪問速度很快很慢存儲的數據臨時永久價錢很貴相當便宜從表1-1的比較可知,內存的數據訪問速度要比外存(硬盤)快得多。這是因為內存 的數據訪問是電子速度,而硬盤的數據訪問主要取決于機械速度。也就是說,如果一個數 據庫管理系統能夠使絕大多數(如90%以上)數據操作在內存中完成,那么這一數據庫管理系統的效率將非常高。但是由于內存中的數據在斷電或出現系統故障時會消失,所以數 據庫管理系統還必須保證,所有的數據改動都必須及時寫到硬盤上,以保障不會丟失數據;即使數據庫崩潰之后,所有提交過的數據都能得到完全恢復。盡管可以通過加大內存來提 高數據庫管理系
4、統的效率,但在大多數情況下信息系統的開發和維護經費都是有限的。通過以上的討論,讀者應該意識到,在數據庫管理系統中最寶貴的稀有資源是內存。為了高效地使用內存這種稀有資源,同時保證不會丟失任何數據庫中的數據,Oracle數據庫管理系統引入了一個非常復雜的體系結構。1.2 Oracle數據庫中常用的術語為了講解容易,在詳細討論Oracle體系結構之前,先介紹一下相關的名詞和術語。在這里只給出實用的解釋,并不追求學術上的嚴謹。進程(Process): 段在內存中正在運行的程序。如果沒有學過計算機操作系統 相關課程,可以把進程想象成能夠自動完成某些特定任務的任何東西,如訓練有 素的狗狗、跑龍套的等。后臺
5、進程(background process):進程的一種,在內存中運行時,不占顯示,而 且它的優先級比前臺進程低。可以只有一個前臺進程,但可以有多個后臺進程。緩沖區主機(服務器客戶機(buffer ): 一段用來臨時存儲數據的內存區。 host):計算機系統的另一個稱呼。(server): 一臺在網絡中向其他計算機系統提供一項或多項服務的主機。(dient): 一臺使用由服務器(server)提供服務的計算機系統。1.3 Oracle數據庫管理系統的體系結構為了能使Oracle數據庫管理系統滿足商業用戶的要求,Oracle引入了如圖1-2所示的復雜的體系結構。-17 -user p roces
6、ssever p rocessparameter進 制.文件正文文件data filesdata base一進制文件進 制進 制control files redo log filesp asswordarchived log files圖1-2以上這個復雜的體系結構主要包括Oracle服務器(server)(而服務器又是由Oracle實例(instanee)和Oracle數據庫(database組成),還包括一些其他的關鍵文件、用戶 進程和服務器進程等。Oracle 服務器(server)由 Oracle 實例(instanee)和 Oracle 數據庫(database)兩大部 分組成。它
7、是一個數據庫管理系統,提供了一致、開放和多樣的信息管理的方法和途徑。服務器中的一些結構并不在處理SQL語句時使用,它們是為了改進數據庫系統的效率或數據的恢復等而設計的。1.4 Oracle 服務器(server)Oracle服務器(server)可以有以下3種安裝方式。Oracle(1 )基于主機方式:在此種配置下,用戶直接在安裝了數據庫的計算機上登錄 數據庫。(2)客戶端-服務器(client-server)(兩層模型)方式:數據庫和客戶終端分別安裝 在不同的計算機上,用戶通過網絡從個人計算機(客戶端)上訪問數據庫。(3)客戶端-應用服務器-服務器(client- appiication s
8、erver-server)(三層模型):用 戶首先從自己的個人計算機登錄應用服務器,再通過應用服務器訪問真正的數據庫。1.5 Oracle 實例(instance)Oracle實例(instanee)是一種訪問數據庫的機制,它是由內存結構和一些后臺進程組 成的。它的內存結構也稱為系統全局區(system global area, SGA)。系統全局區是實例的最基本的部件之一。實例的后臺進程中有5個是必需的,即這 5個后臺進程中的任何一個沒有啟動,實例將自動關閉。這5個后臺進程分別是 SMON、PMON、DBWR、LGWR和CKPT。在OCP考題中有時可能會問哪些后臺進程是可選的?除了這 5個都
9、是可選的。實 例一啟動就分配系統全局區和啟動所需的后臺進程。這里應該指出的是,每個實例只能操 作一個數據庫,而且它不可以操作其他的數據庫。但是反過來是不成立的,因為一個數據 庫可以同時被幾個實例操作(在Oracle集群中)。系統全局區(SGA)中包含了以下幾個內存結構:共享池(shared pool)、數據庫高速緩沖區(database buffer cache)、重做日志緩沖區(redo log buffer)和其他的一些結構(如 鎖和統計數據)等。1.6 Oracle數據庫Oracle數據庫是數據的一個集合, Oracle把這些數據作為一個完整的單位來處理。 Oracle數據庫也叫做物理(
10、外存)結構,它為數據庫信息提供了真正的物理存儲,它是由 以下3類操作系統文件組成的。(1)控制文件(control files):包含了維護和校驗數據庫一致性所需的信息。(2) 信息。(3)重做日志文件(redo log files):包含了當系統崩潰后進行恢復所需記錄的變化數據文件(data files):包含了數據庫中真正的數據。1.7 Oracle其他的關鍵文件除了以上3類數據庫文件之外,Oracle服務還需要其他的一些文件,這些文件不屬于 數據庫。其中包括:初始化參數文件(parameter files):定義了實例的特性,如系統全局區中一些內 存結構的大小、DBWR的個數。密碼文件(
11、Password files ):包含了數據庫管理員或操作員用戶在啟動和關閉實 例時所需的密碼。雖然Oracle數據庫提供了相當完善的安全管理機制,但是在Oracle數據庫沒有開啟時如何驗證要啟動數據庫的人是真正的數據庫管理員或操 作員呢?這就是 Oracle引入密碼文件的原因。歸檔重做日志文件(archived redo log files ):是重做日志文件的脫機備份。在系 統崩潰后進行恢復時可能需要這些文件。1.8 建立與Oracle實例的連接Oracle實例(in sta nee)是用Oracle的START UP命令啟動的(該命令將在后面的章節 中詳細介紹)。它的啟動就意味著 SGA
12、的所有內存結構都已生成,所有必需的后臺進程都 已在內存中運行。那么此時用戶又是如何使用Oracle數據庫呢?用戶在向Oracle數據庫發出SQL命令之前必須與實例(instanee)建立連接。用戶啟 動一個工具如 SQL*Plus,或運行一個利用 Oracle工具開發的應用程序,如用Oracle Forms開發的應用程序時,這個工具或應用程序就被作為一個用戶進程來執行。用戶進程是不能 直接訪問數據庫的。在專用連接的情況下(也是默認),當一個用戶登錄Oracle服務器時(如在SQL*PlusOracle 就的提示下輸入用戶名和密碼),如果登錄成功(即用戶名和密碼都準確無誤), 在服務器所運行的計
13、算機上創建一個服務器進程。在這種連接下,該服務器進程只能為這 個用戶進程提供服務。用戶進程與服務器進程是一對一的關系。用戶進程向服務器進程發 請求,服務器進程對數據庫進行實際的操作并把所得的結果返回給用戶進程。就好像一個 大富豪想炒股票,但又不懂股票市場的運作,于是他請了一位股票經紀人。這位富豪就相 當于用戶進程,而股票經紀人就相當于服務器進程,股票市場就相當于Oracle數據庫。一個用戶每次登錄 Oracle服務器,如果成功,該用戶就與Oracle服務器建立了連接,而這種連接又叫做會話。一個會話始于用戶成功地登錄Oracle服務器,終止于用戶退出或非正常終止連接。一個數據庫用戶可能同時有多個
14、會話存在,即用相同的用戶名和密碼同 時登錄多次。1.9各種不同的連接方式連接是用戶進程與Oracle服務器之間的通信路徑。與Oracle服務器(server)的3種安裝方式相對應,一個數據庫用戶可能用以下3種方式之一與 Oracle服務器連接。(1) 基于主機方式:此時的用戶進程與服務器進程是在同一臺計算機的相同的操作系統上的,用戶進程與 Oracle服務器之間的通信路徑是通過操作系統內部進程通信(in terpro cess com mun icati on , IPC) 機制來建立的。(2) 客戶端-服務器(client-server)(兩層模型)方式:用戶進程與 Oracle服務器之間的
15、通信是通過網絡協議(如TCP/IP)來完成的。(3) 客戶端-應用服務器-服務器(client- appiication server- server )(三層模型):用戶的個人計算機通過網絡與應用服務器或網絡服務器通信,而這個應用服務器或網絡服務 器又是通過網絡與運行數據庫的計算機相連的。例如,用戶使用瀏覽器通過網絡運行NT服務器上的應用程序,而NT服務器又從運行在 UNIX主機上的Oracle數據庫中提取數據。以上所介紹的連接是用戶進程與服務器進程的一對一的連接,也稱為專用服務器連接(dedicated server connection )。除了這種連接外,在聯機事務處理(online
16、transactionprocess in g, OLT P)系統的配置時還有另外的一種連接,它在Oracle 9i之前的版本中稱為多線程(MTS)連接,在 Oracle 9i或以后的版本中稱為共享服務器(shared server)連接。有關這種連接在Oracle的網絡和調優的書籍中介紹。1.10服務器進程當Oracle創建一個服務器進程的同時要為該服務器進程分配一個內存區,這個內存區稱為程序全局區(P rogram global area , PGA)。與SGA不同,PGA是一個私有的內存區,是不能共享的,是只屬于一個進程的。它隨著進程的創建而被分配,隨著進程的終止而被 回收。在專用服務器
17、進程的配置情況下,程序全局區包括了以下結構:(1)(2)排序區(sort area):用于處理SQL語句所需的排序。游標狀態區(cursor state):用于指示會話當前所使用的SQL語句的處理狀態。堆棧區(stack sp ace):包括了其他的會話變量。會話信息區(session in formation ):包括了會話的用戶權限和優化統計信息。(4)如果是共享服務器進程或多線程的配置,以上這些結構除了堆棧區外大部分將存在SGA中。如果有large pool,它們就會被存在large pool,否則它們就會被存在共享池中。1.11Oracle執行SQL查詢語句的步驟如果用戶在SQL* P
18、lus下輸入了如下的查詢語句:SELECT * FROM de pt;,那么Oracle又是如何來處理這個語句的呢?SQL語句的執行主要由用戶進程與服務器進程來完成,其他的一些進程可能要輔助完成這一過程。查詢語句與其他的SQL語句有所不同,如果一個查詢 語句執行成功,它要返回查詢的結果。而其他的SQL語句只是返回執行成功或失敗的信息。查詢語句的處理主要包括以下3個階段:編譯(parse)、執行(execute)和提取數據(fetch)。編譯(parse):在進行編譯時,服務器進程會將 SQL語句的正文放入共享池 (shared pool)的庫高速緩存(library cache )中并將完成以
19、下處理:? 首先在共享池中搜索是否有相同的SQL語句(正文),如果沒有就進行后續的處理。? 檢查該SQL語句的語法是否正確。? 通過查看數據字典來檢查表和列的定義。? 對所操作的對象加編譯鎖(parse locks)以便在編譯語句期間這些對象的定義不能被改變。? 檢查所引用對象的用戶權限。? 生成執行該 SQL語句所需的優化的執行計劃(執行步驟)。? 將SQL語句和執行計劃裝入共享的 SQL區。以上的每一步操作都是在處理正確時才進行后續的處理。如果不正確,就返回錯誤。執行(execute): Oracle服務器進程開始執行SQL語句是因為它已獲得了執行SQL語句所需的全部資源和信息。提取數據(
20、fetch ): Oracle服務器進程選擇所需的數據行,并在需要時將其排序, 最后將結果返回給用戶(進程)。1.12共享池(shared pool)SGA中的共享池(data dict ionary cache)shared pool)是由庫高速緩存(library cache )和數據字典高速緩存兩部分所組成。服務器進程將SQL (也可能是PL/SQL )語句的正文和編譯后的代碼(Parsed code)以及執行計劃都放在共享池(shared pool)的庫高速緩存第1章 Oracle的體系結構中。在進行編譯時,服務器進程首先會在共享池中搜索是否有相同的SQL或PL/SQL語句(正文),如
21、果有就不進行任何后續的編譯處理,而是直接使用已存在的編譯后的代碼和執行計劃。提示:庫高速緩存包含了共享 SQL區和共享PL/SQL區兩部分,它們分別存放SQL和PL/SQL 語句以及相關的信息。要想共享SQL或PL/SQL語句,第一,庫高速緩存(library cache )要足夠大,因為只 有這樣要共享的SQL或PL/SQL語句才不會很快地淘汰出內存。第二, SQL或PL/SQL語 句要是能共享的通用代碼(gen eric code),因為Oracle是通過比較SQL或P L/SQL語句的 正文來決定兩個語句是否相同的,只有當兩個語句的正文完全相同時Oracle才重用已存在的編譯后的代碼和執
22、行計劃。這里通過以下的實例來進一步解釋這一點。讀者猜如下的兩 個SQL語句是否相同?select * from emp where sal = 1500; 和 select * from emp where sal = 1501;答案是不相同的(在 Oracle默認的配置下,Oracle &和Oracle 9i以及更高的版本可以 通過重新設置CURSOR_SHARING參數來修改默認配置,有興趣的讀者可參閱 Oracle調優 方面的書籍)。可以通過使用綁定變量的方式來重寫以上的SQL語句,如下:select * from emp where sal = &v_sal;這個語句就是可以共享的通用
23、代碼,因為變量不是在編譯階段而是在運行階段賦值的。LRU ( least recentlyLRU隊列的算法 ,當一個服務器進 LRU隊列的尾部(最LRU隊列引入庫高速緩存 (library cache)的目的是共享 SQL或PL/SQL代碼。那么Oracle又是怎樣 有效地管理庫高速緩存(library cache)的呢? Oracle是使用一個稱為 used)的隊列(list)或算法(algorithm )來實現對庫高速緩存的管理的。 大致如下:剛使用的內存塊(的地址)放在 LRU隊列的頭上(最前面) 程需要庫高速緩存的內存空間而又沒有空閑的內存空間時,該進程就從LRU隊列的尾部而被最先使用
24、。后面)獲得所需的內存塊,這些內存塊一旦被使用,它們(的地址)就立即放在 的最前面。這樣那些長時間沒使用過的內存塊將自然地移到從以上的討論可知,為了能夠共享 SQL或PL/SQL的代碼,庫高速緩存要足夠大,因 為這樣那些可以共享的 SQL或PL/SQL代碼才不會被很快地淘汰出內存。不過Oracle并沒有給出直接設置庫高速緩存大小的方法,只能通過設置共享池的大小來間接地設置庫高速 緩存的大小。介紹完了庫高速緩存,接下來將介紹數據字典高速緩存(data dictionary cache)。當Oracle在執行SQL語句時,服務器進程將把數據文件、表、索引、列、用戶和其他的數據 對象的定義和權限的信
25、息放入數據字典高速緩存。如果在這之后,有進程(用戶)需要同 樣的信息,如表和列的定義,那么所有的這些信息將從數據字典高速緩存中獲得。因為以上所說的這些信息都是存在Oracle數據庫的數據字典中,這也可能就是該部分內存叫做數據字典高速緩存的原因。表和列的定義等重用的機會要比SQL語句大,因此為了能達到共享這些信息的目的,數據字典高速緩存應該盡可能設置得大一些。不過與庫高速緩存一樣,Oracle并沒有給出直接設置數據字典高速緩存大小的方法,只能通過設置共享池的大小來間接地設置數據字 典高速緩存的大小。在Oracle 9i之前的版本,可以通過修改參數文件中的SHARED_POOL_SIZE的值來改變
26、共享池的大小,但一定要重新啟動Oracle數據庫。在 Oracle 9i或以后的版本中,也可以使用類似于例1-1的命令來改變共享池的大小:例1-1SQL ALTER SYSTEM SET SHARED _POO L_SIZE = 32M; 系統已更改。但是所改變共享池的大小受限于 SGA_MAX_SIZE參數。這個參數將在以后的章節中 詳細地介紹。注意:在本書中采用如下的約定:SQL為SQL*Plus的提示符。沒有陰影的內容為要輸入的SQL語句或SQL*Plus命令等。如在例1-1中要輸入ALTER SYSTEM SET SHARED_ POO L_SIZE = 32M; 。陰影中的內容為系統
27、顯示(輸出)的結果。如在例1-1中的“系統已更改。”。提示:即使把共享池設置得足夠大并且所使用的SQL或PL/SQL語句也是能共享的代碼,Oracle也并不能一定使用內存(共享池)中的代碼。例如當有用戶修改了某個對象的定義 之后,所有使用這個對象的內存(共享池)中的代碼全部被Oracle設置為無效,因此在使用時必須重新編譯。1.13 數據庫高速緩沖區 (database buffer cache)如果用戶發出了以下的SQL語句:SELECT * FROM emp, Oracle又是怎樣提取數據庫中的數據呢?服務器進程將首先在數據庫高速緩沖區( database buffer cache)中搜尋
28、所 需的數據,如果找到了就直接使用而不進行磁盤操作,如果沒找到就將進行磁盤操作把數 據文件中的數據讀入到數據庫高速緩沖區中。從以上的討論可知,為了能夠共享數據庫中的數據,數據庫高速緩沖區要足夠的大,# -第1章 Oracle的體系結構因為這樣那些可以共享的數據才不會被很快地淘汰出內存。Oracle也是使用一個叫做 LRU(least recently used)的隊列(list)或算法(algorithm )來實現對數據庫高速緩沖區的管理。 可以使用參數文件中的 DB_BLOCK_SIZE 和DB_BLOCK_BUFFERS 兩個參數來設置數據 庫高速緩沖區的大小。其中DB_BLOCK_SIZ
29、E為Oracle數據塊(內存緩沖區)的大小,在DB_BLOCK_BUFFERS 為內存緩沖Oracle數據庫中內存和外存的數據塊的大小是相同的。區的個數。數據庫高速緩沖區大小為這兩個參數的乘積。但是DB_BLOCK_SIZE 的值是在創建數據庫時設定的,如果要改變該參數的值一般需要重建數據庫。因此多數情況下只能 通過改變DB_BLOCK_BUFFERS 的值來調整數據庫高速緩沖區大小。但一定得重新啟動 Oracle數據庫。在Oracle 9i或以后的版本中,Oracle引入了另一個參數 DB_CACHE_SIZE , 這個參數是一個動態參數,即可以在數據庫運行時動態地改變該參數。可以使用類似于
30、 例1-2的命令來改變數據庫高速緩沖區的大小:例1-2SQL ALTER SYSTEM SET DB_CACHE_SIZE = 48M; 系統已更改。1.14 內存緩沖區顧問(v$db_cache_advice)3種狀態:Oracle 9i或以后的版本還提供了一個稱為內存緩沖區顧問( v$db_cache_advice)的工 具來幫助獲得調整數據庫高速緩沖區的統計信息。內存緩沖區顧問一共有(1) ON :該工具打開,為該工具分配內存并進行統計信息的收集。要有一定的內存 和CPU開銷。(2) READY :該工具關閉,為該工具分配內存但不進行統計信息的收集,因此沒有CPU的開銷。(3) OFF
31、:該工具關閉,不為該工具分配內存也不進行統計信息的收集,因此既沒有 內存的開銷也沒有 CPU開銷。可以通過修改初始化參數 DB_CACHE_ADVICE 的值來改變該工具的狀態。這一參數 是一個動態參數,因此可以使用ALTER SYSTEM命令來修改。例如可以利用類似于例 1-3 的SQL語句來查看它的狀態:例1-3SQL select id, name, block_size, advice_status2 from v$db_cache_advice;ID NAMEBLOCK SIZE ADV3 DEFAULT4096 ON3 DEFAULT4096 ON3 DEFAULT4096 ON3
32、 DEFAULT4096 ON3 DEFAULT4096 ON已選擇20行。此時,例1-3的顯示結果表明了內存緩沖區顧問是在開啟狀態。提示: 顯示結果中的 表示省略了一些行的顯示。之后可以使用類似于例1-4的命令將內存緩沖區顧問(v$db_cache_advice)工具關閉:例1-4SQL alter system set db_cache_advice = off; 系統已更改。這時可以再使用類似于例1-5的SQL語句來查看它的狀態:例1-5ID NAMEBLOCK_SIZE ADV3 DEFAULT4096 OFF3 DEFAULT4096 OFF3 DEFAULT4096 OFF3 DE
33、FAULT4096 OFF3 DEFAULT4096 OFF已選擇20行。此時,例1-5的顯示結果表明已成功地關閉了內存緩沖區顧問SQL select id, name, block_size, advice_status2 from v$db_cache_advice;使用已超出了本書的范圍,有興趣的讀者可參閱(詳細地介紹該工具的Oracle 9i/10g調優方面的書籍)。-31 -1.15 重做日志緩沖區(redo log buffer)redo log從理論上來講,如果數據庫不會崩潰,根本沒有必要引入重做日志緩沖區(buffer)。弓I入重做日志緩沖區的主要目的(在Oracle &之前的
34、版本中也是惟一的目的)就是數據的恢復。Oracle在使用任何DML或DDL操作改變數據之前都將恢復所需的信息, 即在寫數據庫高速緩沖區之前,先寫入重做日志緩沖區。與執行查詢語句有所不同,Oracle在執行DML語句時只有編譯(parse)和執行(execute) 兩個階段。以下是 Oracle執行UP DATE語句的步驟:Oracle服務器進程將把它們從數(1)如果數據和回滾數據不在數據庫高速緩沖區中, 據文件中讀到數據庫高速緩沖區中。(2) Oracle服務器進程在要修改的數據行上加鎖(行一級的鎖)。(3)Oracle服務器進程將數據的變化信息和回滾所需的信息都記錄在重做日志緩沖 區中。(4
35、)Oracle服務器進程將回滾所需的原始值和對數據所做的修改都寫入數據庫高速 緩沖區(database buffer cache)。之后在數據庫高速緩沖區中所有的這些數據塊都將被標 為臟緩沖區,因為此時內外存的數據是不同的(不一致的)。Oracle處理INSERT或DELETE語句的步驟與處理 UP DATE語句的步驟大體相同。注意:有關回滾數據在本書的后面章節中還要介紹,讀者也可以參閱筆者的另一本書從實踐中學習 Oracle/SQL一書12.20節的258259頁。1.16 大池(large pool )和 Java 池(Java pool)除了以上所介紹的內存結構之外,SGA中還有可能包含
36、large pool和Java pool兩個可選的內存結構。弓I入large pool的主要目的應該是提高效率。large pool是一個相對比較簡單的內存結構,與shared pool不同的是它沒有 LRU隊列。在多線程(MTS )或共享服務器(shared server) 連接時,Oracle服務器進程的 PGA的大部分區域(也叫UGA )將放入large pool (stack space 除外)。另外在大規模I/O及備份和恢復操作時可能使用該區。可以通過設置參數LARGEPOOL_SIZE 的值來配置large pool的大小。該參數也是一個動態參數。弓I入Java pool的目的是能
37、夠編譯 Java語言的命令。如果要使用Java語言就必須設置Java pool。Java語言在Oracle數據庫中的存儲與 PL/SQL語言幾乎完全相同。可以通過設 置參數JAVA POO L_SIZE 的值來配置Java pool的大小。其數字的單位是字節(bytes)。在Oracle 9i中Java pool的默認大小為 24MB。1.17內存緩沖區大小的設定在Oracle 9i之前的版本中,只能通過設置初始化參數文件中的一些參數來間接地設置SGA 的大小,女0 DB_BLOCK_BUFFERS 、LOG_BUFFER、SHARED_POOL_SIZE 等。而 且所有的這些參數都是靜態的,
38、即當修改完初始化參數文件中這些參數的值之后必須重新 啟動Oracle數據庫。在Oracle 9i以后的版本中,SGA為動態的。SGA中的內存緩沖區,如數據庫高速緩 沖區(database buffer cache)和共享池(shared pool)等都可以動態地增加和減少。Oracle是利用所謂的區組(granule)來管理SGA的內存的。區組(granule)就是一片連續的虛擬 內存區。區組是 Oracle分配和回收內存區的基本單位。區組的大小取決于所估計的 SGA的大小。如果SGA的尺寸小于128MB ,區組的大小就 是4MB。如果SGA的尺寸大于或等于128MB,區組的大小就為16MB。
39、Oracle數據庫一旦 啟動,SGA中的每個內存緩沖區就會獲得所需的區組。SGA中至少包括3個區組:一個是SGA固定區(其中包含了重做日志緩沖區);一個是數據庫高速緩沖區;一個是共享池。Oracle數據庫管理員可通過 ALTER SYSTEM SET命令來分配和回收區組。但總的內 存大小不能超過參數 SGA MAX SIZE所設定的值。該參數的單位是字節。動態分配和回收內存的最大好處是在調整內存緩沖區大小時不需要重新啟動數據庫。 這一點對那些24小時運營7天營業的商業數據庫是至關重要的。1.18內存緩沖區信息的獲取可以使用例1-6的命令來獲得參數 SGA MAX SIZE的值:例1-6SQL
40、show p arameter另外也可以使用例1-7的命令來獲該命令將顯示出參數文件中可以設置的全部參數。 得SGA的相關信息:例1-7SQL show sgaTotal System Global AreaFixed Size453432Variable Size12275589671303168bytesbytesbytesDatabase BuffersRedo Buffers50331648bytes667648bytes也可以先使用例1-8和例1-9的SQL*Plus命令來格式化顯示輸出:例1-8SQL col name for a20例1-9SQL col value for a2
41、5之后,利用數據字典v$parameter使用例1-10的SQL查詢語句來獲得參數SGA MAX SIZE 的值:例 1-10SQL select name, type, value2 from v$p arameter3 where name = sga_max_size;NAMETYPE VALUEsga_max_size6122755896Oracle的主要后臺介紹完了 SGA的各個部分內存緩沖區之后,下面開始詳細地討論 進程。1.19 重做日志寫進程(LGWR )及快速提交(fast commit)負責將重做日志緩沖區的記錄順序地寫到重做 的操作原理,在這里先介紹一下Oracle提交重
42、做日志寫進程 (LOG writer , LGWR ) 日志文件中。為了更好地理解LOG writer(commit)語句是如何工作的。(fast commit)的技術,該技術既能保證 Oracle Oracle系統 (tra nsact ion)Oracle服務器是使用了一種稱為快速提交系統的效率又能保證在系統崩潰的情況下所有提交的數據可以得到恢復。為此 引入了系統變化數(system change number, SCN)。無論任何時候只要某個事務 被提交,Oracle服務器都將產生一個 SCN (號碼)并將其賦予該事務的所有數據行。在同 一個數據庫中SCN是單調遞增的并且是惟一的。為了避
43、免在進行一致性檢驗時操作系統時 鐘可能引發的問題,Oracle服務器將SCN作為Oracle的內部時間戳來保證數據文件中的數 據的同步和數據的讀一致性。當在SQL*Plus中發了 commit語句之后,Oracle的內部操作步驟如下:SCN (號碼)一起寫入重做日志緩沖(1)服務器進程將把提交的記錄連同所產生的區中。(2)重做日志寫進程(LGWR )將把重做日志緩沖區中一直到所提交的記錄(包括該記錄)的所有記錄連續地寫到重做日志文件中。在此之后,Oracle服務器就可以保證即使在系統崩潰的情況下所有提交的數據也可以得到恢復。(3)Oracle通知用戶(進程)提交已經完成。(4)服務器進程將修改
44、數據庫高速緩沖區中的相關數據的狀態并釋放資源和打開 鎖等。此時可能這些數據并未被寫到數據文件中,這時這些數據緩沖區被標為臟緩沖區,因 為相同的數據在內外存中為不同的版本。數據庫高速緩沖區中的數據是由DBWR寫到數據文件中的。曾有不少學生問過這樣一個問題:“為什么不同時寫兩個數據文件呢?”Oracle的這種解決方案的最大好處是在保證不丟失數據的同時數據庫的效率不會受到很大影響。因為 重做日志文件中的記錄是以最緊湊的格式存放的,所以它的I/O量要比對數據文件的操作少得多。另外LGWR是順序地將重做日志緩沖區中的記錄寫到重做日志文件中的,這樣其I/O速度要比將數據塊寫到數據文件中快得多。重做日志寫進
45、程(LGWR )要在下列情況下將重做日志緩沖區的記錄(內存)順序地 寫到重做日志文件(外存)中:當某個事務被提交時。1MB )時。1/3。當重做日志緩沖區中變化的記錄超過一兆字節(當重做日志緩沖區中所存的記錄已超過緩沖區容量的 在DBWR將數據庫高速緩沖區中修改過的數據塊寫到數據文件之前。每3秒鐘。因為在進行數據庫恢復時需要重做日志數據,所以重做日志寫進程(LGWR )只有在重做日志數據寫到重做日志文件(磁盤)上時才能確定提交已經完成。在Oracle &之前的版本中,重做日志數據的惟一目的和用處就是數據庫恢復。Oracle在Oracle &的版本中引入了一個叫做重做日志挖掘器(logminer
46、)的工具。該工具可以將重做日志文件或歸檔重做日志文件中的數據轉換成用戶能理解的正文信息。在Oracle &中,該工具只有命令行操作方式。Oracle 9i加強了此工具的功能并引入了一個稱為日志挖掘瀏覽器(logminer viewer )的圖形界面。1.20 數據庫寫進程(DBWR/DBWn )/輸出(I/O)。因此為了提在本章開始時曾介紹過數據庫的典型操作就是大規模的輸入 高Oracle系統的效率,一要減少I/O量,這可能是Oracle引入LGWR的原因之一;二要減 少I/O次數,這可能是 Oracle引入數據庫寫進程(DBWR/DBWn )的主要原因。提示:在Oracle的英文書中有些將“
47、數據庫寫進程”用DBWR表示,有些將它用 DBWn表示。這是因為在一個 Oracle實例中可以啟動多個數據庫寫進程,特別是在要進行大規模輸 入/輸出并且運行在多 CPU計算機上的Oracle數據庫系統。Oracle允許在一個實例上最多 啟動10個數據庫寫進程,它們分別是DBW0DBW9。數據庫寫進程負責將數據庫高速緩沖區中的臟緩沖區中的數據寫到數據文件上。為了 提高效率,數據庫寫進程并不是數據庫高速緩沖區中的數據一有變化就寫數據文件,而是 積累了足夠多的數據一次寫一大批內存數據塊到數據文件上。數據庫寫進程將在下列事件之一發生時把數據庫高速緩沖區中的數據寫到數據文 件上:當臟緩沖區的數量超過了所
48、設定的限額。當所設定的時間間隔已到。當有進程需要數據庫高速緩沖區而卻找不到空閑的緩沖區時。當校驗點發生時。當某個表被刪除(drop)或被截斷(truncate)時。 當某個表空間被設置為只讀狀態(read only)時。當使用類似于 ALTER TABLES PACE users BEGIN BACKU P的命令對某個表空間進行聯機備份時。當某個臨時表空間被設置為只脫機狀態(offline )或正常狀態(normal)時等。1.21系統監督進程(SMON )從前面的論述中可以知道,由于某種原因Oracle系統崩潰了(如斷電),SGA中任何沒有來得及寫到磁盤中的信息都將丟失,如有些已經提交的數據
49、還沒有真正地被寫到數據 文件中時就會丟失。在這種情況下,當數據庫重新開啟時,系統監督進程(SMON )將自動地執行Oracle實例的恢復工作。其步驟如下:(1)執行前滾(roll forward ),即將已經寫到重做日志文件中但還沒寫到數據文件中 的提交數據寫到數據文件中( Oracle是用SCN號碼來識別提交記錄的)。這時在數(2 )在前滾完成后立即打開數據庫,此時用戶就可以登錄并使用數據庫了。據文件中可能還有一些沒有提交的數據。之所以這樣安排主要是為了提高系統的效率。(3)回滾沒有提交的事務(數據)。除了 SMON進程之外,服務器(server)進程也 可能進行回滾沒有提交的事務,但該進程
50、只回滾它所用到的加鎖的數據行。除此之外,SMON進程還要執行如下的磁盤空間的維護工作:回收或組合數據文件中相連的空閑區。釋放臨時段(在執行 SQL語句時用作排序的磁盤區),將它們還給數據文件以作 為空閑區使用。1.22 進程監督進程(PMON )當某個進程崩潰時(如在沒有正常退出 Oracle的情況下重新啟動了所用的PC),進程監督進程(PMON )將負責它的清理工作。PMON進程將負責進行如下的清理工作:回滾用戶當前的事務。釋放用戶所加的所有表一級和行一級的鎖。 釋放用戶所有的其他資源等。1.23 校驗點(check point)和校驗點進程Oracle系統為了提高系統的效率和數據庫的一致性
51、,引入了一個稱為校驗點的事件。該事件是在當DBWR進程把在SGA中所有已經改變了的數據庫高速緩沖區中的數據(包 括提交的和沒提交的數據)寫到數據文件上時產生。從理論上講校驗點(check poi nt)和校驗點進程可以完全不需要,因為Oracle系統利用重做日志數據和SCN號是能夠保證數據庫的完全恢復的。引入校驗點可能是為了提高系統的效率。因為所有到校驗點為止的變化了 的數據都已寫到了數據文件中,在實例恢復時校驗點之前的重做日志記錄已經不再需要, 這樣實例恢復速度就加快了。寫入所有相SCN號在校驗點事件發生時,Oracle要將校驗點號碼(Oracle系統自動產生的)關的數據文件的文件頭中。還要
52、將校驗點號碼、重做日志序列號、歸檔日志名字和 都寫入控制文件中。Oracle系統盡管經常產生校驗點可以加快實例恢復的速度,但是由于在產生校驗點時 要進行大量的I/O操作,所以過于頻繁地產生校驗點會使數據庫正常的聯機操作受到沖擊。 最后數據庫管理員要在實例恢復的速度和聯機操作之間進行折衷。一般的生產或商業數據 庫的校驗點間隔是在半小時以上。1.24 歸檔日志(ARCH/ARCn )進程以上5個后臺進程都是必需的,即它們中的任何一個停止后實例自動關閉。在可選后 臺進程中,歸檔日志(ARCH/ARCn )進程可能是最重要的一個可選后臺進程,因為如果 Oracle數據庫的數據文件丟失或損壞,一般數據庫要進行完全恢復,Oracle數據庫應運行在歸檔方式。在Oracle數據庫中,重做日志文件被劃分為若干個組。當一組重做日志的文件被寫滿 后,Oracle就開始寫下一組重做日志,這被稱為日志切換。切換是以循環的方式進行的, 即當最后一組寫滿后,又開始寫第一組。因此如果只有重做日志文件,即Oracle數據庫運行在非歸檔方式下,當遇到數據文件丟失或損壞時,Oracle系統很難保證完全恢復數據庫中的數據。因為此時所需的重做記錄可能因重做日志循環使用而被覆蓋掉了。Oracle系統確保在一組Oracle數據
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年安徽省中考歷史試卷真題及答案詳解(精校打印版)
- 中小學心理健康教育與學生心理健康素養提升論文
- 中學語文“思辨性閱讀與表達”教學策略與傳統文化教育的融合論文
- 艾弗格公司管理制度
- 苗圃地冬季管理制度
- 茶油樹基地管理制度
- 融入數字孿生的中職智慧園林學習空間構建與應用
- 管理學谷歌案例分析
- 視覺感知汽車領域應用分析
- 自動控制原理課程設計 (一)
- 概率論與數理統計(哈爾濱工程大學)-知到答案、智慧樹答案
- 2024年陜西水務發展集團有限公司招聘筆試沖刺題(帶答案解析)
- 中國哲學經典著作導讀智慧樹知到期末考試答案章節答案2024年西安交通大學
- MOOC 家庭與社區教育-南京師范大學 中國大學慕課答案
- 《醫療質量管理辦法》解讀
- 門診護士分診培訓課件
- 2024年湖南省普通高中學業水平考試數學試卷及答案
- 0-3歲兒童中醫健康管理課件
- 債權融資方式
- 地鐵線反恐安全培訓內容
- 《跨部門溝通與協調》課件
評論
0/150
提交評論