版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章
Oracle的體系結(jié)構(gòu)
這一章的內(nèi)容是比較枯燥的,但它是理解以后章節(jié)的基礎(chǔ)。如果有讀者在開(kāi)始時(shí)有些
內(nèi)容沒(méi)有完全理解也不用太著急,可以繼續(xù)學(xué)習(xí)后面的內(nèi)容,等使用了一段時(shí)間Oracle系
統(tǒng)之后,一些概念就變得容易理解了。
1.1Oracle引入復(fù)雜的體系結(jié)構(gòu)的原因
數(shù)據(jù)庫(kù)管理系統(tǒng)引入非常復(fù)雜的內(nèi)存和外存體系結(jié)構(gòu)的主要原因是有效地管理稀有的
系統(tǒng)資源。資源不足不只是數(shù)據(jù)庫(kù)管理系統(tǒng)所面對(duì)的。其實(shí),在我們五千年的人類(lèi)發(fā)展歷史
中,我們的祖先們一直在同資源不足作斗爭(zhēng)。歷史上糧食和土地等一直都是稀有資源,還記
得我們的祖先們用什么方法來(lái)管理這些稀有資源的嗎?用戰(zhàn)爭(zhēng),我們的先民們?yōu)榧Z食而戰(zhàn),
為土地而戰(zhàn);我們當(dāng)代人類(lèi)為石油而戰(zhàn),為市場(chǎng)而戰(zhàn),為金錢(qián)而戰(zhàn)。
那么在Oracle數(shù)據(jù)庫(kù)中什么是稀有資源?它們又是如何來(lái)管理的呢?如果讀者接觸過(guò)
數(shù)據(jù)庫(kù)或讀過(guò)相關(guān)的書(shū),應(yīng)該還有印象,數(shù)據(jù)庫(kù)的數(shù)據(jù)量和輸入/輸出量都是相當(dāng)大的,而
這些數(shù)據(jù)一般都存在硬盤(pán)(外存)上,因此硬盤(pán)為數(shù)據(jù)庫(kù)的一類(lèi)資源。為了方便介紹,
圖1-1給出了硬盤(pán)的內(nèi)部結(jié)構(gòu)示意圖。
圖1-1
從圖1-1可以看出,所有硬盤(pán)上數(shù)據(jù)的訪問(wèn)都是靠硬盤(pán)的旋轉(zhuǎn)和磁頭的移動(dòng)來(lái)完成的,
這種旋轉(zhuǎn)和移動(dòng)是機(jī)械運(yùn)動(dòng)。因?yàn)樵谟?jì)算機(jī)中所有數(shù)據(jù)的修改操作必須在內(nèi)存中進(jìn)行,所以
內(nèi)存也是數(shù)據(jù)庫(kù)的一類(lèi)資源。表1-1給出內(nèi)存和外存的簡(jiǎn)單比較以幫助讀者理解本書(shū)的內(nèi)容。
表1-1
內(nèi)存外存(硬盤(pán))
數(shù)據(jù)訪問(wèn)速度很快很慢
存儲(chǔ)的數(shù)據(jù)臨時(shí)永久
價(jià)錢(qián)很貴相當(dāng)便宜
從表1-1的比較可知,內(nèi)存的數(shù)據(jù)訪問(wèn)速度要比外存(硬盤(pán))快得多。這是因?yàn)閮?nèi)存
的數(shù)據(jù)訪問(wèn)是電子速度,而硬盤(pán)的數(shù)據(jù)訪問(wèn)主要取決于機(jī)械速度。也就是說(shuō),如果一個(gè)數(shù)
據(jù)庫(kù)管理系統(tǒng)能夠使絕大多數(shù)(如90%以上)數(shù)據(jù)操作在內(nèi)存中完成,那么這一數(shù)據(jù)庫(kù)管
理系統(tǒng)的效率將非常高.但是由于內(nèi)存中的數(shù)據(jù)在斷電或出現(xiàn)系統(tǒng)故障時(shí)會(huì)消失,所以數(shù)
據(jù)庫(kù)管理系統(tǒng)還必須保證,所有的數(shù)據(jù)改動(dòng)都必須及時(shí)寫(xiě)到硬盤(pán)上,以保障不會(huì)不失數(shù)據(jù);
即使數(shù)據(jù)庫(kù)崩潰之后,所有提交過(guò)的數(shù)據(jù)都能得到完全恢復(fù)。盡管可以通過(guò)加大內(nèi)存來(lái)提
高數(shù)據(jù)庫(kù)管理系統(tǒng)的效率,但在大多數(shù)情況下信息系統(tǒng)的開(kāi)發(fā)和維護(hù)經(jīng)費(fèi)都是有限的。
通過(guò)以上的討論,讀者應(yīng)該意識(shí)到,在數(shù)據(jù)庫(kù)管理系統(tǒng)中最寶貴的稀有資源是內(nèi)存。
為了高效地使用內(nèi)存這種稀有資源,同時(shí)保證不會(huì)丟失任何數(shù)據(jù)庫(kù)中的數(shù)據(jù),Oracle數(shù)據(jù)
庫(kù)管理系統(tǒng)引入了:個(gè)非常復(fù)雜的體系結(jié)構(gòu)。
1.2Oracle數(shù)據(jù)庫(kù)中常用的術(shù)語(yǔ)
為了講解容易,在詳細(xì)討論Oracle體系結(jié)構(gòu)之前,先介紹一下相關(guān)的名詞和術(shù)語(yǔ)。在
這里只給出實(shí)用的解釋?zhuān)⒉蛔非髮W(xué)術(shù)上的嚴(yán)謹(jǐn)。
進(jìn)程(process):一段在內(nèi)存中正在運(yùn)行的程序。如果沒(méi)有學(xué)過(guò)計(jì)算機(jī)操作
系統(tǒng)相關(guān)課程,可以把進(jìn)程想象成能夠自動(dòng)完成某些特定任務(wù)的任何東西,如訓(xùn)
練有素的狗狗、跑龍?zhí)椎牡取?/p>
后臺(tái)進(jìn)程(backgroundprocess):進(jìn)程的一種,在內(nèi)存中運(yùn)行時(shí),不占顯示,
而且它的優(yōu)先級(jí)比前臺(tái)進(jìn)程低??梢灾挥幸粋€(gè)前臺(tái)進(jìn)程,但可以有多個(gè)后臺(tái)進(jìn)程。
?緩沖區(qū)(buffer):一段用來(lái)臨時(shí)存儲(chǔ)數(shù)據(jù)的內(nèi)存區(qū)。
?主機(jī)(host):計(jì)算機(jī)系統(tǒng)的另一個(gè)稱(chēng)呼。
服務(wù)器(server):一臺(tái)在網(wǎng)絡(luò)中向其他計(jì)算機(jī)系統(tǒng)提供一項(xiàng)或多項(xiàng)服務(wù)的主
機(jī)。
客戶(hù)機(jī)(client):一臺(tái)使用由服務(wù)器(server)提供服務(wù)的計(jì)算機(jī)系統(tǒng)。
1.3Oracle數(shù)據(jù)庫(kù)管理系統(tǒng)的體系結(jié)構(gòu)
為了能使Oracle數(shù)據(jù)庫(kù)管理系統(tǒng)滿(mǎn)足商業(yè)用戶(hù)的要求,Oracle引入了如圖1-2所示的
復(fù)雜的體系結(jié)構(gòu)。
正
文
文
件
一
進(jìn)
parameter而
文
一
件
進(jìn)
制
文
件datafiles
一
一
一
一
一-----
二
二
二
二
二
二
二
二
二
二
進(jìn)
進(jìn)
進(jìn)
進(jìn)
進(jìn)
進(jìn)
進(jìn)
進(jìn)
進(jìn)
進(jìn)
制
制
制
制
制
制
制
制
制
制
_-_--__
archivedlogfiles
圖1-2
以上這個(gè)復(fù)雜的體系結(jié)構(gòu)主要包括Oracle服務(wù)器(server)(而服務(wù)器又是由Oracle
實(shí)例(instance)和Oracle數(shù)據(jù)庫(kù)(database)組成),還包括一些其他的關(guān)鍵文件、用戶(hù)
進(jìn)程和服務(wù)器進(jìn)程等。
Oracle服務(wù).器(server)由Oracle實(shí)例(instance)和Oracle數(shù)據(jù)庫(kù)(database)兩大部
分組成。它是一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng),提供了一致、開(kāi)放和多樣的信息管理的方法和途徑。服
務(wù)器中的一些結(jié)構(gòu)并不在處理SQL語(yǔ)句時(shí)使用,它們是為了改進(jìn)數(shù)據(jù)庫(kù)系統(tǒng)的效率或數(shù)據(jù)
的恢復(fù)等而設(shè)計(jì)的。
1.4Oracle月艮務(wù)器(server)
Oracle服務(wù)器(server)可以有以下3種安裝方式。
(1)基于主機(jī)方式:在此種配置下,用戶(hù)直接在安裝了數(shù)據(jù)庫(kù)的計(jì)算機(jī)上登錄Oracle
數(shù)據(jù)庫(kù)。
(2)客戶(hù)端-服務(wù)器(client-server)(兩層模型)方式:數(shù)據(jù)庫(kù)和客戶(hù)終端分別安裝在
不同的計(jì)算機(jī)上,用戶(hù)通過(guò)網(wǎng)絡(luò)從個(gè)人計(jì)算機(jī)(客戶(hù)端)上訪問(wèn)數(shù)據(jù)庫(kù)。
(3)客戶(hù)端-應(yīng)用服務(wù)器-服務(wù)器(client-applicationserver-server)(三層模型):用
戶(hù)首先從自己的個(gè)人計(jì)算機(jī)登錄應(yīng)用服務(wù)器,再通過(guò)應(yīng)用服務(wù)器訪問(wèn)真正的數(shù)據(jù)庫(kù)。
1.5Oracle實(shí)例(instance)
Orac。實(shí)例(instance)是一種訪問(wèn)數(shù)據(jù)庫(kù)的機(jī)制,它是由內(nèi)存結(jié)構(gòu)(SGA)和一些后
臺(tái)進(jìn)程(5個(gè)進(jìn)程)組成的。它的內(nèi)存結(jié)構(gòu)也稱(chēng)為系統(tǒng)全局區(qū)(systemglobalarea,SGA)。
系統(tǒng)全局區(qū)是實(shí)例的最基采的部件之一。實(shí)例的后臺(tái)進(jìn)程中有5個(gè)是必需的,即這5個(gè)后
臺(tái)進(jìn)程中的任何一個(gè)沒(méi)有啟動(dòng),實(shí)例將自動(dòng)關(guān)閉。這5個(gè)后臺(tái)進(jìn)程分別是SMON、PMON、
DBWR、LGWR和CKPT。在OCP考題中有時(shí)可能會(huì)問(wèn)哪些后臺(tái)進(jìn)程是可選的?除了這5
個(gè)都是可選的。實(shí)例一啟動(dòng)就分配系統(tǒng)全局區(qū)和啟動(dòng)所需的后臺(tái)進(jìn)程。這里應(yīng)該指出的是,
每個(gè)實(shí)例只能操作一個(gè)數(shù)據(jù)庫(kù),而且它不可以操席其他的數(shù)據(jù)庫(kù)。但是反過(guò)來(lái)是不成立的,
因?yàn)橐粋€(gè)數(shù)據(jù)庫(kù)可以同時(shí)被兒個(gè)實(shí)例操作(在Oracle集群中)。
系統(tǒng)全局區(qū)(SGA)中包含了以下幾個(gè)內(nèi)存結(jié)構(gòu):共享池(sharedpool)、數(shù)據(jù)庫(kù)高速
緩沖區(qū)(databasebuffercache)、重做日志緩沖區(qū)(redologbuffer)和其他的一些結(jié)構(gòu)(如
鎖和統(tǒng)計(jì)數(shù)據(jù))等。
1.6Oracle數(shù)據(jù)庫(kù)
Oracle數(shù)據(jù)庫(kù)是數(shù)據(jù)的一個(gè)集合,Oracle把這些數(shù)據(jù)作為一個(gè)完整的單位來(lái)處理。
Oracle數(shù)據(jù)庫(kù)也叫做物理(外存)結(jié)構(gòu),它為數(shù)據(jù)庫(kù)信息提供了真正的物理存儲(chǔ),它是由
以下3類(lèi)操作系統(tǒng)文件組成的。
(1)控制文件(controlfiles):包含了維護(hù)和校驗(yàn)數(shù)據(jù)庫(kù)一致性所需的信息。
(2)重做日志文件(redologfiles):包含了當(dāng)系統(tǒng)崩潰后進(jìn)行恢復(fù)所需記錄的變化信
息。
(3)數(shù)據(jù)文件(datafiles):包含了數(shù)據(jù)庫(kù)中真正的數(shù)據(jù)。
1.7Oracle其他的關(guān)鍵文件
除了以上3類(lèi)數(shù)據(jù)庫(kù)文件之外,Oracle服務(wù)還需要其他的一些文件,這些文件不屬于
數(shù)據(jù)庫(kù)。其中包括:
初始化參數(shù)文件(parameterfiles):定義了實(shí)例的特性,如系統(tǒng)全局區(qū)中一
些內(nèi)存結(jié)構(gòu)的大小、DBWR的個(gè)數(shù)。
密碼文件(passwordfiles):包含了數(shù)據(jù)庫(kù)管理員或操作員用戶(hù)在啟動(dòng)和關(guān)閉
實(shí)例時(shí)所需的密碼。雖然Oracle數(shù)據(jù)庫(kù)提供了相當(dāng)完善的安全管理機(jī)制,但是在
Oracle數(shù)據(jù)庫(kù)沒(méi)有開(kāi)啟時(shí)如何驗(yàn)證要啟動(dòng)數(shù)據(jù)庫(kù)的人是真正的數(shù)據(jù)庫(kù)管理員或操作
作員呢?這就是Oracle引入密碼文件的原因。
歸檔重做日志文件(archivedredologfiles):是重做日志文件的脫機(jī)備份。在系
統(tǒng)崩潰后進(jìn)行恢復(fù)時(shí)可能需要這些文件。
1.8建立與Oracle實(shí)例的連接
Oracle實(shí)例(instance)是用Oracle的STARTUP命令啟動(dòng)的(該命令將在后面的章節(jié)
中詳細(xì)介紹)o它的啟動(dòng)就意味著SGA的所有內(nèi)存結(jié)構(gòu)都已生成,所有必需的后臺(tái)進(jìn)程都
已在內(nèi)存中運(yùn)行。那么此時(shí)用戶(hù)又是如何使用Oracle數(shù)據(jù)庫(kù)呢?
用戶(hù)在向Oracle數(shù)據(jù)庫(kù)發(fā)出SQL命令之前必須與實(shí)例(instance)建立連接。用戶(hù)啟
動(dòng)一個(gè)工具如SQL*Plus,或運(yùn)行一個(gè)利用Oracle工具開(kāi)發(fā)的應(yīng)用程序,如用OracleForms
開(kāi)發(fā)的應(yīng)用程序時(shí),這個(gè)工具或應(yīng)用程序就被作為一個(gè)用戶(hù)進(jìn)程來(lái)執(zhí)行。用戶(hù)進(jìn)程是不能
直接訪問(wèn)數(shù)據(jù)庫(kù)的。
在專(zhuān)用連接的情況下(也是默認(rèn)),當(dāng)一個(gè)用戶(hù)登錄Oracle服務(wù)器時(shí)(如在SQL*Plus
的提示下輸入用戶(hù)名和密碼),如果登錄成功(即用戶(hù)名和密碼都準(zhǔn)確無(wú)誤),Oracle就
在服務(wù)器所運(yùn)行的計(jì)算機(jī)上創(chuàng)建一個(gè)服務(wù)器進(jìn)程。在這種連接下,該服務(wù)器進(jìn)程只能為這
個(gè)用戶(hù)進(jìn)程提供服務(wù)。用戶(hù)進(jìn)程與服務(wù)器進(jìn)程是一對(duì)一的關(guān)系。用戶(hù)進(jìn)程向服務(wù)器進(jìn)程發(fā)
請(qǐng)求,服務(wù)器進(jìn)程對(duì)數(shù)據(jù)庫(kù)進(jìn)行實(shí)際的操作并把所得的結(jié)果返回給用戶(hù)進(jìn)程。就好像一個(gè)
大富豪想炒股票,但又不懂股票市場(chǎng)的運(yùn)作,于是他請(qǐng)了一位股票經(jīng)紀(jì)人。這位富豪就相
當(dāng)于用戶(hù)進(jìn)程,而股票經(jīng)紀(jì)人就相當(dāng)于服務(wù)器進(jìn)程,股票市場(chǎng)就相當(dāng)于Oracle數(shù)據(jù)庫(kù)。
一個(gè)用戶(hù)每次登錄Oracle服務(wù)器,如果成功,該用戶(hù)就與Oracle服務(wù)器建立了連接,
而這種連接又叫做會(huì)話(huà)。一個(gè)會(huì)話(huà)始于用戶(hù)成功地登錄Oracle服務(wù)器,終止于用戶(hù)退出或
非正常終止連接。一個(gè)數(shù)據(jù)庫(kù)用戶(hù)可能同時(shí)有多個(gè)會(huì)話(huà)存在,即用相同的用戶(hù)名和密碼同時(shí)
登錄多次。
1.9各種不同的連接方式
連接是用戶(hù)進(jìn)程與Oracle服務(wù)器之間的通信路徑。與Oracle服務(wù)器(server)的3種安
裝方式相對(duì)應(yīng),一個(gè)數(shù)據(jù)庫(kù)用戶(hù)可能用以下3種方式之一與Oracle服務(wù)器連接。
(1)基于主機(jī)方式:此時(shí)的用戶(hù)進(jìn)程與服務(wù)器進(jìn)程是在同一臺(tái)計(jì)算機(jī)的相同的操作系
統(tǒng)上的,用戶(hù)進(jìn)程與Oracle服務(wù)器之間的通信路徑是通過(guò)操作系統(tǒng)內(nèi)部進(jìn)程通信(inter
processcommunication,IPC)機(jī)制來(lái)建立的。
(2)客戶(hù)端-服務(wù)器(client-server)(兩層模型)方式:用戶(hù)進(jìn)程與Oracle服務(wù)器之
間的通信是通過(guò)網(wǎng)絡(luò)協(xié)議(如TCP/IP)來(lái)完成的。
(3)客戶(hù)端-應(yīng)用服務(wù)器-服務(wù)器(client-applicationserver-server)(三層模型):用
戶(hù)的個(gè)人計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)與應(yīng)用服務(wù)器或網(wǎng)絡(luò)服務(wù)器通信,而這個(gè)應(yīng)用服務(wù)器或網(wǎng)絡(luò)服務(wù)
器又是通過(guò)網(wǎng)絡(luò)與運(yùn)行數(shù)據(jù)庫(kù)的計(jì)算機(jī)相連的。例如,用戶(hù)使用瀏覽器通過(guò)網(wǎng)絡(luò)運(yùn)行NT服
務(wù)器上的應(yīng)用程序,而NT服務(wù)器又從運(yùn)行在UNIX主機(jī)上的Oracle數(shù)據(jù)庫(kù)中提取數(shù)據(jù)。
以上所介紹的連接是用戶(hù)進(jìn)程與服務(wù)器進(jìn)程的一對(duì)一的連接,也稱(chēng)為專(zhuān)用服務(wù)器連接
(dedicatedserverconnection)。除了這種連接夕卜,在聯(lián)機(jī)事務(wù)處理(onlinetransaction
processing,OLTP)系統(tǒng)的配置時(shí)還有另外的一種連接,它在Oracle9i之前的版本中稱(chēng)為
多線(xiàn)程(MTS)連接,在Oracle9i或以后的版本中稱(chēng)為共享服務(wù)器(sharedserver)連接。
有關(guān)這種連接在Oracle的網(wǎng)絡(luò)和調(diào)優(yōu)的書(shū)籍中介紹。
1.10服務(wù)器進(jìn)程
當(dāng)Oracle創(chuàng)建一個(gè)服務(wù)器進(jìn)程的同時(shí)要為該服務(wù)器進(jìn)程分配一個(gè)內(nèi)存區(qū),這個(gè)內(nèi)存區(qū)
稱(chēng)為程序全局區(qū)(programglobalarea,PGA)。與SGA不同,PGA是一個(gè)私有的內(nèi)存區(qū),
是不能共享的,是只屬于?個(gè)進(jìn)程的。它隨著進(jìn)程的創(chuàng)建而被分配,隨著進(jìn)程的終止而被
回收。在專(zhuān)用服務(wù)器進(jìn)程的配置情況下,程序全局區(qū)包括了以下結(jié)構(gòu):
(1)排序區(qū)(sortarea):用于處理SQL語(yǔ)句所需的排序。
(2)游標(biāo)狀態(tài)區(qū)(cursorstate):用于指示會(huì)話(huà)當(dāng)前所使用的SQL語(yǔ)句的處理狀態(tài)。
(3)會(huì)話(huà)信息區(qū)(sessioninformation):包括了會(huì)話(huà)的用戶(hù)權(quán)限和優(yōu)化統(tǒng)計(jì)信息。
(4)堆棧區(qū)(stackspace):包括了其他的會(huì)話(huà)變量。
如果是共享服務(wù)器進(jìn)程或多線(xiàn)程的配置,以上這些結(jié)構(gòu)除了堆棧區(qū)外大部分將存在
SGA中。如果有l(wèi)argepool.它們就會(huì)被存在largepool,否則它們就會(huì)被存在共享池中。
1.11Oracle執(zhí)行SQL查詢(xún)語(yǔ)句的步驟
如果用戶(hù)在SQL*Plus下輸入了如下的查詢(xún)語(yǔ)句:SELECT*FROMdept;,那么Oracle
又是如何來(lái)處理這個(gè)語(yǔ)句的呢?SQL語(yǔ)句的執(zhí)行主要由用戶(hù)進(jìn)程與服務(wù)器進(jìn)程來(lái)完成,其他
的一些進(jìn)程可能要輔助完成這一過(guò)程。查詢(xún)語(yǔ)句與其他的SQL語(yǔ)句有所不同,如果一個(gè)查詢(xún)
語(yǔ)句執(zhí)行成功,它要返回查詢(xún)的結(jié)果。而其他的SQL語(yǔ)句只是返回執(zhí)行成功或失敗的信息。
查詢(xún)語(yǔ)句的處理主要包括以下3個(gè)階段:編譯(parse)、執(zhí)行(execute)和提取數(shù)據(jù)(fetch)。
編譯(parse):在進(jìn)行編譯時(shí),服務(wù)器進(jìn)程會(huì)將SQL語(yǔ)句的正文放入共享池
(sharedpool)的庫(kù)高速緩存(librarycache)中并將完成以下處理:
首先在共享池中搜索是否有相同的SQL語(yǔ)句(正文),如果沒(méi)有就進(jìn)行后續(xù)
的處理。
>檢查該SQL語(yǔ)句的語(yǔ)法是否正確。
>通過(guò)查看數(shù)據(jù)字典來(lái)檢查表和列的定義。
對(duì)所操作的對(duì)象加編譯鎖(parselocks)以便在編譯語(yǔ)句期間這些對(duì)象的定
義不能被改變。
>檢查所引用對(duì)象的用戶(hù)權(quán)限。
>生成執(zhí)行該SQL語(yǔ)句所需的優(yōu)化的執(zhí)行計(jì)劃(執(zhí)行步驟)。
>將SQL語(yǔ)句和執(zhí)行計(jì)劃裝入共享的SQL區(qū)。
以上的每一步操作都是在處理正確時(shí)才進(jìn)行后續(xù)的處理。如果不正確,就返回錯(cuò)誤。
執(zhí)行(execute):Oracle服務(wù)器進(jìn)程開(kāi)始執(zhí)行SQL語(yǔ)句是因?yàn)樗勋@得了執(zhí)
行SQL語(yǔ)句所需的全部資源和信息。
提取數(shù)據(jù)(fetch):Oracle服務(wù)器進(jìn)程選擇所需的數(shù)據(jù)行,并在需要時(shí)將其
排序,最后將結(jié)果返回給用戶(hù)(進(jìn)程)。
1.12共享池(sharedpool)
SGA中的共享池(sharedpool)是由庫(kù)高速緩存(libraiycache)和數(shù)據(jù)字典高速緩存
(datadictionarycache)兩部分所組成。服務(wù)器進(jìn)程將SQL(也可能是PL/SQL)語(yǔ)句的正
文和編譯后的代碼(parsedcode)以及執(zhí)行計(jì)劃都放在共享池(sharedpool)的庫(kù)高速緩
存中。在進(jìn)行編譯時(shí),服務(wù)器進(jìn)程首先會(huì)在共享池中搜索是否有相同的SQL或PL/SQL語(yǔ)
句(正文),如果有就不進(jìn)行任何后續(xù)的編譯處理,而是直接使用已存在的編譯后的代碼
和執(zhí)行計(jì)劃。
g、“提示:
庫(kù)高速緩存包含了共享SQL區(qū)和共享PL/SQL區(qū)兩部分,它們分別存放SQL和PL/SQL
語(yǔ)句以及相關(guān)的信息。
要想共享SQL或PL/SQL語(yǔ)句,第一,庫(kù)高速緩存(librarycache)要足夠大,因?yàn)橹?/p>
有這樣要共享的SQL或PL/SQL語(yǔ)句才不會(huì)很快地淘汰出內(nèi)存。第二,SQL或PL/SQL語(yǔ)
句要是能共享的通用代碼(genericcode),因?yàn)镺racle是通過(guò)比較SQL或PUSQL語(yǔ)句的
正文來(lái)決定兩個(gè)語(yǔ)句是否相同的,只有當(dāng)兩個(gè)語(yǔ)句的正文完全相同時(shí)Oracle才重用已存在
的編譯后的代碼和執(zhí)行計(jì)劃。這里通過(guò)以下的實(shí)例來(lái)進(jìn)一步解釋這一點(diǎn)。讀者猜如下的兩
個(gè)SQL語(yǔ)句是否相同?
select*fromempwheresal>=1500;和select*fromempwheresal>=1501;
答案是不相同的(在Oracle默認(rèn)的配置下,Oracle8i和Oracle9i以及更高的版本可以
通過(guò)重新設(shè)置CURSOR_SHARING參數(shù)來(lái)修改默認(rèn)配置,有興趣的讀者可參閱Oracle調(diào)優(yōu)
方面的書(shū)籍)。
可以通過(guò)使用綁定變量的方式來(lái)重寫(xiě)以上的SQL語(yǔ)句,如下:
select*fromempwheresal>=&v_sal;
這個(gè)語(yǔ)句就是可以共享的通用代碼,因?yàn)樽兞坎皇窃诰幾g階段而是在運(yùn)行階段賦值的。
引入庫(kù)高速緩存(librarycache)的目的是共享SQL或PL/SQL代碼。那么Oracle又是怎樣
有效地管理庫(kù)高速緩存(librarycache)的呢?Oracle是使用一個(gè)稱(chēng)為L(zhǎng)RU(leastrecently
used)的隊(duì)列(list)或算法(algorithm)來(lái)實(shí)現(xiàn)對(duì)庫(kù)高速緩存的管理的。LRU隊(duì)列的算法
大致如下:剛使用的內(nèi)存塊(的地址)放在LRU隊(duì)列的頭上(最前面),當(dāng)一個(gè)服務(wù)器進(jìn)
程需要庫(kù)高速緩存的內(nèi)存空間而又沒(méi)有空閑的內(nèi)存空間時(shí),該進(jìn)程就從LRU隊(duì)列的尾部(最
后面)獲得所需的內(nèi)存塊,這些內(nèi)存塊一旦被使用,它們(的地址)就立即放在LRU隊(duì)列
的最前面。這樣那些長(zhǎng)時(shí)間沒(méi)使用過(guò)的內(nèi)存塊將自然地移到LRU隊(duì)列的尾部而被最先使用。
從以上的討論可知,為了能夠共享SQL或PL/SQL的代碼,庫(kù)高速緩存要足夠大,因
為這樣那些可以共享的SQL或PL/SQL代碼才不會(huì)被很快地淘汰出內(nèi)存。不過(guò)Oracle并沒(méi)
有給出直接設(shè)置庫(kù)高速緩存大小的方法,只能通過(guò)設(shè)置共享池的大小來(lái)間接地設(shè)置庫(kù)高速緩
緩存的大小。
介紹完了庫(kù)高速緩存,接下來(lái)將介紹數(shù)據(jù)字典高速緩存(datadictionarycache)。當(dāng)
Oracle在執(zhí)行SQL語(yǔ)句時(shí),服務(wù)器進(jìn)程將把數(shù)據(jù)文件、表、索引、歹?。荨⒂脩?hù)和其他的數(shù)據(jù)
對(duì)象的定義和權(quán)限的信息放入數(shù)據(jù)字典高速緩存。如果在這之后,有進(jìn)程(用戶(hù))需要同
樣的信息,如表和列的定義,那么所有的這些信息將從數(shù)據(jù)字典高速緩存中獲得。因?yàn)橐?/p>
上所說(shuō)的這些信息都是存在Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)字典中,這也可能就是該部分內(nèi)存叫做數(shù)
據(jù)字典高速緩存的原因。
表和列的定義等重用的機(jī)會(huì)要比SQL語(yǔ)句大,因此為了能達(dá)到共享這些信息的目的,
數(shù)據(jù)字典高速緩存應(yīng)該盡可能設(shè)置得大一些。不過(guò)與庫(kù)高速緩存一樣,Oracle并沒(méi)有給出
直接設(shè)置數(shù)據(jù)字典高速緩存大小的方法,只能通過(guò)設(shè)置共享池的大小來(lái)間接地設(shè)置數(shù)據(jù)字
典高速緩存的大小。在Oracle9i之前的版本,可以通過(guò)修改參數(shù)文件中的SHARED_POOL_
SIZE的值來(lái)改變共享池的大小,但一定要重新啟動(dòng)Oracle數(shù)據(jù)庫(kù)。在Oracle9i或以后的
版本中,也可以使用類(lèi)似于例1-1的命令來(lái)改變共享池的大?。?/p>
例1-1
SQL>ALTERSYSTEMSETSHARED_POOL_SIZE=32M;
系統(tǒng)已更改。
但是所改變共享池的大小受限于SGA_MAX_SIZE參數(shù)。這個(gè)參數(shù)將在以后的章節(jié)中詳
詳細(xì)地介紹。
要注意:
在本書(shū)中采用如下的約定:
?SQL>為SQL*Plus的提示符。
沒(méi)有陰影的內(nèi)容為要輸入的SQL語(yǔ)句或SQL*Plus命令等。如在例1-1中要
輸入ALTERSYSTEMSETSHARED_POOL_S1ZE=32M;。
陰影中的內(nèi)容為系統(tǒng)顯示(輸出)的結(jié)果。如在例1-1中的'"系統(tǒng)已更改。
提示:
即使把共享池設(shè)置得足夠大并且所使用的SQL或PL/SQL語(yǔ)句也是能共享的代碼,
Oracle也并不能一定使用內(nèi)存(共享池)中的代碼。例如當(dāng)有用戶(hù)修改了某個(gè)對(duì)象的定義之
后,所有使用這個(gè)對(duì)象的內(nèi)存(共享池)中的代碼全部被Oracle設(shè)置為無(wú)效,因此在使用
時(shí)必須重新編譯。
1.13數(shù)據(jù)庫(kù)高速緩沖區(qū)(databasebuffercache)
一和庫(kù)高速緩存(libararycache)不一樣
如果用戶(hù)發(fā)出了以下的SQL語(yǔ)句:SELECT*FROMemp,Oracle又是怎樣提取數(shù)據(jù)
庫(kù)中的數(shù)據(jù)呢?服務(wù)器進(jìn)程將首先在數(shù)據(jù)庫(kù)高速緩沖區(qū)(databasebuffercache)中搜尋所
需的數(shù)據(jù),如果找到了就直接使用而不進(jìn)行磁盤(pán)操作,如果沒(méi)找到就將進(jìn)行磁盤(pán)操作把數(shù)
據(jù)文件中的數(shù)據(jù)讀入到數(shù)據(jù)庫(kù)高速緩沖區(qū)中。
從以上的討論可知,為了能夠共享數(shù)據(jù)庫(kù)中的數(shù)據(jù),數(shù)據(jù)庫(kù)高速緩沖區(qū)要足夠的大,因
為這樣那些可以共享的數(shù)據(jù)才不會(huì)被很快地淘汰出內(nèi)存。Oracle也是使用一個(gè)叫做LRU
(leastrecentlyused)的隊(duì)列(list)或算法(algorithm)來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)高速緩沖區(qū)的管
理??梢允褂脜?shù)文件中的DB_BLOCK_SIZE和DB_BLOCK_BUFFERS兩個(gè)參數(shù)來(lái)設(shè)置
數(shù)據(jù)庫(kù)高速緩沖區(qū)的大小。其中DBBLOCKSIZE為Oracle數(shù)據(jù)塊(內(nèi)存緩沖區(qū))的大小,
在Oracle數(shù)據(jù)庫(kù)中內(nèi)存和外存的數(shù)據(jù)塊的大小是相同的。DBBLOCKBUFFERS為內(nèi)存緩
沖區(qū)的個(gè)數(shù)。數(shù)據(jù)庫(kù)高速緩沖區(qū)大小為這兩個(gè)參數(shù)的乘積。但是DB_BLOCK_SIZE的值是
在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)設(shè)定的,如果要改變?cè)搮?shù)的值一般需要重建數(shù)據(jù)庫(kù)。因此多數(shù)情況下只能
通過(guò)改變DB_BLOCK_BUFFERS的值來(lái)調(diào)整數(shù)據(jù)庫(kù)高速緩沖區(qū)大小。但一定得重新啟動(dòng)
Oracle數(shù)據(jù)庫(kù)。在Oracle9i或以后的版本中,Oracle引入了另一個(gè)參數(shù)DBCACHESIZE,
這個(gè)參數(shù)是一個(gè)動(dòng)態(tài)參數(shù),即可以在數(shù)據(jù)庫(kù)運(yùn)行時(shí)動(dòng)態(tài)地改變?cè)搮?shù)??梢允褂妙?lèi)似于
例1-2的命令來(lái)改變數(shù)據(jù)庫(kù)高速緩沖區(qū)的大小:
例1-2
SQL>ALTERSYSTEMSETDB_CACHE_SIZE=48M;
系統(tǒng)已更改。
1.14內(nèi)存緩沖區(qū)顧問(wèn)(v$db_cache_advice)
Oracle9i或以后的版本還提供了一"1、稱(chēng)為內(nèi)存緩沖區(qū)顧問(wèn)(v$dbcache,advice)的一匚具
來(lái)幫助獲得調(diào)整數(shù)據(jù)庫(kù)高速緩沖區(qū)的統(tǒng)計(jì)信息。內(nèi)存緩沖區(qū)顧問(wèn)一共有3種狀態(tài):
(1)ON:該工具打開(kāi),為該工具分配內(nèi)存并進(jìn)行統(tǒng)計(jì)信息的收集?要有一定的內(nèi)存
和CPU開(kāi)銷(xiāo)。
(2)READY:該工具關(guān)閉,為該工具分配內(nèi)存但不進(jìn)行統(tǒng)計(jì)信息的收集,因此沒(méi)有
CPU的開(kāi)銷(xiāo)。
(3)OFF:該工具關(guān)閉,不為該工具分配內(nèi)存也不進(jìn)行統(tǒng)計(jì)信息的收集,因此既沒(méi)有
內(nèi)存的開(kāi)銷(xiāo)也沒(méi)有CPU開(kāi)銷(xiāo)。
可以通過(guò)修改初始化參數(shù)DBCACHEADVICE的值來(lái)改變?cè)摴ぞ叩臓顟B(tài)。這一參數(shù)
是一個(gè)動(dòng)態(tài)參數(shù),因此可以使用ALTERSYSTEM命令來(lái)修改。例如可以利用類(lèi)似于例]-3
的SQL語(yǔ)句來(lái)查看它的狀態(tài):
例1-3
SQL>selectid,name,block_size,advice_status
2fromv$db_cache_advice;
IDNAMEBLOCKSIZEADV
3DEFAULT4096ON
3DEFAULT4096ON
3DEFAULT4096ON
3DEFAULT4096ON
3DEFAULT4096ON
已選擇20行。
此時(shí),例1-3的顯示結(jié)果表明了內(nèi)存緩沖區(qū)顧問(wèn)是在開(kāi)啟狀態(tài)。
提示:
顯示結(jié)果中的…表示省略了一些行的顯示。
之后可以使用類(lèi)似于例14的命令將內(nèi)存緩沖區(qū)顧問(wèn)(v$db_cache_advice)工具關(guān)閉:
例1-4
SQL>altersystemsetdb_cache_advice=off;
系統(tǒng)已更改。
這時(shí)可以再使用類(lèi)似于例1-5的SQL語(yǔ)句來(lái)查看它的狀態(tài):
例1-5
SQL>selectid,name,block_size,advice_status
2fromv$db_cache_advice;
IDNAMEBLOCKSIZEADV
3DEFAULT4096OFF
3DEFAULT4096OFF
3DEFAULT4096OFF
3DEFAULT4096OFF
3DEFAULT4096OFF
已選擇20行。
此時(shí),例1-5的顯示結(jié)果表明已成功地關(guān)閉了內(nèi)存緩沖區(qū)顧問(wèn)(詳細(xì)地介紹該工具的
使用已超出了本書(shū)的范圍,有興趣的讀者可參閱Oracle9i/10g調(diào)優(yōu)方面的書(shū)籍)。
1.15重做日志緩沖區(qū)(redologbuffer)
從理論上來(lái)講,如果數(shù)據(jù)庫(kù)不會(huì)崩潰,根本沒(méi)有必要引入重做日志緩沖區(qū)(redolog
buffer)o引入重做日志緩沖區(qū)的主要目的(在Oracle8i之前的版本中也是惟一的目的)就
是數(shù)據(jù)的恢復(fù)。Oracle在使用任何DML或DDL操作改變數(shù)據(jù)之前都將恢復(fù)所需的信息,
即在寫(xiě)數(shù)據(jù)庫(kù)高速緩沖區(qū)之前,先寫(xiě)入重做日志緩沖區(qū)。
與執(zhí)行查詢(xún)語(yǔ)句有所不同.Oracle在執(zhí)行DML語(yǔ)句時(shí)只有編譯(parse)和執(zhí)行(execute)
西生返儂至DQU上以下是Oracle執(zhí)行UPDATE語(yǔ)句的步驟:
(1)如果數(shù)據(jù)和回滾數(shù)據(jù)不在數(shù)據(jù)庫(kù)高速緩沖區(qū)中,Oracle服務(wù)器進(jìn)程將把它們從數(shù)
據(jù)文件中讀到數(shù)據(jù)庫(kù)高速緩沖區(qū)中。
(2)Oracle服務(wù)器進(jìn)程在要修改的數(shù)據(jù)行上加鎖(行一級(jí)的鎖)。
(3)Oracle服務(wù)器進(jìn)程將數(shù)據(jù)的變化信息和回滾所需的信息都記錄在重做日志緩沖區(qū)
區(qū)中。
(4)Oracle服務(wù)器進(jìn)程將回滾所需的原始值和對(duì)數(shù)據(jù)所做的修改都寫(xiě)入數(shù)據(jù)庫(kù)高速緩
緩沖區(qū)(databasebuffercache)。之后在數(shù)據(jù)庫(kù)高速緩沖區(qū)中所有的這些數(shù)據(jù)塊都將被標(biāo)為
臟緩沖區(qū),因?yàn)榇藭r(shí)內(nèi)外存的數(shù)據(jù)是不同的(不一致的)。
Oracle處理INSERT或DELETE語(yǔ)句的步驟與處理UPDATE語(yǔ)句的步驟大體相同。
其注意:
有關(guān)回滾數(shù)據(jù)在本書(shū)的后面章節(jié)中還要介紹,讀者也可以參閱筆者的另一本書(shū)《從實(shí)
踐中學(xué)習(xí)Oracle/SQL》一書(shū)12.20節(jié)的258?259頁(yè)。
1.16大型池(largepool)和Java池(Javapool)
除了以上所介紹的內(nèi)存結(jié)構(gòu)之外,SGA中還有可能包含largepool和Javapool兩個(gè)可
選的內(nèi)存結(jié)構(gòu)。
引入largepool的.主要目的應(yīng)該是提高效率。largepool是一個(gè)相對(duì)比較簡(jiǎn)單的內(nèi)存結(jié)
構(gòu),與sharedpool不同的是它沒(méi)有LRU隊(duì)列。在多線(xiàn)程(MTS)或共享服務(wù)器(sharedserver)
連接時(shí),Oracle服務(wù)器進(jìn)程的PGA的大部分區(qū)域(也叫UGA)將放入largepool(stackspace
除外)。另外在大規(guī)模I/O及備份和恢復(fù)操作時(shí)可能使用該區(qū)??梢酝ㄟ^(guò)設(shè)置參數(shù)
LARGE_POOL_SIZE的值來(lái)配置largepool的大小。該參數(shù)也是一個(gè)動(dòng)態(tài)參數(shù)。
引入Javapool的目的是能夠編譯Java語(yǔ)言的命令。如果要使用Java語(yǔ)言就必須設(shè)置
Javapool?Java語(yǔ)言在Oracle數(shù)據(jù)庫(kù)中的存儲(chǔ)與PL/SQL語(yǔ)言幾乎完全相同。可以通過(guò)設(shè)置
參數(shù)JAVA_POOL_SIZE的值來(lái)配置Javapool的大小。其數(shù)字的單位是字節(jié)(bytes)。在
Oracle9i中Javapool的默認(rèn)大小為24MB。
1.17內(nèi)存緩沖區(qū)大小的設(shè)定
在Oracle9i之前的版本中,只能通過(guò)設(shè)置初始化參數(shù)文件中的一些參數(shù)來(lái)間接地設(shè)置
SGA的大小,如DB_BLOCK_BUFFERS,LOG_BUFFER、SHARED_POOL_SIZE等。而
且所有的這些參數(shù)都是靜態(tài)的,即當(dāng)修改完初始化參數(shù)文件中這些參數(shù)的值之后必須重新
啟動(dòng)Oracle數(shù)據(jù)庫(kù)。
在Oracle9i以后的版本中,SGA為動(dòng)態(tài)的。SGA中的內(nèi)存緩沖區(qū),如數(shù)據(jù)庫(kù)高速緩
沖區(qū)(databasebuffercache)和共享池(sharedpool)等都可以動(dòng)態(tài)地增加和減少。Oracle
是利用所謂的區(qū)組(granule)來(lái)管理SGA的內(nèi)存的。區(qū)組(granule)就是一片連續(xù)的虛擬
內(nèi)存區(qū)。區(qū)組是Oracle分配和回收內(nèi)存區(qū)的基本單位。
區(qū)組的大小取決于所估計(jì)的SGA的大小。如果SGA的尺寸小于128MB,區(qū)組的大小就
是4MB。如果SGA的尺寸大于或等于128MB,區(qū)組的大小就為16MB。Oracle數(shù)據(jù)庫(kù)一旦
啟動(dòng),SGA中的每個(gè)內(nèi)存緩沖區(qū)就會(huì)獲得所需的區(qū)組。SGA中至少包括3個(gè)區(qū)組:一個(gè)是
SGA固定區(qū)(其中包含了重做日志緩沖區(qū)):一個(gè)是數(shù)據(jù)庫(kù)高速緩沖區(qū);一個(gè)是共享池。
Oracle數(shù)據(jù)庫(kù)管理員可通過(guò)ALTERSYSTEMSET命令來(lái)分配和回收區(qū)組。但總的內(nèi)存
大小不能超過(guò)參數(shù)SGA_MAX_SIZE所設(shè)定的值。該參數(shù)的單位是字節(jié)。
動(dòng)態(tài)分配和回收內(nèi)存的最大好處是在調(diào)整內(nèi)存緩沖區(qū)大小時(shí)不需要情新啟動(dòng)數(shù)據(jù)庫(kù)。
這一點(diǎn)對(duì)那些24小時(shí)運(yùn)營(yíng)7天營(yíng)業(yè)的商業(yè)數(shù)據(jù)庫(kù)是至關(guān)重要的。
1.18內(nèi)存緩沖區(qū)信息的獲取
可以使用例1-6的命令來(lái)獲得參數(shù)SGA_MAX_SIZE的值:
例1-6
SQL>showparameter
該命令將顯示出參數(shù)文件中可以設(shè)置的全部參數(shù)。另外也可以使用例1-7的命令來(lái)獲
得SGA的相關(guān)信息:
例1?7
SQL>showsga
TotalSystemGlobalAreabytes
FixedSizebytes
VariableSizebytes
DatabaseBuffersbytes
RedoBuffersbytes
也可以先使用例1-8和例1?9的SQL*Plus命令來(lái)格式化顯示輸出:
例1-8
SQL>colnamefora20
例1-9
SQL>colvaluefora25
之后,利用數(shù)據(jù)字典v$parameter使用例1-10的SQL查詢(xún)語(yǔ)句來(lái)獲得參數(shù)
SGA_MAX_SIZE的值:
例1-10
SQL>selectname,type,value
2fromv$parameter
3wherename='sga_max_size*;
NAMETYPEVALUE
sga_max_size6
介紹完了SGA的各個(gè)部分內(nèi)存緩沖區(qū)之后,下面開(kāi)始詳細(xì)地討論Oracle的主要后臺(tái)
進(jìn)程。
1.19重做日志寫(xiě)進(jìn)程(LGWR)及快速提交(fast
commit)
重做日志寫(xiě)進(jìn)程(LOGwriter,LGWR)負(fù)責(zé)將重:做日志緩沖區(qū)的記錄順序地寫(xiě)到重做
日志文件中。為了更好地理解LOGwriter的操作原理,在這里先介紹一下Oracle提交
(commit)語(yǔ)句是如何工作的。
Oracle服務(wù)器是使用了一種稱(chēng)為快速提交(fa父commit)的技術(shù),該技術(shù)既能保證Oracle
系統(tǒng)的效率又能保證在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)可以得到恢復(fù)。為此Oracle系統(tǒng)
引入了系統(tǒng)變化數(shù)(systemchangenumber,SCN)。無(wú)論任何時(shí)候只要某個(gè)事務(wù)(transaction)
被提交,Oracle服務(wù)器都將產(chǎn)生一個(gè)SCN(號(hào)碼)并將其賦予該事務(wù)的所有數(shù)據(jù)行。在同
一個(gè)數(shù)據(jù)庫(kù)中SCN是單調(diào)遞增的并且是惟一的。為了避免在進(jìn)行一致性檢驗(yàn)時(shí)操作系統(tǒng)時(shí)
鐘可能引發(fā)的問(wèn)題,Oracle服務(wù)器將SCN作為Oracle的內(nèi)部時(shí)間戳來(lái)保證數(shù)據(jù)文件中的數(shù)
據(jù)的同步和數(shù)據(jù)的讀一致性。
當(dāng)在SQL*Plus中發(fā)了commit語(yǔ)句之后,Oracle的內(nèi)部操作步驟如下:
(1)服務(wù)器進(jìn)程將把提交的記錄連同所產(chǎn)生的SCN(號(hào)碼)一起寫(xiě)入重做日志緩沖
區(qū)中。
(2)重做日志寫(xiě)進(jìn)程(LGWR)將把重做日志緩沖區(qū)中一直到所提交的記錄(包括該
記錄)的所有記錄連續(xù)地寫(xiě)到重做日志文件中。在此之后,Oracle服務(wù)器就可以保證即使
在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)也可以得到恢復(fù)。
(3)Oracle通知用戶(hù)(進(jìn)程)提交已經(jīng)完成。
(4)服務(wù)器進(jìn)程將修改數(shù)據(jù)庫(kù)高速緩沖區(qū)中的相關(guān)數(shù)據(jù)的狀態(tài)并釋放資源和打開(kāi)
鎖等。
此時(shí)可能這些數(shù)據(jù)并未被寫(xiě)到數(shù)據(jù)文件中,這時(shí)這些數(shù)據(jù)緩沖區(qū)被標(biāo)為臟緩沖區(qū),因
為相同的數(shù)據(jù)在內(nèi)外存中為不同的版本。數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù)據(jù)是山DBWR寫(xiě)到數(shù)據(jù)
文件中的。
曾有不少學(xué)生問(wèn)過(guò)這樣一個(gè)問(wèn)題:“為什么不同時(shí)寫(xiě)兩個(gè)數(shù)據(jù)文件呢?"Oracle的這
種解決方案的最大好處是在保證不丟失數(shù)據(jù)的同時(shí)數(shù)據(jù)庫(kù)的效率不會(huì)受到很大影響。因?yàn)?/p>
重做日志文件中的記錄是以最緊湊的格式存放的,所以它的I/O量要比對(duì)數(shù)據(jù)文件的操作
少得多。另外LGWR是順序地將重做日志緩沖區(qū)中的記錄寫(xiě)到重做日志文件中的,這樣其
I/O速度要比將數(shù)據(jù)塊寫(xiě)到數(shù)據(jù)文件中快得多。
重:做日志寫(xiě)進(jìn)程(LGWR)要在下列情況下將重做日志緩沖區(qū)的記錄(內(nèi)存)順序地
寫(xiě)到重做日志文件(外存)中:
?當(dāng)某個(gè)事務(wù)被提交時(shí)。
?當(dāng)重做日志緩沖區(qū)中變化的記錄超過(guò)一兆字節(jié)(1MB)時(shí)。
?當(dāng)重做日志緩沖區(qū)中所存的記錄已超過(guò)緩沖區(qū)容量的1/3。
在DBWR將數(shù)據(jù)庫(kù)高速緩沖區(qū)中修改過(guò)的數(shù)據(jù)塊寫(xiě)到數(shù)據(jù)文件之前。
?每3秒鐘。
因?yàn)樵谶M(jìn)行數(shù)據(jù)庫(kù)恢復(fù)時(shí)需要重做日志數(shù)據(jù),所以重做日志寫(xiě)進(jìn)程(LGWR)只有在
重做日志數(shù)據(jù)寫(xiě)到重做日志文件(磁盤(pán))上時(shí)才能確定提交已經(jīng)完成。在Oracle8i之前的
版本中,重做日志數(shù)據(jù)的惟一目的和用處就是數(shù)據(jù)庫(kù)恢復(fù)。Oracle在Oracle8i的版本中引入
了一個(gè)叫做重做日志挖掘器(logminer)的工具。該工具可以將重做日志文件或歸檔重做日
志文件中的數(shù)據(jù)轉(zhuǎn)換成用戶(hù)能理解的正文信息。在Oracle8i中,該工具只有命令行操作方
式。Oracle9i加強(qiáng)了此工具的功能并引入了一個(gè)稱(chēng)為日志挖掘?yàn)g覽器(logminerviewer)的
圖形界面。
1.20數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程(DBWR/DBWn)
在本章開(kāi)始時(shí)曾介紹過(guò)數(shù)據(jù)庫(kù)的典型操作就是大規(guī)模的輸入/輸出(I/O).因此為了提
高Oracle系統(tǒng)的效率,一要減少I(mǎi)/O量,這可能是Oracle引入LGWR的原因之一;二要減
少I(mǎi)/O次數(shù),這可能是Oracle引入數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程(DBWR/DBWn)的主要原因。
提示:
在Oracle的英文書(shū)中有些將''數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程”用DBWR表示,有些將它用DBWn表
示。這是因?yàn)樵谝粋€(gè)Oracle實(shí)例中可以啟動(dòng)多個(gè)數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程,特別是在要進(jìn)行大規(guī)模輸
入/輸出并且運(yùn)行在多CPU計(jì)算機(jī)上的Oracle數(shù)據(jù)庫(kù)系統(tǒng)。Oracle允許在一個(gè)實(shí)例上最多
啟動(dòng)10個(gè)數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程,它們分別是DBW0?DBW9。
數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程負(fù)責(zé)將數(shù)據(jù)庫(kù)高速緩沖區(qū)中的臟緩沖區(qū)中的數(shù)據(jù)寫(xiě)到數(shù)據(jù)文件上。為了
提高效率,數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程并不是數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù)據(jù)一有變化就寫(xiě)數(shù)據(jù)文件,而是
積累了足夠多的數(shù)據(jù)一次寫(xiě)一大批內(nèi)存數(shù)據(jù)塊到數(shù)據(jù)文件上。
數(shù)據(jù)庫(kù)寫(xiě)進(jìn)程將在下列事件之一發(fā)生時(shí)把數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù)據(jù)寫(xiě)到數(shù)據(jù)文
件上:
?當(dāng)臟緩沖區(qū)的數(shù)量超過(guò)了所設(shè)定的限額。
?當(dāng)所設(shè)定的時(shí)間間隔已到。
?當(dāng)有進(jìn)程需要數(shù)據(jù)庫(kù)高速緩沖區(qū)而卻找不到空閑的緩沖區(qū)時(shí)。
?當(dāng)校驗(yàn)點(diǎn)發(fā)生時(shí)。
?當(dāng)某個(gè)表被刪除(drop)或被截?cái)?truncate)時(shí)。
?當(dāng)某個(gè)表空間被設(shè)置為只讀狀態(tài)(readonly)時(shí)。
當(dāng)使用類(lèi)似于ALTERTABLESPACEusersBEGINBACKUP的命令對(duì)某個(gè)表空
間進(jìn)行聯(lián)機(jī)備份時(shí)。
當(dāng)某個(gè)臨時(shí)表空間被設(shè)置為只脫機(jī)狀態(tài)(offline)或正常狀態(tài)(normal)時(shí)等。
1.21系統(tǒng)監(jiān)督進(jìn)程(SMON)
從前面的論述中可以知道,由于某種原因Oracle系統(tǒng)崩潰了(如斷電),SGA中任何
沒(méi)有來(lái)得及寫(xiě)到磁盤(pán)中的信息都將丟失,如有些已經(jīng)提交的數(shù)據(jù)還沒(méi)有真正地被寫(xiě)到數(shù)據(jù)
文件中時(shí)就會(huì)丟失。在這種情況下,當(dāng)數(shù)據(jù)庫(kù)重新開(kāi)啟時(shí),系統(tǒng)監(jiān)督進(jìn)程(SMON)將自
動(dòng)地執(zhí)行Oracle實(shí)例的恢復(fù)工作。其夢(mèng)驟如下:
(1)執(zhí)行前滾(rollforward),即將已經(jīng)寫(xiě)到重做日志文件中但還沒(méi)寫(xiě)到數(shù)據(jù)文件中
的提交數(shù)據(jù)寫(xiě)到數(shù)據(jù)文件中(Oracle是用SCN號(hào)碼來(lái)識(shí)別提交記錄的)。
(2)在前滾完成后立即打開(kāi)數(shù)據(jù)庫(kù),此時(shí)用戶(hù)就可以登錄并使用數(shù)據(jù)庫(kù)了.這時(shí)在數(shù)
據(jù)文件中可能還有一些沒(méi)有提交的數(shù)據(jù)。之所以這樣安排主要是為了提高系統(tǒng)的效率。
(3)回滾沒(méi)有提交的事務(wù)(數(shù)據(jù))。除了SMON進(jìn)程之外,服務(wù)器(server)進(jìn)程也
可能進(jìn)行回滾沒(méi)有提交的事務(wù),但該進(jìn)程只回滾它所用到的加鎖的數(shù)據(jù)行。
除此之外,SMON進(jìn)程還要執(zhí)行如下的磁盤(pán)空間的維護(hù)工作:
?回收或組合數(shù)據(jù)文件中相連的空閑區(qū)。
釋放臨時(shí)段(在執(zhí)行SQL語(yǔ)句時(shí)用作排序的磁盤(pán)區(qū)),將它們還給數(shù)據(jù)文件以作
為空閑區(qū)使用。
1.22進(jìn)程監(jiān)督進(jìn)程(PMON)
當(dāng)某個(gè)進(jìn)程崩潰時(shí)(如在沒(méi)有正常退出Oracle的情況下重:新啟動(dòng)了所用的PC),進(jìn)程
監(jiān)督進(jìn)程(PMON)將負(fù)責(zé)它的清理工作。PMON進(jìn)程將負(fù)責(zé)進(jìn)行如下的清理工作:
?回滾用戶(hù)當(dāng)前的事務(wù)。
?釋放用戶(hù)所加的所有表一級(jí)和行一級(jí)的鎖。
?釋放用戶(hù)所有的其他資源等。
1.23校驗(yàn)點(diǎn)(checkpoint)和校驗(yàn)點(diǎn)進(jìn)程
Oracle系統(tǒng)為了提高系統(tǒng)的效率和數(shù)據(jù)庫(kù)的一致性,引入了一個(gè)稱(chēng)為校驗(yàn)點(diǎn)的事件。
該事件是在當(dāng)DBWR進(jìn)程把在SGA中所有已經(jīng)改變了的數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù)據(jù)(包
括提交的和沒(méi)提交的數(shù)據(jù))寫(xiě)到數(shù)據(jù)文件上時(shí)產(chǎn)生。從理論上講校驗(yàn)點(diǎn)(checkpoint)和校
驗(yàn)點(diǎn)進(jìn)程可以完全不需要,因?yàn)镺racle系統(tǒng)利用重做日志數(shù)據(jù)和SCN號(hào)是能夠保證數(shù)據(jù)庫(kù)
的完全恢復(fù)的。引入校驗(yàn)點(diǎn)可能是為了提高系統(tǒng)的效率。因?yàn)樗械叫r?yàn)點(diǎn)為止的變化了
的數(shù)據(jù)都已寫(xiě)到了數(shù)據(jù)文件中,在實(shí)例恢復(fù)時(shí)校驗(yàn)點(diǎn)之前的重做日志記錄已經(jīng)不再需要,
這樣實(shí)例恢復(fù)速度就加快了。
在校驗(yàn)點(diǎn)事件發(fā)生時(shí),Oracle要將校驗(yàn)點(diǎn)號(hào)碼(Oracle系統(tǒng)自動(dòng)產(chǎn)生的)寫(xiě)入所有相
關(guān)的數(shù)據(jù)文件的文件頭中。還要將校驗(yàn)點(diǎn)號(hào)碼、重做日志序列號(hào)、歸檔日志名字和SCN號(hào)
都寫(xiě)入控制文件中。
盡管經(jīng)常產(chǎn)生校驗(yàn)點(diǎn)可以加快實(shí)例恢復(fù)的速度,但是由于在產(chǎn)生校驗(yàn)點(diǎn)時(shí)Oracle系統(tǒng)
要進(jìn)行大量的10操作,所以過(guò)于頻繁地產(chǎn)生校驗(yàn)點(diǎn)會(huì)使數(shù)據(jù)庫(kù)正常的聯(lián)機(jī)操作受到?jīng)_擊。
最后數(shù)據(jù)庫(kù)管理員要在實(shí)例恢復(fù)的速度和聯(lián)機(jī)操作之間進(jìn)行折衷。一般的生產(chǎn)或商業(yè)數(shù)據(jù)
庫(kù)的校驗(yàn)點(diǎn)間隔是在半小時(shí)以上。
1.24歸檔日志(ARCH/ARCn)進(jìn)程
以上5個(gè)后臺(tái)進(jìn)程都是必需的,即它們中的任何一個(gè)停止后實(shí)例自動(dòng)關(guān)閉。在可選后
臺(tái)進(jìn)程中,歸檔日志(ARCH/ARCn)進(jìn)程可能是最重要的一個(gè)可選后臺(tái)進(jìn)程,因?yàn)槿绻?/p>
Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)文件丟失或損壞,一般數(shù)據(jù)庫(kù)要進(jìn)行完全恢復(fù),Oracle數(shù)據(jù)庫(kù)應(yīng)運(yùn)行
在歸檔方式。
在Oracle數(shù)據(jù)庫(kù)中,重做日志文件被劃分為若干個(gè)組。當(dāng)一組重做日志的文件被寫(xiě)滿(mǎn)
后,Oracle就開(kāi)始寫(xiě)下一
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技驅(qū)動(dòng)的工業(yè)互聯(lián)網(wǎng)創(chuàng)新生態(tài)構(gòu)建研究
- 課題申報(bào)參考:賈湖骨笛的實(shí)驗(yàn)音樂(lè)考古學(xué)研究
- 2025年度個(gè)人消費(fèi)借款信用保證合同范本4篇
- 2025版挖掘機(jī)買(mǎi)賣(mài)合同及挖掘機(jī)操作人員培訓(xùn)協(xié)議3篇
- 2025版新媒體人工智能助手研發(fā)與運(yùn)營(yíng)合同2篇
- 2025版小程序技術(shù)支持授權(quán)協(xié)議范本2篇
- 2025年福州貨車(chē)資格證答案
- 2025年度知識(shí)產(chǎn)權(quán)代理服務(wù)合同樣本8篇
- 二零二五版毛竹砍伐與林業(yè)碳排放權(quán)交易合同3篇
- 二零二五年度出納風(fēng)險(xiǎn)控制擔(dān)保及咨詢(xún)合同4篇
- 二零二五年度無(wú)人駕駛車(chē)輛測(cè)試合同免責(zé)協(xié)議書(shū)
- 2025年湖北華中科技大學(xué)招聘實(shí)驗(yàn)技術(shù)人員52名歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 高三日語(yǔ)一輪復(fù)習(xí)助詞「と」的用法課件
- 毛渣采購(gòu)合同范例
- 無(wú)子女離婚協(xié)議書(shū)范文百度網(wǎng)盤(pán)
- 2023中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)-注射相關(guān)感染預(yù)防與控制
- 五年級(jí)上冊(cè)小數(shù)遞等式計(jì)算200道及答案
- 2024年廣東高考政治真題考點(diǎn)分布匯 總- 高考政治一輪復(fù)習(xí)
- 燃?xì)夤艿滥甓葯z驗(yàn)報(bào)告
- GB/T 44052-2024液壓傳動(dòng)過(guò)濾器性能特性的標(biāo)識(shí)
- 國(guó)際市場(chǎng)營(yíng)銷(xiāo)環(huán)境案例分析
評(píng)論
0/150
提交評(píng)論