版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 HYPERLINK / 第1章Oracle的體系結構這一章的內容是比較枯燥的,但它是理解以后章節(jié)的基礎。假如有讀者在開始時有些內容沒有完全理解也不用太著急,能夠接著學習后面的內容,等使用了一段時刻Oracle系統(tǒng)之后,一些概念就變得容易理解了。1.1 Oracle引入復雜的體系結構的緣故數(shù)據(jù)庫治理系統(tǒng)引入特不復雜的內存和外存體系結構的要緊緣故是有效地治理稀有的系統(tǒng)資源。資源不足不只是數(shù)據(jù)庫治理系統(tǒng)所面對的。事實上,在我們五千年的人類進展歷史中,我們的祖先們一直在同資源不足作斗爭。歷史上糧食和土地等一直差不多上稀有資源,還記得我們的祖先們用什么方法來治理這些稀有資源的嗎?用戰(zhàn)爭,我們的先民們?yōu)?/p>
2、糧食而戰(zhàn),為土地而戰(zhàn);我們當代人類為石油而戰(zhàn),為市場而戰(zhàn),為金鈔票而戰(zhàn)。那么在Oracle數(shù)據(jù)庫中什么是稀有資源?它們又是如何來治理的呢?假如讀者接觸過數(shù)據(jù)庫或讀過相關的書,應該還有印象,數(shù)據(jù)庫的數(shù)據(jù)量和輸入/輸出量差不多上相當大的,而這些數(shù)據(jù)一般都存在硬盤(外存)上,因此硬盤為數(shù)據(jù)庫的一類資源。為了方便介紹, 圖1-1給出了硬盤的內部結構示意圖。圖 1-1表 1-1內 存外存(硬盤)數(shù)據(jù)訪問速度專門快專門慢存儲的數(shù)據(jù)臨時永久價鈔票專門貴相當廉價從表1-1的比較可知,內存的數(shù)據(jù)訪問速度要比外存(硬盤)快得多。這是因為內存的數(shù)據(jù)訪問是電子速度,而硬盤的數(shù)據(jù)訪問要緊取決于機械速度。也確實是講,假如
3、一個數(shù)據(jù)庫治理系統(tǒng)能夠使絕大多數(shù)(如90%以上)數(shù)據(jù)操作在內存中完成,那么這一數(shù)據(jù)庫治理系統(tǒng)的效率將特不高。然而由于內存中的數(shù)據(jù)在斷電或出現(xiàn)系統(tǒng)故障時會消逝,因此數(shù)據(jù)庫治理系統(tǒng)還必須保證,所有的數(shù)據(jù)改動都必須及時寫到硬盤上,以保障可不能丟失數(shù)據(jù);即使數(shù)據(jù)庫崩潰之后,所有提交過的數(shù)據(jù)都能得到完全恢復。盡管能夠通過加大內存來提高數(shù)據(jù)庫治理系統(tǒng)的效率,但在大多數(shù)情況下信息系統(tǒng)的開發(fā)和維護經(jīng)費差不多上有限的。通過以上的討論,讀者應該意識到,在數(shù)據(jù)庫治理系統(tǒng)中最寶貴的稀有資源是內存。為了高效地使用內存這種稀有資源,同時保證可不能丟失任何數(shù)據(jù)庫中的數(shù)據(jù),Oracle數(shù)據(jù)庫治理系統(tǒng)引入了一個特不復雜的體系結
4、構。1.2 Oracle數(shù)據(jù)庫中常用的術語為了講解容易,在詳細討論Oracle體系結構之前,先介紹一下相關的名詞和術語。在那個地點只給出有用的解釋,并不追求學術上的嚴謹。進程(process):一段在內存中正在運行的程序。假如沒有學過計算機操作系統(tǒng)相關課程,能夠把進程想象成能夠自動完成某些特定任務的任何東西,如訓練有素的狗狗、跑龍?zhí)椎牡?。后臺進程(background process):進程的一種,在內存中運行時,不占顯示,而且它的優(yōu)先級比前臺進程低。能夠只有一個前臺進程,但能夠有多個后臺進程。緩沖區(qū)(buffer):一段用來臨時存儲數(shù)據(jù)的內存區(qū)。主機(host):計算機系統(tǒng)的另一個稱呼。服務
5、器(server):一臺在網(wǎng)絡中向其他計算機系統(tǒng)提供一項或多項服務的主機??蛻魴C(client):一臺使用由服務器(server)提供服務的計算機系統(tǒng)。1.3 Oracle數(shù)據(jù)庫治理系統(tǒng)的體系結構為了能使Oracle數(shù)據(jù)庫治理系統(tǒng)滿足商業(yè)用戶的要求,Oracle引入了如圖1-2所示的復雜的體系結構。圖 1-2以上那個復雜的體系結構要緊包括Oracle服務器(server)(而服務器又是由Oracle實例(instance)和Oracle數(shù)據(jù)庫(database)組成),還包括一些其他的關鍵文件、用戶進程和服務器進程等。Oracle服務器(server)由Oracle實例(instance)和O
6、racle數(shù)據(jù)庫(database)兩大部分組成。它是一個數(shù)據(jù)庫治理系統(tǒng),提供了一致、開放和多樣的信息治理的方法和途徑。服務器中的一些結構并不在處理SQL語句時使用,它們是為了改進數(shù)據(jù)庫系統(tǒng)的效率或數(shù)據(jù)的恢復等而設計的。1.4 Oracle服務器(server)Oracle服務器(server)能夠有以下3種安裝方式。(1)基于主機方式:在此種配置下,用戶直接在安裝了數(shù)據(jù)庫的計算機上登錄Oracle數(shù)據(jù)庫。(2)客戶端-服務器(client-server)(兩層模型)方式:數(shù)據(jù)庫和客戶終端分不安裝在不同的計算機上,用戶通過網(wǎng)絡從個人計算機(客戶端)上訪問數(shù)據(jù)庫。(3)客戶端-應用服務器-服務器
7、(client- application server-server)(三層模型):用戶首先從自己的個人計算機登錄應用服務器,再通過應用服務器訪問真正的數(shù)據(jù)庫。1.5 Oracle實例(instance)Oracle實例(instance)是一種訪問數(shù)據(jù)庫的機制,它是由內存結構(SGA)和一些后臺進程(5個進程)組成的。它的內存結構也稱為系統(tǒng)全局區(qū)(system global area,SGA)。系統(tǒng)全局區(qū)是實例的最差不多的部件之一。實例的后臺進程中有5個是必需的,即這5個后臺進程中的任何一個沒有啟動,實例將自動關閉。這5個后臺進程分不是SMON、PMON、DBWR、LGWR和CKPT。在OC
8、P考題中有時可能會問哪些后臺進程是可選的?除了這5個差不多上可選的。實例一啟動就分配系統(tǒng)全局區(qū)和啟動所需的后臺進程。那個地點應該指出的是,每個實例只能操作一個數(shù)據(jù)庫,而且它不能夠操作其他的數(shù)據(jù)庫。然而反過來是不成立的,因為一個數(shù)據(jù)庫能夠同時被幾個實例操作(在Oracle集群中)。系統(tǒng)全局區(qū)(SGA)中包含了以下幾個內存結構:共享池(shared pool)、數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)、重做日志緩沖區(qū)(redo log buffer)和其他的一些結構(如鎖和統(tǒng)計數(shù)據(jù))等。1.6 Oracle數(shù)據(jù)庫Oracle數(shù)據(jù)庫是數(shù)據(jù)的一個集合,Oracle把這些數(shù)據(jù)作為一
9、個完整的單位來處理。Oracle數(shù)據(jù)庫也叫做物理(外存)結構,它為數(shù)據(jù)庫信息提供了真正的物理存儲,它是由以下3類操作系統(tǒng)文件組成的。(1)操縱文件(control files):包含了維護和校驗數(shù)據(jù)庫一致性所需的信息。(2)重做日志文件(redo log files):包含了當系統(tǒng)崩潰后進行恢復所需記錄的變化信息。(3)數(shù)據(jù)文件(data files):包含了數(shù)據(jù)庫中真正的數(shù)據(jù)。1.7 Oracle其他的關鍵文件除了以上3類數(shù)據(jù)庫文件之外,Oracle服務還需要其他的一些文件,這些文件不屬于數(shù)據(jù)庫。其中包括:初始化參數(shù)文件(parameter files):定義了實例的特性,如系統(tǒng)全局區(qū)中一些
10、內存結構的大小、DBWR的個數(shù)。密碼文件(password files):包含了數(shù)據(jù)庫治理員或操作員用戶在啟動和關閉實例時所需的密碼。盡管Oracle數(shù)據(jù)庫提供了相當完善的安全治理機制,然而在Oracle數(shù)據(jù)庫沒有開啟時如何驗證要啟動數(shù)據(jù)庫的人是真正的數(shù)據(jù)庫治理員或操作員呢?這確實是Oracle引入密碼文件的緣故。歸檔重做日志文件(archived redo log files):是重做日志文件的脫機備份。在系統(tǒng)崩潰后進行恢復時可能需要這些文件。1.8 建立與Oracle實例的連接Oracle實例(instance)是用Oracle的STARTUP命令啟動的(該命令將在后面的章節(jié)中詳細介紹)。
11、它的啟動就意味著SGA的所有內存結構都已生成,所有必需的后臺進程都已在內存中運行。那么現(xiàn)在用戶又是如何使用Oracle數(shù)據(jù)庫呢?用戶在向Oracle數(shù)據(jù)庫發(fā)出SQL命令之前必須與實例(instance)建立連接。用戶啟動一個工具如SQL*Plus,或運行一個利用Oracle工具開發(fā)的應用程序,如用Oracle Forms開發(fā)的應用程序時,那個工具或應用程序就被作為一個用戶進程來執(zhí)行。用戶進程是不能直接訪問數(shù)據(jù)庫的。在專用連接的情況下(也是默認),當一個用戶登錄Oracle服務器時(如在SQL*Plus的提示下輸入用戶名和密碼),假如登錄成功(即用戶名和密碼都準確無誤),Oracle就在服務器所
12、運行的計算機上創(chuàng)建一個服務器進程。在這種連接下,該服務器進程只能為那個用戶進程提供服務。用戶進程與服務器進程是一對一的關系。用戶進程向服務器進程發(fā)請求,服務器進程對數(shù)據(jù)庫進行實際的操作并把所得的結果返回給用戶進程。就看起來一個大富豪想炒股票,但又不明白股票市場的運作,因此他請了一位股票經(jīng)紀人。這位富豪就相當于用戶進程,而股票經(jīng)紀人就相當于服務器進程,股票市場就相當于Oracle數(shù)據(jù)庫。一個用戶每次登錄Oracle服務器,假如成功,該用戶就與Oracle服務器建立了連接,而這種連接又叫做會話。一個會話始于用戶成功地登錄Oracle服務器,終止于用戶退出或非正常終止連接。一個數(shù)據(jù)庫用戶可能同時有多
13、個會話存在,即用相同的用戶名和密碼同時登錄多次。1.9 各種不同的連接方式連接是用戶進程與Oracle服務器之間的通信路徑。與Oracle服務器(server)的3種安裝方式相對應,一個數(shù)據(jù)庫用戶可能用以下3種方式之一與Oracle服務器連接。(1)基于主機方式:現(xiàn)在的用戶進程與服務器進程是在同一臺計算機的相同的操作系統(tǒng)上的,用戶進程與Oracle服務器之間的通信路徑是通過操作系統(tǒng)內部進程通信(inter process communication,IPC)機制來建立的。(2)客戶端-服務器(client-server)(兩層模型)方式:用戶進程與Oracle服務器之間的通信是通過網(wǎng)絡協(xié)議(如
14、TCP/IP)來完成的。(3)客戶端-應用服務器-服務器(client- application server- server)(三層模型):用戶的個人計算機通過網(wǎng)絡與應用服務器或網(wǎng)絡服務器通信,而那個應用服務器或網(wǎng)絡服務器又是通過網(wǎng)絡與運行數(shù)據(jù)庫的計算機相連的。例如,用戶使用掃瞄器通過網(wǎng)絡運行NT服務器上的應用程序,而NT服務器又從運行在UNIX主機上的Oracle數(shù)據(jù)庫中提取數(shù)據(jù)。以上所介紹的連接是用戶進程與服務器進程的一對一的連接,也稱為專用服務器連接(dedicated server connection)。除了這種連接外,在聯(lián)機事務處理(online transaction proc
15、essing,OLTP)系統(tǒng)的配置時還有另外的一種連接,它在Oracle9i之前的版本中稱為多線程(MTS)連接,在Oracle 9i或以后的版本中稱為共享服務器(shared server)連接。有關這種連接在Oracle的網(wǎng)絡和調優(yōu)的書籍中介紹。1.10 服務器進程當Oracle創(chuàng)建一個服務器進程的同時要為該服務器進程分配一個內存區(qū),那個內存區(qū)稱為程序全局區(qū)(program global area,PGA)。與SGA不同,PGA是一個私有的內存區(qū),是不能共享的,是只屬于一個進程的。它隨著進程的創(chuàng)建而被分配,隨著進程的終止而被回收。在專用服務器進程的配置情況下,程序全局區(qū)包括了以下結構:(1
16、)排序區(qū)(sort area):用于處理SQL語句所需的排序。(2)游標狀態(tài)區(qū)(cursor state):用于指示會話當前所使用的SQL語句的處理狀態(tài)。(3)會話信息區(qū)(session information):包括了會話的用戶權限和優(yōu)化統(tǒng)計信息。(4)堆棧區(qū)(stack space):包括了其他的會話變量。假如是共享服務器進程或多線程的配置,以上這些結構除了堆棧區(qū)外大部分將存在SGA中。假如有l(wèi)arge pool,它們就會被存在large pool,否則它們就會被存在共享池中。1.11 Oracle執(zhí)行SQL查詢語句的步驟編譯(parse):在進行編譯時,服務器進程會將SQL語句的正文放入
17、共享池(shared pool)的庫高速緩存(library cache)中并將完成以下處理:首先在共享池中搜索是否有相同的SQL語句(正文),假如沒有就進行后續(xù)的處理。檢查該SQL語句的語法是否正確。通過查看數(shù)據(jù)字典來檢查表和列的定義。對所操作的對象加編譯鎖(parse locks)以便在編譯語句期間這些對象的定義不能被改變。檢查所引用對象的用戶權限。生成執(zhí)行該SQL語句所需的優(yōu)化的執(zhí)行打算(執(zhí)行步驟)。將SQL語句和執(zhí)行打算裝入共享的SQL區(qū)。以上的每一步操作差不多上在處理正確時才進行后續(xù)的處理。假如不正確,就返回錯誤。執(zhí)行(execute):Oracle服務器進程開始執(zhí)行SQL語句是因為
18、它已獲得了執(zhí)行SQL語句所需的全部資源和信息。提取數(shù)據(jù)(fetch):Oracle服務器進程選擇所需的數(shù)據(jù)行,并在需要時將其排序,最后將結果返回給用戶(進程)。1.12 共享池(shared pool)SGA中的共享池(shared pool)是由庫高速緩存(library cache)和數(shù)據(jù)字典高速緩存(data dictionary cache)兩部分所組成。服務器進程將SQL(也可能是PL/SQL)語句的正文和編譯后的代碼(parsed code)以及執(zhí)行打算都放在共享池(shared pool)的庫高速緩存中。在進行編譯時,服務器進程首先會在共享池中搜索是否有相同的SQL或PL/SQL
19、語句(正文),假如有就不進行任何后續(xù)的編譯處理,而是直接使用已存在的編譯后的代碼和執(zhí)行打算。提示:庫高速緩存包含了共享SQL區(qū)和共享PL/SQL區(qū)兩部分,它們分不存放SQL和PL/SQL語句以及相關的信息。要想共享SQL或PL/SQL語句,第一,庫高速緩存(library cache)要足夠大,因為只有如此要共享的SQL或PL/SQL語句才可不能專門快地淘汰出內存。第二,SQL或PL/SQL語句要是能共享的通用代碼(generic code),因為Oracle是通過比較SQL或PL/SQL語句的正文來決定兩個語句是否相同的,只有當兩個語句的正文完全相同時Oracle才重用已存在的編譯后的代碼和
20、執(zhí)行打算。那個地點通過以下的實例來進一步解釋這一點。讀者猜如下的兩個SQL語句是否相同?select * from emp where sal = 1500; 和select * from emp where sal = 1501;答案是不相同的(在Oracle默認的配置下,Oracle 8i和Oracle 9i以及更高的版本能夠通過重新設置CURSOR_SHARING參數(shù)來修改默認配置,有興趣的讀者可參閱Oracle調優(yōu)方面的書籍)。能夠通過使用綁定變量的方式來重寫以上的SQL語句,如下:select * from emp where sal = &v_sal;那個語句確實是能夠共享的通用代
21、碼,因為變量不是在編譯時期而是在運行時期賦值的。引入庫高速緩存(library cache)的目的是共享SQL或PL/SQL代碼。那么Oracle又是如何樣有效地治理庫高速緩存(library cache)的呢?Oracle是使用一個稱為LRU(least recently used)的隊列(list)或算法(algorithm)來實現(xiàn)對庫高速緩存的治理的。LRU隊列的算法大致如下:剛使用的內存塊(的地址)放在LRU隊列的頭上(最前面),當一個服務器進從以上的討論可知,為了能夠共享SQL或PL/SQL的代碼,庫高速緩存要足夠大,因為如此那些能夠共享的SQL或PL/SQL代碼才可不能被專門快地淘
22、汰出內存。只是Oracle并沒有給出直接設置庫高速緩存大小的方法,只能通過設置共享池的大小來間接地設置庫高速緩存的大小。介紹完了庫高速緩存,接下來將介紹數(shù)據(jù)字典高速緩存(data dictionary cache)。當Oracle在執(zhí)行SQL語句時,服務器進程將把數(shù)據(jù)文件、表、索引、列、用戶和其他的數(shù)據(jù)對象的定義和權限的信息放入數(shù)據(jù)字典高速緩存。假如在這之后,有進程(用戶)需要同樣的信息,如表和列的定義,那么所有的這些信息將從數(shù)據(jù)字典高速緩存中獲得。因為以上所講的這些信息差不多上存在Oracle數(shù)據(jù)庫的數(shù)據(jù)字典中,這也可能確實是該部分內存叫做數(shù)據(jù)字典高速緩存的緣故。表和列的定義等重用的機會要比
23、SQL語句大,因此為了能達到共享這些信息的目的,數(shù)據(jù)字典高速緩存應該盡可能設置得大一些。只是與庫高速緩存一樣,Oracle并沒有給出直接設置數(shù)據(jù)字典高速緩存大小的方法,只能通過設置共享池的大小來間接地設置數(shù)據(jù)字典高速緩存的大小。在Oracle9i之前的版本,能夠通過修改參數(shù)文件中的SHARED_POOL_ SIZE的值來改變共享池的大小,但一定要重新啟動Oracle數(shù)據(jù)庫。在Oracle 9i或以后的版本中,也能夠使用類似于例1-1的命令來改變共享池的大小:例1-1SQL ALTER SYSTEM SET SHARED_POOL_SIZE = 32M;系統(tǒng)已更改。然而所改變共享池的大小受限于S
24、GA_MAX_SIZE參數(shù)。那個參數(shù)將在以后的章節(jié)中詳細地介紹。注意:在本書中采納如下的約定:SQL為SQL*Plus的提示符。沒有陰影的內容為要輸入的SQL語句或SQL*Plus命令等。如在例1-1中要輸入ALTER SYSTEM SET SHARED_POOL_SIZE = 32M;。陰影中的內容為系統(tǒng)顯示(輸出)的結果。如在例1-1中的“系統(tǒng)已更改。”。提示:即使把共享池設置得足夠大同時所使用的SQL或PL/SQL語句也是能共享的代碼,Oracle也并不能一定使用內存(共享池)中的代碼。例如當有用戶修改了某個對象的定義之后,所有使用那個對象的內存(共享池)中的代碼全部被Oracle設置為
25、無效,因此在使用時必須重新編譯。1.13 數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)-和庫高速緩存(libarary cache)不一樣假如用戶發(fā)出了以下的SQL語句:SELECT * FROM emp,Oracle又是如何樣提取數(shù)據(jù)庫中的數(shù)據(jù)呢?服務器進程將首先在數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)中搜尋所需的數(shù)據(jù),假如找到了就直接使用而不進行磁盤操作,假如沒找到就將進行磁盤操作把數(shù)據(jù)文件中的數(shù)據(jù)讀入到數(shù)據(jù)庫高速緩沖區(qū)中。從以上的討論可知,為了能夠共享數(shù)據(jù)庫中的數(shù)據(jù),數(shù)據(jù)庫高速緩沖區(qū)要足夠的大,因為如此那些能夠共享的數(shù)據(jù)才可不能被專門快地淘汰出內
26、存。Oracle也是使用一個叫做LRU(least recently used)的隊列(list)或算法(algorithm)來實現(xiàn)對數(shù)據(jù)庫高速緩沖區(qū)的治理。能夠使用參數(shù)文件中的DB_BLOCK_SIZE和DB_BLOCK_BUFFERS兩個參數(shù)來設置數(shù)據(jù)庫高速緩沖區(qū)的大小。其中DB_BLOCK_SIZE為Oracle數(shù)據(jù)塊(內存緩沖區(qū))的大小,在Oracle數(shù)據(jù)庫中內存和外存的數(shù)據(jù)塊的大小是相同的。DB_BLOCK_BUFFERS為內存緩沖區(qū)的個數(shù)。數(shù)據(jù)庫高速緩沖區(qū)大小為這兩個參數(shù)的乘積。然而DB_BLOCK_SIZE的值是在創(chuàng)建數(shù)據(jù)庫時設定的,假如要改變該參數(shù)的值一般需要重建數(shù)據(jù)庫。因此多
27、數(shù)情況下只能通過改變DB_BLOCK_BUFFERS的值來調整數(shù)據(jù)庫高速緩沖區(qū)大小。但一定得重新啟動Oracle數(shù)據(jù)庫。在Oracle 9i或以后的版本中,Oracle引入了另一個參數(shù)DB_CACHE_SIZE,那個參數(shù)是一個動態(tài)參數(shù),即能夠在數(shù)據(jù)庫運行時動態(tài)地改變該參數(shù)。能夠使用類似于 例1-2的命令來改變數(shù)據(jù)庫高速緩沖區(qū)的大?。豪?-2SQL ALTER SYSTEM SET DB_CACHE_SIZE = 48M;系統(tǒng)已更改。1.14 內存緩沖區(qū)顧問(v$db_cache_advice)Oracle 9i或以后的版本還提供了一個稱為內存緩沖區(qū)顧問(v$db_cache_advice)的工
28、具來關心獲得調整數(shù)據(jù)庫高速緩沖區(qū)的統(tǒng)計信息。內存緩沖區(qū)顧問一共有3種狀態(tài):(1)ON:該工具打開,為該工具分配內存并進行統(tǒng)計信息的收集。要有一定的內存和CPU開銷。(2)READY:該工具關閉,為該工具分配內存但不進行統(tǒng)計信息的收集,因此沒有CPU的開銷。(3)OFF:該工具關閉,不為該工具分配內存也不進行統(tǒng)計信息的收集,因此既沒有內存的開銷也沒有CPU開銷。能夠通過修改初始化參數(shù)DB_CACHE_ADVICE的值來改變該工具的狀態(tài)。這一參數(shù)是一個動態(tài)參數(shù),因此能夠使用ALTER SYSTEM命令來修改。例如能夠利用類似于例1-3的SQL語句來查看它的狀態(tài):例1-3SQL select id,
29、 name, block_size, advice_status 2 from v$db_cache_advice; ID NAME BLOCK_SIZE ADV - - - - 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON 已選擇20行。 現(xiàn)在,例1-3的顯示結果表明了內存緩沖區(qū)顧問是在開啟狀態(tài)。提示:顯示結果中的表示省略了一些行的顯示。之后能夠使用類似于例1-4的命令將內存緩沖區(qū)顧問(v$db_cache_advice)工具關閉:例1-4SQL alter
30、system set db_cache_advice = off;系統(tǒng)已更改。這時能夠再使用類似于例1-5的SQL語句來查看它的狀態(tài):例1-5SQL select id, name, block_size, advice_status 2 from v$db_cache_advice; ID NAME BLOCK_SIZE ADV- - - - 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF 已選擇20行。 現(xiàn)在,例1-5的顯示結果表明已成功地關閉了內存
31、緩沖區(qū)顧問(詳細地介紹該工具的使用已超出了本書的范圍,有興趣的讀者可參閱Oracle 9i/10g調優(yōu)方面的書籍)。1.15 重做日志緩沖區(qū)(redo log buffer)從理論上來講,假如數(shù)據(jù)庫可不能崩潰,全然沒有必要引入重做日志緩沖區(qū)(redo log buffer)。引入重做日志緩沖區(qū)的要緊目的(在Oracle 8i之前的版本中也是惟一的目的)確實是數(shù)據(jù)的恢復。Oracle在使用任何DML或DDL操作改變數(shù)據(jù)之前都將恢復所需的信息,即在寫數(shù)據(jù)庫高速緩沖區(qū)之前,先寫入重做日志緩沖區(qū)。與執(zhí)行查詢語句有所不同,Oracle在執(zhí)行DML語句時只有編譯(parse)和執(zhí)行(execute)兩個時
32、期(P15頁DQL)。以下是Oracle執(zhí)行UPDATE語句的步驟:(1)假如數(shù)據(jù)和回滾數(shù)據(jù)不在數(shù)據(jù)庫高速緩沖區(qū)中,Oracle服務器進程將把它們從數(shù)據(jù)文件中讀到數(shù)據(jù)庫高速緩沖區(qū)中。(2)Oracle服務器進程在要修改的數(shù)據(jù)行上加鎖(行一級的鎖)。(3)Oracle服務器進程將數(shù)據(jù)的變化信息和回滾所需的信息都記錄在重做日志緩沖 區(qū)中。(4)Oracle服務器進程將回滾所需的原始值和對數(shù)據(jù)所做的修改都寫入數(shù)據(jù)庫高速 緩沖區(qū)(database buffer cache)。之后在數(shù)據(jù)庫高速緩沖區(qū)中所有的這些數(shù)據(jù)塊都將被標為臟緩沖區(qū),因為現(xiàn)在內外存的數(shù)據(jù)是不同的(不一致的)。Oracle處理INSER
33、T或DELETE語句的步驟與處理UPDATE語句的步驟大體相同。注意:有關回滾數(shù)據(jù)在本書的后面章節(jié)中還要介紹,讀者也能夠參閱筆者的另一本書從實踐中學習Oracle/SQL一書12.20節(jié)的258259頁。1.16 大型池(large pool)和Java池(Java pool)除了以上所介紹的內存結構之外,SGA中還有可能包含large pool和Java pool兩個可選的內存結構。引入large pool的要緊目的應該是提高效率。large pool是一個相對比較簡單的內存結構,與shared pool不同的是它沒有LRU隊列。在多線程(MTS)或共享服務器(shared server)連
34、接時,Oracle服務器進程的PGA的大部分區(qū)域(也叫UGA)將放入large pool(stack space 除外)。另外在大規(guī)模I/O及備份和恢復操作時可能使用該區(qū)。能夠通過設置參數(shù)LARGE_POOL_SIZE的值來配置large pool的大小。該參數(shù)也是一個動態(tài)參數(shù)。引入Java pool的目的是能夠編譯Java語言的命令。假如要使用Java語言就必須設置Java pool。Java語言在Oracle數(shù)據(jù)庫中的存儲與PL/SQL語言幾乎完全相同。能夠通過設置參數(shù)JAVA_POOL_SIZE的值來配置Java pool的大小。其數(shù)字的單位是字節(jié)(bytes)。在Oracle 9i中J
35、ava pool的默認大小為24MB。1.17 內存緩沖區(qū)大小的設定在Oracle 9i之前的版本中,只能通過設置初始化參數(shù)文件中的一些參數(shù)來間接地設置SGA的大小,如DB_BLOCK_BUFFERS、LOG_BUFFER、SHARED_POOL_SIZE等。而且所有的這些參數(shù)差不多上靜態(tài)的,即當修改完初始化參數(shù)文件中這些參數(shù)的值之后必須重新啟動Oracle數(shù)據(jù)庫。在Oracle9i以后的版本中,SGA為動態(tài)的。SGA中的內存緩沖區(qū),如數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)和共享池(shared pool)等都能夠動態(tài)地增加和減少。Oracle是利用所謂的區(qū)組(gran
36、ule)來治理SGA的內存的。區(qū)組(granule)確實是一片連續(xù)的虛擬內存區(qū)。區(qū)組是Oracle分配和回收內存區(qū)的差不多單位。Oracle數(shù)據(jù)庫治理員可通過ALTER SYSTEM SET命令來分配和回收區(qū)組。但總的內存大小不能超過參數(shù)SGA_MAX_SIZE所設定的值。該參數(shù)的單位是字節(jié)。動態(tài)分配和回收內存的最大好處是在調整內存緩沖區(qū)大小時不需要重新啟動數(shù)據(jù)庫。這一點對那些24小時運營7天營業(yè)的商業(yè)數(shù)據(jù)庫是至關重要的。1.18 內存緩沖區(qū)信息的獵取能夠使用例1-6的命令來獲得參數(shù)SGA_MAX_SIZE的值:例1-6SQL show parameter該命令將顯示出參數(shù)文件中能夠設置的全部
37、參數(shù)。另外也能夠使用例1-7的命令來獲得SGA的相關信息:例1-7SQL show sgaTotal System Global Area 122755896bytesFixed Size 453432 bytesVariable Size 71303168 bytesDatabase Buffers 50331648 bytesRedo Buffers 667648 bytes也能夠先使用例1-8和例1-9的SQL*Plus命令來格式化顯示輸出:例1-8SQL col name for a20例1-9SQL col value for a25之后,利用數(shù)據(jù)字典v$parameter使用例1-
38、10的SQL查詢語句來獲得參數(shù)SGA_MAX_SIZE的值:例1-10SQL select name, type, value 2from v$parameter 3where name = sga_max_size;NAME TYPE VALUE - - -sga_max_size 6 122755896 介紹完了SGA的各個部分內存緩沖區(qū)之后,下面開始詳細地討論Oracle的要緊后臺進程。1.19 重做日志寫進程(LGWR)及快速提交(fast commit)重做日志寫進程(LOG writer,LGWR)負責將重做日志緩沖區(qū)的記錄順序地寫到重做日志文件中。為了更好地理解LOG write
39、r的操作原理,在那個地點先介紹一下Oracle提交(commit)語句是如何工作的。Oracle服務器是使用了一種稱為快速提交(fast commit)的技術,該技術既能保證Oracle系統(tǒng)的效率又能保證在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)能夠得到恢復。為此Oracle系統(tǒng)引入了系統(tǒng)變化數(shù)(system change number,SCN)。不管任何時候只要某個事務(transaction)被提交,Oracle服務器都將產生一個SCN(號碼)并將其給予該事務的所有數(shù)據(jù)行。在同一個數(shù)據(jù)庫中SCN是單調遞增的同時是惟一的。為了幸免在進行一致性檢驗時操作系統(tǒng)時鐘可能引發(fā)的問題,Oracle服務器將SCN
40、作為Oracle的內部時刻戳來保證數(shù)據(jù)文件中的數(shù)據(jù)的同步和數(shù)據(jù)的讀一致性。當在SQL*Plus中發(fā)了commit語句之后,Oracle的內部操作步驟如下:(1)服務器進程將把提交的記錄連同所產生的SCN(號碼)一起寫入重做日志緩沖區(qū)中。(2)重做日志寫進程(LGWR)將把重做日志緩沖區(qū)中一直到所提交的記錄(包括該記錄)的所有記錄連續(xù)地寫到重做日志文件中。在此之后,Oracle服務器就能夠保證即使在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)也能夠得到恢復。(3)Oracle通知用戶(進程)提交差不多完成。(4)服務器進程將修改數(shù)據(jù)庫高速緩沖區(qū)中的相關數(shù)據(jù)的狀態(tài)并釋放資源和打開 鎖等。現(xiàn)在可能這些數(shù)據(jù)并未被寫
41、到數(shù)據(jù)文件中,這時這些數(shù)據(jù)緩沖區(qū)被標為臟緩沖區(qū),因為相同的數(shù)據(jù)在內外存中為不同的版本。數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)是由DBWR寫到數(shù)據(jù)文件中的。曾有許多學生問過如此一個問題:“什么緣故不同時寫兩個數(shù)據(jù)文件呢?”O(jiān)racle的這種解決方案的最大好處是在保證不丟失數(shù)據(jù)的同時數(shù)據(jù)庫的效率可不能受到專門大阻礙。因為重做日志文件中的記錄是以最緊湊的格式存放的,因此它的I/O量要比對數(shù)據(jù)文件的操作少得多。另外LGWR是順序地將重做日志緩沖區(qū)中的記錄寫到重做日志文件中的,如此其I/O速度要比將數(shù)據(jù)塊寫到數(shù)據(jù)文件中快得多。重做日志寫進程(LGWR)要在下列情況下將重做日志緩沖區(qū)的記錄(內存)順序地寫到重做日志文件
42、(外存)中:當某個事務被提交時。當重做日志緩沖區(qū)中變化的記錄超過一兆字節(jié)(1MB)時。當重做日志緩沖區(qū)中所存的記錄已超過緩沖區(qū)容量的1/3。在DBWR將數(shù)據(jù)庫高速緩沖區(qū)中修改過的數(shù)據(jù)塊寫到數(shù)據(jù)文件之前。每3秒鐘。因為在進行數(shù)據(jù)庫恢復時需要重做日志數(shù)據(jù),因此重做日志寫進程(LGWR)只有在重做日志數(shù)據(jù)寫到重做日志文件(磁盤)上時才能確定提交差不多完成。在Oracle 8i之前的版本中,重做日志數(shù)據(jù)的惟一目的和用處確實是數(shù)據(jù)庫恢復。Oracle在Oracle 8i的版本中引入了一個叫做重做日志挖掘器(logminer)的工具。該工具能夠將重做日志文件或歸檔重做日志文件中的數(shù)據(jù)轉換成用戶能理解的正文
43、信息。在Oracle 8i中,該工具只有命令行操作方式。Oracle 9i加強了此工具的功能并引入了一個稱為日志挖掘掃瞄器(logminer viewer)的圖形界面。1.20 數(shù)據(jù)庫寫進程(DBWR/DBWn)在本章開始時曾介紹過數(shù)據(jù)庫的典型操作確實是大規(guī)模的輸入/輸出(I/O)。因此為了提高Oracle系統(tǒng)的效率,一要減少I/O量,這可能是Oracle引入LGWR的緣故之一;二要減少I/O次數(shù),這可能是Oracle引入數(shù)據(jù)庫寫進程(DBWR/DBWn)的要緊緣故。提示:在Oracle的英文書中有些將“數(shù)據(jù)庫寫進程”用DBWR表示,有些將它用DBWn表示。這是因為在一個Oracle實例中能夠
44、啟動多個數(shù)據(jù)庫寫進程,特不是在要進行大規(guī)模輸入/輸出同時運行在多CPU計算機上的Oracle數(shù)據(jù)庫系統(tǒng)。Oracle同意在一個實例上最多啟動10個數(shù)據(jù)庫寫進程,它們分不是DBW0DBW9。數(shù)據(jù)庫寫進程負責將數(shù)據(jù)庫高速緩沖區(qū)中的臟緩沖區(qū)中的數(shù)據(jù)寫到數(shù)據(jù)文件上。為了提高效率,數(shù)據(jù)庫寫進程并不是數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)一有變化就寫數(shù)據(jù)文件,而是積存了足夠多的數(shù)據(jù)一次寫一大批內存數(shù)據(jù)塊到數(shù)據(jù)文件上。數(shù)據(jù)庫寫進程將在下列事件之一發(fā)生時把數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)寫到數(shù)據(jù)文 件上:當臟緩沖區(qū)的數(shù)量超過了所設定的限額。當所設定的時刻間隔已到。當有進程需要數(shù)據(jù)庫高速緩沖區(qū)而卻找不到空閑的緩沖區(qū)時。當校驗點發(fā)生時
45、。當某個表被刪除(drop)或被截斷(truncate)時。當某個表空間被設置為只讀狀態(tài)(read only)時。當使用類似于ALTER TABLESPACE users BEGIN BACKUP的命令對某個表空間進行聯(lián)機備份時。當某個臨時表空間被設置為只脫機狀態(tài)(offline)或正常狀態(tài)(normal)時等。1.21 系統(tǒng)監(jiān)督進程(SMON)從前面的論述中能夠明白,由于某種緣故Oracle系統(tǒng)崩潰了(如斷電),SGA中任何沒有來得及寫到磁盤中的信息都將丟失,如有些差不多提交的數(shù)據(jù)還沒有真正地被寫到數(shù)據(jù)文件中時就會丟失。在這種情況下,當數(shù)據(jù)庫重新開啟時,系統(tǒng)監(jiān)督進程(SMON)將自動地執(zhí)行O
46、racle實例的恢復工作。其步驟如下:(1)執(zhí)行前滾(roll forward),立即差不多寫到重做日志文件中但還沒寫到數(shù)據(jù)文件中的提交數(shù)據(jù)寫到數(shù)據(jù)文件中(Oracle是用SCN號碼來識不提交記錄的)。(2)在前滾完成后立即打開數(shù)據(jù)庫,現(xiàn)在用戶就能夠登錄并使用數(shù)據(jù)庫了。這時在數(shù)據(jù)文件中可能還有一些沒有提交的數(shù)據(jù)。之因此如此安排要緊是為了提高系統(tǒng)的效率。(3)回滾沒有提交的事務(數(shù)據(jù))。除了SMON進程之外,服務器(server)進程也可能進行回滾沒有提交的事務,但該進程只回滾它所用到的加鎖的數(shù)據(jù)行。除此之外,SMON進程還要執(zhí)行如下的磁盤空間的維護工作:回收或組合數(shù)據(jù)文件中相連的空閑區(qū)。釋放臨
47、時段(在執(zhí)行SQL語句時用作排序的磁盤區(qū)),將它們還給數(shù)據(jù)文件以作為空閑區(qū)使用。1.22 進程監(jiān)督進程(PMON)當某個進程崩潰時(如在沒有正常退出Oracle的情況下重新啟動了所用的PC),進程監(jiān)督進程(PMON)將負責它的清理工作。PMON進程將負責進行如下的清理工作:回滾用戶當前的事務。釋放用戶所加的所有表一級和行一級的鎖。釋放用戶所有的其他資源等。1.23 校驗點(checkpoint)和校驗點進程Oracle系統(tǒng)為了提高系統(tǒng)的效率和數(shù)據(jù)庫的一致性,引入了一個稱為校驗點的事件。該事件是在當DBWR進程把在SGA中所有差不多改變了的數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)(包括提交的和沒提交的數(shù)據(jù))寫到
48、數(shù)據(jù)文件上時產生。從理論上講校驗點(checkpoint)和校驗點進程能夠完全不需要,因為Oracle系統(tǒng)利用重做日志數(shù)據(jù)和SCN號是能夠保證數(shù)據(jù)庫的完全恢復的。引入校驗點可能是為了提高系統(tǒng)的效率。因為所有到校驗點為止的變化了的數(shù)據(jù)都已寫到了數(shù)據(jù)文件中,在實例恢復時校驗點之前的重做日志記錄差不多不再需要,如此實例恢復速度就加快了。在校驗點事件發(fā)生時,Oracle要將校驗點號碼(Oracle系統(tǒng)自動產生的)寫入所有相關的數(shù)據(jù)文件的文件頭中。還要將校驗點號碼、重做日志序列號、歸檔日志名字和SCN號都寫入操縱文件中。盡管經(jīng)常產生校驗點能夠加快實例恢復的速度,然而由于在產生校驗點時Oracle系統(tǒng)要進
49、行大量的I/O操作,因此過于頻繁地產生校驗點會使數(shù)據(jù)庫正常的聯(lián)機操作受到?jīng)_擊。最后數(shù)據(jù)庫治理員要在實例恢復的速度和聯(lián)機操作之間進行折衷。一般的生產或商業(yè)數(shù)據(jù)庫的校驗點間隔是在半小時以上。1.24 歸檔日志(ARCH/ARCn)進程以上5個后臺進程差不多上必需的,即它們中的任何一個停止后實例自動關閉。在可選后臺進程中,歸檔日志(ARCH/ARCn)進程可能是最重要的一個可選后臺進程,因為假如Oracle數(shù)據(jù)庫的數(shù)據(jù)文件丟失或損壞,一般數(shù)據(jù)庫要進行完全恢復,Oracle數(shù)據(jù)庫應運行在歸檔方式。在Oracle數(shù)據(jù)庫中,重做日志文件被劃分為若干個組。當一組重做日志的文件被寫滿后,Oracle就開始寫下一組重做日志,這被稱為日志切換。切換是以循環(huán)的方式進行的,即當最后一組寫滿后,又開始寫第一組。因此假如只有重做日志文件,即Oracle數(shù)據(jù)庫運行在非歸檔方式下,當遇到數(shù)據(jù)文件丟失或損壞時,Oracle系統(tǒng)專門難保證完全恢復數(shù)據(jù)庫中的數(shù)據(jù)。因為現(xiàn)在所需的重做記錄可能因重做日志循環(huán)使用而被覆蓋掉了。在歸檔方式下,ARCn進程將把切換后的重做日志文件復制到歸檔日志文件。能夠把歸檔日志文件看成是重做日志文件的備份,但歸檔日志文件是脫機的,即除了在進行(復制)時,Oracle數(shù)據(jù)庫在正常運行時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 疫情期間解約合同范例
- 學校簽合同范例
- 買門面合同范例
- 食品超市商品代銷合同范例
- 信托購房合同范例
- 《奶牛基礎與管理》課件
- 合同范例修改條款
- 石渣銷售合同范例
- 企業(yè)合同范例封面
- 劃線機采購合同范例
- 2023年中考語文二輪復習:標點符號 真題練習題匯編(含答案解析)
- 偏身舞蹈癥的護理查房
- 《涵洞施工技術》課件
- 護理人才梯隊建設規(guī)劃方案
- 考試保密培訓課件教學
- 睡眠區(qū)布局設計打造舒適宜人的睡眠環(huán)境
- 2024年廣西玉林市自來水公司招聘筆試參考題庫含答案解析
- 天貓食品委托加工協(xié)議合同書x
- 露營基地項目投資計劃書
- 烹飪教師年度工作總結
- 制冷壓縮機安全操作規(guī)程范文
評論
0/150
提交評論