Oracle的體系結(jié)構(gòu)_第1頁(yè)
Oracle的體系結(jié)構(gòu)_第2頁(yè)
Oracle的體系結(jié)構(gòu)_第3頁(yè)
Oracle的體系結(jié)構(gòu)_第4頁(yè)
Oracle的體系結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第 1 章 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.1 Oracle引入復(fù)雜的體系結(jié)構(gòu)的原因 數(shù)據(jù)庫(kù)管理系統(tǒng)引入非常復(fù)雜的內(nèi)存和外存體系結(jié)構(gòu)的主要原因是有效地管理稀有的系統(tǒng)資源。資源不足不只是數(shù)據(jù)庫(kù)管理系統(tǒng)所面對(duì)的。其實(shí),在我們五千年的人類發(fā)展歷史中,我們的祖先們一直在同資源不足作斗爭(zhēng)。歷史上糧食和土地等一直都是稀有資源,還記得我 們的祖先們用什么方法來(lái)管理這些稀有資源的嗎?用戰(zhàn)爭(zhēng),我們的先民們?yōu)榧Z食而戰(zhàn),為土地而戰(zhàn);我們當(dāng)代人類為石油而戰(zhàn),為市場(chǎng)而戰(zhàn),為金錢而戰(zhàn)。 那么在 Oracle 數(shù)據(jù)庫(kù)中什么是稀有資源?它們又是如何來(lái)管理的呢?如果讀者接觸過(guò)數(shù)據(jù)庫(kù)或讀過(guò)相關(guān)的書,應(yīng)該還有印象,數(shù)據(jù)庫(kù)的數(shù)據(jù)量和輸入 /輸出量都是相當(dāng)大的,而這些數(shù)據(jù)一般都存在硬盤(外存)上,因此硬盤為數(shù)據(jù)庫(kù)的一類資源。為了方便介紹, 圖 1-1 給出了硬盤的內(nèi)部結(jié)構(gòu)示意圖。 旋轉(zhuǎn)軸 磁頭移動(dòng)臂 硬盤面 磁頭 圖 1-1 從圖 1-1 可以看出 ,所有硬盤上數(shù)據(jù)的訪問(wèn)都是靠硬盤的旋轉(zhuǎn)和磁頭的移動(dòng)來(lái)完成的,第 1章 Oracle的體系結(jié)構(gòu) 11 這種旋轉(zhuǎn)和移動(dòng)是機(jī)械運(yùn)動(dòng)。因?yàn)樵谟?jì)算機(jī)中所有數(shù)據(jù)的修改操作必須在內(nèi)存中進(jìn)行,所以內(nèi)存也是數(shù)據(jù)庫(kù)的一類資源。表 1-1 給出內(nèi)存和外存的簡(jiǎn)單比較以幫助讀者理解本書的內(nèi)容。 表 1-1 內(nèi) 存 外存(硬盤) 數(shù)據(jù)訪問(wèn)速度 很快 很慢 存儲(chǔ)的數(shù)據(jù) 臨時(shí) 永久 價(jià)錢 很貴 相當(dāng)便宜 從表 1-1 的比較可知,內(nèi)存的數(shù)據(jù)訪問(wèn)速度要比外存(硬盤)快得多。這是因?yàn)閮?nèi)存的數(shù)據(jù)訪問(wè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í)寫到硬盤上,以保障不會(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.2 Oracle數(shù)據(jù)庫(kù)中常用的術(shù)語(yǔ) 為了講解容易,在詳細(xì)討論 Oracle 體系結(jié)構(gòu)之前,先介紹一下相關(guān)的名詞和術(shù)語(yǔ)。在這里只給出實(shí)用的解釋,并不追求學(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í)椎牡取?后臺(tái)進(jìn)程( background process):進(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è)稱呼。 服務(wù)器( server):一臺(tái)在網(wǎng)絡(luò)中向其他計(jì)算機(jī)系統(tǒng)提供一項(xiàng)或多項(xiàng)服務(wù)的主機(jī)。 客戶機(jī)( client):一臺(tái)使用由服務(wù)器( server)提供服務(wù)的計(jì)算機(jī)系統(tǒng)。 1.3 Oracle數(shù)據(jù)庫(kù)管理系統(tǒng)的體系結(jié)構(gòu) 為了能使 Oracle 數(shù)據(jù)庫(kù)管理系統(tǒng)滿足商業(yè)用戶的要求, Oracle 引入了如圖 1-2 所示的Oracle DBA基礎(chǔ)培訓(xùn)教程 12 復(fù)雜的體系結(jié)構(gòu)。 u s e r p r o c e s s s e v e r p r o c e s s i n s t a n c e S G A D B b u f f e r s c a c h e r e d o l o g b u f f e r s s h a r e d p o o l l i b r a r y c a c h e d i c t i o n a r y c a c h e S M O N P M O N C K P T D B W R L G W R A R C 0 d a t a b a s e 二 進(jìn) 制 文 件 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 二 進(jìn) 制 p a r a m e t e r p a s s w o r d 正 文 文 件 二 進(jìn) 制 文 件 c o n t r o l f i l e s r e d o l o g f i l e s d a t a f i l e s a r c h i v e d l o g f i l e s 圖 1-2 以上這個(gè)復(fù)雜的體系結(jié)構(gòu)主要包括 Oracle 服務(wù)器( server)(而服務(wù)器又是由 Oracle實(shí)例( instance)和 Oracle 數(shù)據(jù)庫(kù)( database)組成),還包括一些其他的關(guān)鍵文件、用戶進(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.4 Oracle服務(wù)器( server) Oracle 服務(wù)器( server)可以有以下 3 種安裝方式。 ( 1)基于主機(jī)方式:在此種配置下,用戶直接在安裝了數(shù)據(jù)庫(kù)的計(jì)算機(jī)上登錄 Oracle第 1章 Oracle的體系結(jié)構(gòu) 13 數(shù)據(jù)庫(kù)。 ( 2)客戶端 -服務(wù)器( client-server)(兩層模型)方式:數(shù)據(jù)庫(kù)和客戶終端分別安裝在不同的計(jì)算機(jī)上,用戶通過(guò)網(wǎng)絡(luò)從個(gè)人計(jì)算機(jī)(客戶端)上訪問(wèn)數(shù)據(jù)庫(kù)。 ( 3)客戶端 -應(yīng)用服務(wù)器 -服務(wù)器( client- application server-server)(三層模型) :用戶首先從自己的個(gè)人計(jì)算機(jī)登錄應(yīng)用服務(wù)器,再通過(guò)應(yīng)用服務(wù)器訪問(wèn)真正的數(shù)據(jù)庫(kù)。 1.5 Oracle實(shí)例( instance) Oracle 實(shí)例( instance)是一種訪問(wèn)數(shù)據(jù)庫(kù)的機(jī)制,它是由內(nèi)存結(jié)構(gòu)和一些后臺(tái)進(jìn)程組成的。它的內(nèi)存結(jié)構(gòu)也稱為系統(tǒng)全局區(qū)( system global area, 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):共享池( shared pool)、數(shù)據(jù)庫(kù)高速緩沖區(qū)( database buffer cache)、重做日志緩沖區(qū)( redo log buffer)和其他的一些結(jié)構(gòu)(如鎖和統(tǒng)計(jì)數(shù)據(jù))等。 1.6 Oracle數(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 類操作系統(tǒng)文件組成的。 ( 1)控制文件( control files):包含了維護(hù)和校驗(yàn)數(shù)據(jù)庫(kù)一致性所需的信息。 ( 2)重做日志文件( redo log files):包含了當(dāng)系統(tǒng)崩潰后進(jìn)行恢復(fù)所需記錄的變化信息。 ( 3)數(shù)據(jù)文件( data files):包含了數(shù)據(jù)庫(kù)中真正的數(shù)據(jù)。 1.7 Oracle其他的關(guān)鍵文件 除了以上 3 類數(shù)據(jù)庫(kù)文件之外, Oracle 服務(wù)還需要其他的一些文件,這些文件不屬于數(shù)據(jù)庫(kù)。其中包括: 初始化參數(shù)文件( parameter files):定義了實(shí)例的特性,如系統(tǒng)全局區(qū)中一些內(nèi)存結(jié)構(gòu)的大小、 DBWR 的個(gè)數(shù)。 Oracle DBA基礎(chǔ)培訓(xùn)教程 14 密碼文件( password files):包含了數(shù)據(jù)庫(kù)管理員或操作員用戶在啟動(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 引入密碼文件的原因。 歸檔重做日志文件 ( archived redo log files):是重做日志文件的脫機(jī)備份。在系統(tǒng)崩潰后進(jìn)行恢復(fù)時(shí)可能需要這些文件。 1.8 建立與 Oracle實(shí)例的連接 Oracle 實(shí)例( instance)是用 Oracle 的 STARTUP 命令啟動(dòng)的(該命令將在后面的章節(jié)中詳細(xì)介紹)。它的啟動(dòng)就意味著 SGA 的所有內(nèi)存結(jié)構(gòu)都已生成,所有必需的后臺(tái)進(jìn)程都已在內(nèi)存中運(yùn)行。那么此時(shí)用戶又是如何使用 Oracle 數(shù)據(jù)庫(kù)呢? 用戶在向 Oracle 數(shù)據(jù)庫(kù)發(fā)出 SQL 命令之前必須與實(shí)例( instance)建立連接。用戶啟動(dòng)一個(gè)工具如 SQL*Plus,或運(yùn)行一個(gè)利用 Oracle 工具開(kāi)發(fā)的應(yīng)用程序,如用 Oracle Forms開(kāi)發(fā)的應(yīng)用程序時(shí),這個(gè)工具或應(yīng)用程序就被作為一個(gè)用戶進(jìn)程來(lái)執(zhí)行。用戶進(jìn)程是不能直接訪問(wèn)數(shù)據(jù)庫(kù)的。 在專用連接的情況下(也是默認(rèn)),當(dāng)一個(gè)用戶登錄 Oracle 服務(wù)器時(shí)(如在 SQL*Plus的提示下輸入用戶名和密碼),如果登錄成功(即用戶名和密碼都準(zhǔn)確無(wú)誤), Oracle 就在服務(wù)器所運(yùn)行的計(jì)算機(jī)上創(chuàng)建一個(gè)服務(wù)器進(jìn)程。在這種連接下,該服務(wù)器進(jìn)程只能為這個(gè)用戶進(jìn)程提供服務(wù)。用戶進(jìn)程與服務(wù)器進(jìn)程是一對(duì)一的關(guān)系。用戶進(jìn)程向服務(wù)器進(jìn)程發(fā)請(qǐng)求,服務(wù)器進(jìn)程對(duì)數(shù)據(jù)庫(kù)進(jìn)行實(shí)際的操作并把所得的結(jié)果返回給用戶進(jìn)程。就好像一個(gè)大富豪想炒股票,但又不懂股票市場(chǎng)的運(yùn)作,于是他請(qǐng)了一位股票經(jīng)紀(jì)人。這位富豪就相當(dāng)于用戶進(jìn)程,而股票經(jīng)紀(jì)人就相當(dāng)于服務(wù)器進(jìn)程,股票市場(chǎng)就相當(dāng)于 Oracle 數(shù)據(jù)庫(kù)。 一個(gè)用戶每次登錄 Oracle 服務(wù)器,如果成功,該用戶就與 Oracle 服務(wù)器建立了連接,而這種連接又叫做會(huì)話。一個(gè)會(huì)話始于用戶成功地登錄 Oracle 服務(wù)器,終止于用戶退出或非正常終止連接。一個(gè)數(shù)據(jù)庫(kù)用戶可能同時(shí)有多個(gè)會(huì)話存在,即用相同的用戶名和密碼同時(shí)登錄多次。 1.9 各種不同的連接方式 連接是用戶進(jìn)程與 Oracle 服務(wù)器之間的通信路徑。與 Oracle 服務(wù)器( server)的 3 種安裝方式相對(duì)應(yīng),一個(gè)數(shù)據(jù)庫(kù)用戶可能用以下 3 種方式之一與 Oracle 服務(wù)器連接。 ( 1)基于主機(jī)方式:此時(shí)的用戶進(jìn)程與服務(wù)器進(jìn)程是在同一臺(tái)計(jì)算機(jī)的相同的操作系統(tǒng)上的,用戶進(jìn)程與 Oracle 服務(wù)器之間的通信路徑是通過(guò)操作系統(tǒng)內(nèi)部進(jìn)程通信( inter process communication, IPC)機(jī)制來(lái)建立的。 ( 2)客戶端 -服務(wù)器( client-server)(兩層模型)方式:用戶進(jìn)程與 Oracle 服務(wù)器之第 1章 Oracle的體系結(jié)構(gòu) 15 間的通信是通過(guò)網(wǎng)絡(luò)協(xié)議(如 TCP/IP)來(lái)完成的。 ( 3)客戶端 -應(yīng)用服務(wù)器 -服務(wù)器( client- application server- server)(三層模型):用戶的個(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ī)相連的。例如,用戶使用瀏覽器通過(guò)網(wǎng)絡(luò)運(yùn)行 NT服務(wù)器上的應(yīng)用程序,而 NT 服務(wù)器又從運(yùn)行在 UNIX 主機(jī)上的 Oracle 數(shù)據(jù)庫(kù)中提取數(shù)據(jù)。 以上所介紹的連接是用戶進(jìn)程與服務(wù)器進(jìn)程的一對(duì)一的連接,也稱為專用服務(wù)器連接( dedicated server connection)。除了這種連接外,在聯(lián)機(jī)事務(wù)處理( online transaction processing, OLTP)系統(tǒng)的配置時(shí)還有另外的一種連接,它在 Oracle 9i 之前的版本中稱為多線程( MTS)連接,在 Oracle 9i 或以后的版本中稱為共享服務(wù)器( shared server)連接。有關(guān)這種連接在 Oracle 的網(wǎng)絡(luò)和調(diào)優(yōu)的書籍中介紹。 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ū)稱為程序全局區(qū)( program global area, PGA)。與 SGA 不同, PGA 是一個(gè)私有的內(nèi)存區(qū),是不能共享的,是只屬于一個(gè)進(jìn)程的。它隨著進(jìn)程的創(chuàng)建而被分配,隨著進(jìn)程的終止而被回收。在專用服務(wù)器進(jìn)程的配置情況下,程序全局區(qū)包括了以下結(jié)構(gòu): ( 1)排序區(qū)( sort area):用于處理 SQL 語(yǔ)句所需的排序。 ( 2)游標(biāo)狀態(tài)區(qū)( cursor state):用于指示會(huì)話當(dāng)前所使用的 SQL 語(yǔ)句的處理狀態(tài)。 ( 3)會(huì)話信息區(qū)( session information):包括了會(huì)話的用戶權(quán)限和優(yōu)化統(tǒng)計(jì)信息。 ( 4)堆棧區(qū)( stack space):包括了其他的會(huì)話變量。 如果是共享服務(wù)器進(jìn)程或多線程的配置,以上這些結(jié)構(gòu)除了堆棧區(qū)外大部分將存在SGA 中。如果有 large pool,它們就會(huì)被存在 large pool,否則它們就會(huì)被存在共享池中。 1.11 Oracle執(zhí)行 SQL查詢語(yǔ)句的步驟 如果用戶在 SQL*Plus 下輸入了如下的查詢語(yǔ)句: SELECT * FROM dept;,那么 Oracle又是如何來(lái)處理這個(gè)語(yǔ)句的呢? SQL語(yǔ)句的執(zhí)行主要由用戶進(jìn)程與服務(wù)器進(jìn)程來(lái)完成,其他的一些進(jìn)程可能要輔助完成這一過(guò)程。查詢語(yǔ)句與其他的 SQL語(yǔ)句有 所不同,如果一個(gè)查詢語(yǔ)句執(zhí)行成功,它要返回查詢的結(jié)果。而其他的 SQL 語(yǔ)句只是返回執(zhí)行成功或失敗的信息。查詢語(yǔ)句的處理主要包括以下 3 個(gè)階段:編譯( parse)、執(zhí)行( execute) 和提取數(shù)據(jù)( fetch) 。 編譯( parse):在進(jìn)行編譯時(shí),服務(wù)器進(jìn)程會(huì)將 SQL 語(yǔ)句的正文放入共享池( shared pool) 的庫(kù)高速緩存( library cache) 中并將完成以下處理: 首先在共享池中搜索是否有相同的 SQL 語(yǔ)句(正文),如果沒(méi)有就進(jìn)行后續(xù)的處理。 檢查該 SQL 語(yǔ)句的語(yǔ)法是否正確。 Oracle DBA基礎(chǔ)培訓(xùn)教程 16 通過(guò)查看數(shù)據(jù)字典來(lái)檢查表和列 的定義。 對(duì)所操作的對(duì)象加編譯鎖( parse locks) 以便在編譯語(yǔ)句期間這些對(duì)象的定義不能被改變。 檢查所引用對(duì)象的用戶權(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é)果返回給用戶(進(jìn)程)。 1.12 共享池( shared pool) SGA 中的共享池( shared pool) 是由庫(kù)高速緩存( library cache) 和數(shù)據(jù)字典高速緩存( data dictionary cache) 兩部分所組成。服務(wù)器進(jìn)程將 SQL(也可能是 PL/SQL) 語(yǔ)句的正文和編譯后的代碼( parsed code) 以及執(zhí)行計(jì)劃都放在共享池( shared pool) 的庫(kù)高速緩存中。在進(jìn)行編譯時(shí),服務(wù)器進(jìn)程首先會(huì)在共享池中搜索是否有相同的 SQL 或 PL/SQL 語(yǔ)句(正文),如果有就不進(jìn)行任何后續(xù)的 編譯處理,而是直接使用已存在的編譯后的代碼和執(zhí)行計(jì)劃。 提示: 庫(kù)高速緩存包含了共享 SQL區(qū)和共享 PL/SQL區(qū)兩部分,它們分別存放 SQL和 PL/SQL語(yǔ)句以及相關(guān)的信息。 要想共享 SQL 或 PL/SQL 語(yǔ)句,第一 , 庫(kù)高速緩存( library cache) 要足夠大,因?yàn)橹挥羞@樣要共享的 SQL 或 PL/SQL 語(yǔ)句才不會(huì)很快地淘汰出內(nèi)存。第二, SQL 或 PL/SQL 語(yǔ)句要是能共享的通用代碼( generic code) ,因?yàn)?Oracle 是通過(guò)比較 SQL 或 PL/SQL 語(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 * from emp where sal = 1500; 和 select * from emp where sal = 1501; 答案是不相同的(在 Oracle 默認(rèn)的配置下, Oracle 8i 和 Oracle 9i 以及更高的版本可以通過(guò)重新設(shè)置 CURSOR_SHARING 參數(shù)來(lái)修改默認(rèn)配置,有興趣的讀者可參閱 Oracle 調(diào)優(yōu)方面的書籍)。 可以通 過(guò)使用綁定變量的方式來(lái)重寫以上的 SQL 語(yǔ)句,如下: select * from emp where sal = &v_sal; 第 1章 Oracle的體系結(jié)構(gòu) 17 這個(gè)語(yǔ)句就是可以共享的通用代碼,因?yàn)樽兞坎皇窃诰幾g階段而是在運(yùn)行階段賦值的。引入庫(kù)高速緩存( library cache) 的目的是共享 SQL 或 PL/SQL 代碼。那么 Oracle 又是怎樣有效地管理庫(kù)高速緩存( library cache) 的呢? Oracle 是使用一個(gè)稱為 LRU( least recently 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ù)高速緩存要足夠大,因?yàn)檫@樣那些可以共享的 SQL 或 PL/SQL 代碼才不會(huì)被很快地淘汰出內(nèi)存。不過(guò) Oracle 并沒(méi)有給出直接設(shè)置庫(kù)高速緩存大小的方法,只能通過(guò)設(shè)置共享池的大小來(lái)間接地設(shè)置庫(kù)高速緩存的大小。 介紹完了庫(kù)高速緩存,接下來(lái)將介紹數(shù)據(jù)字典高速緩存( data dictionary cache) 。當(dāng)Oracle 在執(zhí)行 SQL 語(yǔ)句時(shí),服務(wù)器進(jìn)程將把數(shù)據(jù)文件、表、索引、列、用戶和其他的數(shù)據(jù)對(duì)象的定義和權(quán)限的信息放入數(shù)據(jù)字典高速緩存。如果在這之后,有進(jìn)程(用戶)需要同樣的信息,如表和列的定義,那么所有的這些信息將從數(shù)據(jù)字典高速緩存中獲得。因?yàn)橐陨纤f(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ù)字典高速緩存的大小。在 Oracle 9i 之前的版本,可以通過(guò)修改參數(shù)文件中的 SHARED_POOL_ SIZE 的值來(lái)改變共享池的大小,但一定要重新啟動(dòng) Oracle 數(shù)據(jù)庫(kù)。在 Oracle 9i 或以后的版本中,也可以使用類似于例 1-1 的命令來(lái)改 變共享池的大小: 例 1-1 SQL ALTER SYSTEM SET SHARED_POOL_SIZE = 32M; 系統(tǒng)已更改。 但是所改變共享池的大小受限于 SGA_MAX_SIZE 參數(shù)。這個(gè)參數(shù)將在以后的章節(jié)中詳細(xì)地介紹。 注意: 在本書中采用如下的約定: SQL為 SQL*Plus的提示符。 沒(méi)有陰影的內(nèi)容為要輸入的 SQL 語(yǔ)句或 SQL*Plus 命令等。如在例 1-1 中要輸入ALTER SYSTEM SET SHARED_POOL_SIZE = 32M;。 陰影中的內(nèi)容為系統(tǒng)顯示(輸出)的結(jié)果。如在例 1-1中的“系統(tǒng)已更改?!?。 提示: 即使把共享池設(shè)置得足夠大并且所使用的 SQL 或 PL/SQL 語(yǔ)句也是能共享的代碼,Oracle DBA基礎(chǔ)培訓(xùn)教程 18 Oracle 也并不能一定使用內(nèi)存(共享池)中的代碼。例如當(dāng)有用戶修改了某個(gè)對(duì)象的定義之后,所有使用這個(gè)對(duì)象的內(nèi)存(共享池)中的代碼全部被 Oracle設(shè)置為無(wú)效,因此在使用時(shí)必須重新編譯。 1.13 數(shù)據(jù)庫(kù)高速緩沖區(qū)( database buffer cache) 如果用戶發(fā)出了以下的 SQL 語(yǔ)句: SELECT * FROM emp, Oracle 又是怎樣提取數(shù)據(jù)庫(kù)中的數(shù)據(jù)呢?服務(wù)器進(jìn)程將首先在 數(shù)據(jù)庫(kù)高速緩沖區(qū)( database buffer cache)中搜尋所需的數(shù)據(jù),如果找到了就直接使用而不進(jìn)行磁盤操作,如果沒(méi)找到就將進(jìn)行磁盤操作把數(shù)據(jù)文件中的數(shù)據(jù)讀入到數(shù)據(jù)庫(kù)高速緩沖區(qū)中。 從以上的討論可知,為了能夠共享數(shù)據(jù)庫(kù)中的數(shù)據(jù),數(shù)據(jù)庫(kù)高速緩沖區(qū)要足夠的大,因?yàn)檫@樣那些可以共享的數(shù)據(jù)才不會(huì)被很快地淘汰出內(nèi)存。 Oracle 也是使用一個(gè)叫做 LRU( least recently used)的隊(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ū)的大小。其中 DB_BLOCK_SIZE 為 Oracle 數(shù)據(jù)塊(內(nèi)存緩沖區(qū))的大小,在Oracle 數(shù)據(jù)庫(kù)中內(nèi)存和外存的數(shù)據(jù)塊的大小是相同的。 DB_BLOCK_BUFFERS 為內(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ù)。在 Oracle 9i 或以后的版本中, Oracle 引入了另一個(gè)參數(shù) DB_CACHE_SIZE,這個(gè)參數(shù)是一個(gè)動(dòng)態(tài)參數(shù),即可以在數(shù)據(jù)庫(kù)運(yùn)行時(shí)動(dòng)態(tài)地改變?cè)搮?shù)??梢允褂妙愃朴?例 1-2 的命令來(lái)改變數(shù)據(jù)庫(kù)高速緩沖區(qū)的大?。?例 1-2 SQL ALTER SYSTEM SET DB_CACHE_SIZE = 48M; 系統(tǒng)已更改。 1.14 內(nèi)存緩沖區(qū)顧問(wèn)( v$db_cache_advice) Oracle 9i 或以后的版本還提供了一個(gè)稱為內(nèi)存緩沖區(qū)顧問(wèn)( v$db_cache_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)銷。 ( 2) READY:該工具關(guān)閉,為該工具分配內(nèi)存但不進(jìn)行統(tǒng)計(jì)信息的收集,因此沒(méi)有CPU 的開(kāi)銷。 ( 3) OFF:該工具關(guān)閉,不為該工具分配內(nèi)存也不進(jìn)行 統(tǒng)計(jì)信息的收集,因此既沒(méi)有內(nèi)存的開(kāi)銷也沒(méi)有 CPU 開(kāi)銷。 第 1章 Oracle的體系結(jié)構(gòu) 19 可以通過(guò)修改初始化參數(shù) DB_CACHE_ADVICE 的值來(lái)改變?cè)摴ぞ叩臓顟B(tài)。這一 參數(shù)是一個(gè)動(dòng)態(tài)參數(shù),因此可以使用 ALTER SYSTEM 命令來(lái)修改。 例如可以利用類似于例 1-3的 SQL 語(yǔ)句來(lái)查看它的 狀態(tài): 例 1-3 SQL select id, 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行。 此時(shí),例 1-3 的顯示結(jié)果表明了 內(nèi)存緩沖區(qū)顧問(wèn)是在開(kāi)啟狀態(tài)。 提示: 顯示結(jié)果中的 表示省略了一些行的顯示。 之后可以使用類似于例 1-4 的命令將內(nèi)存緩沖區(qū)顧問(wèn)( v$db_cache_advice)工具關(guān)閉: 例 1-4 SQL alter system set db_cache_advice = off; 系統(tǒng)已更改。 這時(shí)可以再使用類似于例 1-5 的 SQL 語(yǔ)句來(lái)查看它的 狀態(tài): 例 1-5 SQL 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行。 此時(shí),例 1-5 的顯示結(jié)果表明已成功地關(guān)閉了 內(nèi)存緩沖區(qū)顧問(wèn)( 詳細(xì)地介紹該工具的Oracle DBA基礎(chǔ)培訓(xùn)教程 20 使用已超出了本書的范圍,有興趣的讀者可參閱 Oracle 9i/10g 調(diào)優(yōu)方面的書籍)。 1.15 重做日志緩沖區(qū)( redo log buffer) 從理論上來(lái)講,如果數(shù)據(jù)庫(kù)不會(huì)崩潰,根本沒(méi)有必要引入重做日志緩沖區(qū)( redo log buffer)。引入重做日志緩沖區(qū)的主要目的(在 Oracle 8i 之前的版本中也是惟一的目的)就是數(shù)據(jù)的恢復(fù)。 Oracle 在使用任何 DML 或 DDL 操作改變數(shù)據(jù)之前都將恢復(fù)所需的信息,即在寫數(shù)據(jù)庫(kù)高速緩沖區(qū)之前,先寫入重做日志緩沖區(qū)。 與執(zhí)行查詢語(yǔ)句有所不同, Oracle在執(zhí)行 DML語(yǔ)句時(shí)只有編譯( parse)和執(zhí)行( execute)兩個(gè)階段。以下是 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ū)中。 ( 4) Oracle 服務(wù)器進(jìn)程將回滾所需的原始值和對(duì)數(shù)據(jù)所做的修改都寫入數(shù)據(jù)庫(kù)高速 緩沖區(qū)( database buffer cache)。之后在數(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ù)在本書的后面章節(jié)中還要介紹,讀者也可以參閱筆者的另一本書從實(shí)踐中學(xué)習(xí) Oracle/SQL一書 12.20節(jié)的 258 259頁(yè)。 1.16 大池( large pool)和 Java池( Java pool) 除了以上所介紹的內(nèi)存結(jié)構(gòu)之外, SGA 中還有可能包含 large pool 和 Java pool 兩個(gè)可選的內(nèi)存結(jié)構(gòu)。 引入 large pool 的主要目的應(yīng)該是提高效率。 large pool 是一個(gè)相對(duì)比較簡(jiǎn)單的內(nèi)存結(jié)構(gòu),與 shared pool 不同的是它沒(méi)有 LRU 隊(duì)列。在多線程( MTS)或共享服務(wù)器( shared server)連接時(shí), Oracle 服務(wù)器進(jìn)程的 PGA 的大部分區(qū)域(也叫 UGA)將放入 large pool( stack space 除外)。另外在大規(guī)模 I/O 及備份和恢復(fù)操作時(shí)可能使用該區(qū)??梢酝ㄟ^(guò)設(shè)置參數(shù)LARGE_POOL_SIZE 的值來(lái)配置 large pool 的大小。該參數(shù)也是一個(gè)動(dòng)態(tài)參數(shù)。 引入 Java pool 的目的是能夠編譯 Java 語(yǔ)言的命令。如果要使用 Java 語(yǔ)言就必須設(shè)置Java pool。 Java 語(yǔ)言在 Oracle 數(shù)據(jù)庫(kù)中的存儲(chǔ)與 PL/SQL 語(yǔ)言幾乎完全相同??梢酝ㄟ^(guò)設(shè)置參數(shù) JAVA_POOL_SIZE 的值來(lái)配置 Java pool 的大小。其數(shù)字的單位是字節(jié)( bytes)。在 Oracle 9i 中 Java pool 的默 認(rèn)大小為 24MB。 第 1章 Oracle的體系結(jié)構(gòu) 21 1.17 內(nèi)存緩沖區(qū)大小的設(shè)定 在 Oracle 9i 之前的版本中,只能通過(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ù)。 在 Oracle 9i 以后的版本中, SGA 為動(dòng)態(tài)的。 SGA 中的內(nèi)存緩沖區(qū),如 數(shù)據(jù)庫(kù)高速緩沖區(qū)( database buffer cache)和共享池( shared pool) 等都可以動(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ò) ALTER SYSTEM SET 命令來(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 show parameter 該命令將顯示出參數(shù)文件中可以設(shè) 置的全部 參數(shù)。另外也 可以使用例 1-7 的命令來(lái)獲得 SGA 的相關(guān)信息: 例 1-7 SQL show sga Total System Global Area 122755896 bytes Fixed Size 453432 bytes Variable Size 71303168 bytes Database Buffers 50331648 bytes Redo Buffers 667648 bytes Oracle DBA基礎(chǔ)培訓(xùn)教程 22 也可以先使用例 1-8 和例 1-9 的 SQL*Plus 命令來(lái)格式化顯示輸出: 例 1-8 SQL col name for a20 例 1-9 SQL col value for a25 之后,利用數(shù)據(jù)字典 v$parameter 使用例 1-10 的 SQL 查詢語(yǔ)句來(lái)獲得 參數(shù)SGA_MAX_SIZE 的值: 例 1-10 SQL select name, type, value 2 from v$parameter 3 where name = sga_max_size; NAME TYPE VALUE - - - sga_max_size 6 122755896 介紹完了 SGA 的各個(gè)部分內(nèi)存緩沖區(qū)之后,下面開(kāi)始詳細(xì)地討論 Oracle 的主要后臺(tái)進(jìn)程。 1.19 重做日志寫進(jìn)程( LGWR)及快速 提交( fast commit) 重做日志寫進(jìn)程( LOG writer, LGWR) 負(fù)責(zé)將重做日志緩沖區(qū)的記錄順序地寫到重做日志文件中。為了更好地理解 LOG writer 的操作原理,在這里先介紹一下 Oracle 提交( commit) 語(yǔ)句是如何工作的。 Oracle 服務(wù)器是使用了一種稱為快速提交( fast commit)的技術(shù),該技術(shù)既能保證 Oracle系統(tǒng)的效率又能保證在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)可以得到恢復(fù)。為此 Oracle 系統(tǒng)引入了系統(tǒng)變化數(shù)( system change number, 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)碼)一起寫入重做日志緩沖區(qū)中。 ( 2)重做日志寫進(jìn)程( LGWR) 將把重做日志緩沖區(qū)中一直到所提交的記錄(包括該記錄)的所 有記錄連續(xù)地寫到重做日志文件中。在此之后, Oracle 服務(wù)器就可以保證即使第 1章 Oracle的體系結(jié)構(gòu) 23 在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)也可以得到恢復(fù)。 ( 3) Oracle 通知用戶(進(jìn)程)提交已經(jīng)完成。 ( 4)服務(wù)器進(jìn)程將修改數(shù)據(jù)庫(kù)高速緩沖區(qū)中的相關(guān)數(shù)據(jù)的狀態(tài)并釋放資源和打開(kāi) 鎖等。 此時(shí)可能這些 數(shù)據(jù)并未被寫到數(shù)據(jù) 文件中,這時(shí)這些 數(shù)據(jù)緩沖區(qū)被標(biāo)為臟緩沖區(qū),因?yàn)橄嗤臄?shù)據(jù)在內(nèi)外存中為不同的版本。數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù)據(jù)是由 DBWR 寫到數(shù)據(jù)文件中的。 曾有不少學(xué)生問(wèn)過(guò)這樣一個(gè)問(wèn)題:“為什么不同時(shí)寫兩個(gè)數(shù)據(jù)文件呢?” Oracle 的這種解決 方案的最大好處是在保證不丟失數(shù)據(jù)的同時(shí)數(shù)據(jù)庫(kù)的效率不會(huì)受到很大影響。因?yàn)橹刈鋈罩疚募械挠涗浭且宰罹o湊的格式存放的,所以它的 I/O 量要比對(duì)數(shù)據(jù)文件的操作少得多。另外 LGWR 是順序地將重做日志緩沖區(qū)中的記錄寫到重做日志文件中的,這樣其I/O 速度要比將數(shù)據(jù)塊寫到數(shù)據(jù)文件中快得多。 重做日志寫進(jìn)程 ( LGWR) 要在下列情況 下將重做日志 緩沖區(qū)的記錄(內(nèi)存)順序地寫到重做日志文件(外存)中: 當(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ù)塊寫到數(shù)據(jù) 文件之前。 每 3 秒鐘。 因?yàn)樵谶M(jìn)行數(shù)據(jù)庫(kù)恢復(fù)時(shí)需要重做日志數(shù)據(jù),所以重做日志寫進(jìn)程( LGWR) 只有在重做日志數(shù)據(jù)寫到重做日志文件(磁盤)上時(shí)才能確定提交已經(jīng)完成。在 Oracle 8i 之前的版本中,重做日志數(shù)據(jù)的惟一目的和用處就是數(shù)據(jù)庫(kù)恢復(fù)。 Oracle 在 Oracle 8i 的版本中引入了一個(gè)叫做重做日志挖掘器( logminer)的工具。該工具可以將重做日志文件或歸檔重做日志文件中的數(shù)據(jù)轉(zhuǎn)換成用戶能理解的正文信息。在 Oracle 8i 中,該工具只有命令行 操作方式。 Oracle 9i 加強(qiáng)了此工具的功能并引入了一個(gè)稱為日志挖掘?yàn)g覽器( logminer viewer)的圖形界面。 1.20 數(shù)據(jù)庫(kù)寫進(jìn)程( DBWR/DBWn) 在本章開(kāi)始時(shí)曾介紹過(guò)數(shù)據(jù)庫(kù)的典型操作就是大規(guī)模的輸入 /輸出( I/O)。因此為了提高 Oracle 系統(tǒng)的效率,一要減少 I/O 量,這可能是 Oracle 引入 LGWR 的原因之一;二要減少 I/O 次數(shù),這可能是 Oracle 引入數(shù)據(jù)庫(kù)寫進(jìn)程( DBWR/DBWn)的主要原因。 提示: 在 Oracle的英文書中有些將“數(shù)據(jù)庫(kù)寫進(jìn)程”用 DBWR 表示,有些將 它用 DBWn 表示。這是因?yàn)樵谝粋€(gè) Oracle實(shí)例中可以啟動(dòng)多個(gè)數(shù)據(jù)庫(kù)寫進(jìn)程,特別是在要進(jìn)行大規(guī)模輸入 /輸出并且運(yùn)行在多 CPU 計(jì)算機(jī)上的 Oracle 數(shù)據(jù)庫(kù)系統(tǒng)。 Oracle 允許在一個(gè)實(shí)例上最多Oracle DBA基礎(chǔ)培訓(xùn)教程 24 啟動(dòng) 10個(gè)數(shù)據(jù)庫(kù)寫進(jìn)程,它們分別是 DBW0 DBW9。 數(shù)據(jù)庫(kù)寫進(jìn)程 負(fù)責(zé)將 數(shù)據(jù)庫(kù)高速緩沖區(qū)中的臟緩沖區(qū)中的數(shù)據(jù)寫到數(shù)據(jù)文件上。為了提高效率,數(shù)據(jù)庫(kù)寫進(jìn)程并不是數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù)據(jù)一有變化就寫數(shù)據(jù)文件,而是積累了足夠多的數(shù)據(jù)一次寫一大批內(nèi)存數(shù)據(jù)塊到數(shù)據(jù)文件上。 數(shù)據(jù)庫(kù)寫進(jìn)程將在下列事件之一發(fā)生時(shí)把數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù) 據(jù)寫到數(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)( read only)時(shí)。 當(dāng)使用類似于 ALTER TABLESPACE users BEGIN BACKUP 的命令對(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)得及寫到磁盤中的信息都將丟失,如有些已經(jīng)提交的數(shù)據(jù)還沒(méi)有真正地被寫到數(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ù)工作。其步驟如下: ( 1)執(zhí)行前滾( roll forward) ,即將已經(jīng)寫到重做日志文件中但還沒(méi)寫到數(shù)據(jù)文件中的提交數(shù)據(jù)寫到數(shù)據(jù)文件中( Oracle 是用 SCN 號(hào)碼來(lái)識(shí)別提交記錄的)。 ( 2)在前滾完成后立即打開(kāi)數(shù)據(jù)庫(kù),此時(shí)用戶就可以 登錄并使用數(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í)行如下的磁盤空間的維護(hù)工作 : 回收或組合數(shù)據(jù)文件中相連的空閑區(qū)。 釋放臨時(shí)段(在執(zhí)行 SQL 語(yǔ)句時(shí)用作排序的磁盤區(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)程第 1章 Oracle的體系結(jié)構(gòu) 25 監(jiān)督進(jìn)程( PMON) 將負(fù)責(zé)它的清理工作。 PMON 進(jìn)程將負(fù)責(zé)進(jìn)行如下的清理工作: 回滾用戶當(dāng)前的事務(wù)。 釋放用戶所加的所有表一級(jí)和行一級(jí)的鎖。 釋放用戶所有的其他資源等。 1.23 校驗(yàn)點(diǎn)( checkpoint)和校驗(yàn)點(diǎn)進(jìn)程 Oracle 系統(tǒng)為了提高系統(tǒng)的效率和數(shù)據(jù)庫(kù)的一致性,引入了一個(gè)稱為校驗(yàn)點(diǎn)的事件。該事件是在當(dāng) DBWR 進(jìn)程把在 SGA 中所有已經(jīng)改變了的數(shù)據(jù)庫(kù)高速緩沖區(qū)中的數(shù)據(jù)(包括提交的和沒(méi)提交的數(shù)據(jù))寫到數(shù)據(jù)文件上時(shí)產(chǎn)生。從理論上講校驗(yàn)點(diǎn)( checkpoint)和校驗(yàn)點(diǎn)進(jìn)程可以完全不需要,因?yàn)?Oracle 系統(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ù)都已寫到了數(shù)據(jù)文件中,在實(shí)例恢復(fù)時(shí)校驗(yàn)點(diǎn)之前的重做日志 記錄已經(jīng)不再需要,這樣 實(shí)例

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論