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

付費下載

下載本文檔

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

文檔簡介

第 1 章 Oracle的體系結(jié)構(gòu) 這一章的內(nèi)容是比較枯燥的,但它是理解以后章節(jié)的基礎(chǔ)。如果有讀者在開始時有些內(nèi)容沒有完全理解也不用太著急,可以繼續(xù)學(xué)習(xí)后面的內(nèi)容,等使用了一段時間 Oracle系統(tǒng)之后,一些概念就變得容易理解了。 1.1 Oracle引入復(fù)雜的體系結(jié)構(gòu)的原因 數(shù)據(jù)庫管理系統(tǒng)引入非常復(fù)雜的內(nèi)存和外存體系結(jié)構(gòu)的主要原因是有效地管理稀有的系統(tǒng)資源。資源不足不只是數(shù)據(jù)庫管理系統(tǒng)所面對的。其實,在我們五千年的人類發(fā)展歷史中,我們的祖先們一直在同資源不足作斗爭。歷史上糧食和土地等一直都是稀有資源,還記得我 們的祖先們用什么方法來管理這些稀有資源的嗎?用戰(zhàn)爭,我們的先民們?yōu)榧Z食而戰(zhàn),為土地而戰(zhàn);我們當代人類為石油而戰(zhàn),為市場而戰(zhàn),為金錢而戰(zhàn)。 那么在 Oracle 數(shù)據(jù)庫中什么是稀有資源?它們又是如何來管理的呢?如果讀者接觸過數(shù)據(jù)庫或讀過相關(guān)的書,應(yīng)該還有印象,數(shù)據(jù)庫的數(shù)據(jù)量和輸入 /輸出量都是相當大的,而這些數(shù)據(jù)一般都存在硬盤(外存)上,因此硬盤為數(shù)據(jù)庫的一類資源。為了方便介紹, 圖 1-1 給出了硬盤的內(nèi)部結(jié)構(gòu)示意圖。 旋轉(zhuǎn)軸 磁頭移動臂 硬盤面 磁頭 圖 1-1 從圖 1-1 可以看出 ,所有硬盤上數(shù)據(jù)的訪問都是靠硬盤的旋轉(zhuǎn)和磁頭的移動來完成的,第 1章 Oracle的體系結(jié)構(gòu) 11 這種旋轉(zhuǎn)和移動是機械運動。因為在計算機中所有數(shù)據(jù)的修改操作必須在內(nèi)存中進行,所以內(nèi)存也是數(shù)據(jù)庫的一類資源。表 1-1 給出內(nèi)存和外存的簡單比較以幫助讀者理解本書的內(nèi)容。 表 1-1 內(nèi) 存 外存(硬盤) 數(shù)據(jù)訪問速度 很快 很慢 存儲的數(shù)據(jù) 臨時 永久 價錢 很貴 相當便宜 從表 1-1 的比較可知,內(nèi)存的數(shù)據(jù)訪問速度要比外存(硬盤)快得多。這是因為內(nèi)存的數(shù)據(jù)訪問是電子速度,而硬盤的數(shù)據(jù)訪問主要取決于機械速度。也就是說,如果一個數(shù)據(jù)庫管 理系統(tǒng)能夠使絕大多數(shù)(如 90%以上)數(shù)據(jù)操作在內(nèi)存中完成,那么這一數(shù)據(jù)庫管理系統(tǒng)的效率將非常高。但是由于內(nèi)存中的數(shù)據(jù)在斷電或出現(xiàn)系統(tǒng)故障時會消失,所以數(shù)據(jù)庫管理系統(tǒng)還必須保證,所有的數(shù)據(jù)改動都必須及時寫到硬盤上,以保障不會丟失數(shù)據(jù);即使數(shù)據(jù)庫崩潰之后,所有提交過的數(shù)據(jù)都能得到完全恢復(fù)。盡管可以通過加大內(nèi)存來提高數(shù)據(jù)庫管理系統(tǒng)的效率,但在大多數(shù)情況下信息系統(tǒng)的開發(fā)和維護經(jīng)費都是有限的。 通過以上的討論,讀者應(yīng)該意識到,在數(shù)據(jù)庫管理系統(tǒng)中最寶貴的稀有資源是內(nèi)存。為了高效地使用內(nèi)存這種稀有資源,同時保證不會丟失任 何數(shù)據(jù)庫中的數(shù)據(jù), Oracle 數(shù)據(jù)庫管理系統(tǒng)引入了一個非常復(fù)雜的體系結(jié)構(gòu)。 1.2 Oracle數(shù)據(jù)庫中常用的術(shù)語 為了講解容易,在詳細討論 Oracle 體系結(jié)構(gòu)之前,先介紹一下相關(guān)的名詞和術(shù)語。在這里只給出實用的解釋,并不追求學(xué)術(shù)上的嚴謹。 進程( process):一段在內(nèi)存中正在運行的程序。如果沒有學(xué)過計算機操作系統(tǒng)相關(guān)課程,可以把進程想象成能夠自動完成某些特定任務(wù)的任何東西,如訓(xùn)練有素的狗狗、跑龍?zhí)椎牡取?后臺進程( background process):進程的一種,在內(nèi)存中運行時,不占顯示,而且它的 優(yōu)先級比前臺進程低。可以只有一個前臺進程,但可以有多個后臺進程。 緩沖區(qū)( buffer):一段用來臨時存儲數(shù)據(jù)的內(nèi)存區(qū)。 主機( host):計算機系統(tǒng)的另一個稱呼。 服務(wù)器( server):一臺在網(wǎng)絡(luò)中向其他計算機系統(tǒng)提供一項或多項服務(wù)的主機。 客戶機( client):一臺使用由服務(wù)器( server)提供服務(wù)的計算機系統(tǒng)。 1.3 Oracle數(shù)據(jù)庫管理系統(tǒng)的體系結(jié)構(gòu) 為了能使 Oracle 數(shù)據(jù)庫管理系統(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 二 進 制 文 件 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 二 進 制 p a r a m e t e r p a s s w o r d 正 文 文 件 二 進 制 文 件 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 以上這個復(fù)雜的體系結(jié)構(gòu)主要包括 Oracle 服務(wù)器( server)(而服務(wù)器又是由 Oracle實例( instance)和 Oracle 數(shù)據(jù)庫( database)組成),還包括一些其他的關(guān)鍵文件、用戶進程和服務(wù)器進程等。 Oracle 服務(wù)器( server)由 Oracle 實例( instance)和 Oracle 數(shù)據(jù)庫( database)兩大部分組成。它是一個數(shù)據(jù)庫管理系統(tǒng),提供了一致、開放和多樣的信息管理的方法和途徑。服務(wù)器中的一些結(jié)構(gòu)并不在處理 SQL 語句時使用,它們是為了改進數(shù) 據(jù)庫系統(tǒng)的效率或數(shù)據(jù)的恢復(fù)等而設(shè)計的。 1.4 Oracle服務(wù)器( server) Oracle 服務(wù)器( server)可以有以下 3 種安裝方式。 ( 1)基于主機方式:在此種配置下,用戶直接在安裝了數(shù)據(jù)庫的計算機上登錄 Oracle第 1章 Oracle的體系結(jié)構(gòu) 13 數(shù)據(jù)庫。 ( 2)客戶端 -服務(wù)器( client-server)(兩層模型)方式:數(shù)據(jù)庫和客戶終端分別安裝在不同的計算機上,用戶通過網(wǎng)絡(luò)從個人計算機(客戶端)上訪問數(shù)據(jù)庫。 ( 3)客戶端 -應(yīng)用服務(wù)器 -服務(wù)器( client- application server-server)(三層模型) :用戶首先從自己的個人計算機登錄應(yīng)用服務(wù)器,再通過應(yīng)用服務(wù)器訪問真正的數(shù)據(jù)庫。 1.5 Oracle實例( instance) Oracle 實例( instance)是一種訪問數(shù)據(jù)庫的機制,它是由內(nèi)存結(jié)構(gòu)和一些后臺進程組成的。它的內(nèi)存結(jié)構(gòu)也稱為系統(tǒng)全局區(qū)( system global area, SGA)。系統(tǒng)全局區(qū)是實例的最基本的部件之一。實例的后臺進程中有 5 個是必需的,即這 5 個后臺進程中的任何一個沒有啟動,實例將自動關(guān)閉。這 5 個后臺進程分別是 SMON、 PMON、 DBWR、 LGWR 和CKPT。在 OCP 考題中有時 可能會問哪些后臺進程是可選的?除了這 5 個都是可選的。實例一啟動就分配系統(tǒng)全局區(qū)和啟動所需的后臺進程。這里應(yīng)該指出的是,每個實例只能操作一個數(shù)據(jù)庫,而且它不可以操作其他的數(shù)據(jù)庫。但是反過來是不成立的,因為一個數(shù)據(jù)庫可以同時被幾個實例操作(在 Oracle 集群中)。 系統(tǒng)全局區(qū)( SGA)中包含了以下幾個內(nèi)存結(jié)構(gòu):共享池( shared pool)、數(shù)據(jù)庫高速緩沖區(qū)( database buffer cache)、重做日志緩沖區(qū)( redo log buffer)和其他的一些結(jié)構(gòu)(如鎖和統(tǒng)計數(shù)據(jù))等。 1.6 Oracle數(shù)據(jù)庫 Oracle 數(shù)據(jù)庫是數(shù)據(jù)的一個集合, Oracle 把這些數(shù)據(jù)作為一個完整的單位來處理。Oracle 數(shù)據(jù)庫也叫做物理(外存)結(jié)構(gòu),它為數(shù)據(jù)庫信息提供了真正的物理存儲,它是由以下 3 類操作系統(tǒng)文件組成的。 ( 1)控制文件( control files):包含了維護和校驗數(shù)據(jù)庫一致性所需的信息。 ( 2)重做日志文件( redo log files):包含了當系統(tǒng)崩潰后進行恢復(fù)所需記錄的變化信息。 ( 3)數(shù)據(jù)文件( data files):包含了數(shù)據(jù)庫中真正的數(shù)據(jù)。 1.7 Oracle其他的關(guān)鍵文件 除了以上 3 類數(shù)據(jù)庫文件之外, Oracle 服務(wù)還需要其他的一些文件,這些文件不屬于數(shù)據(jù)庫。其中包括: 初始化參數(shù)文件( parameter files):定義了實例的特性,如系統(tǒng)全局區(qū)中一些內(nèi)存結(jié)構(gòu)的大小、 DBWR 的個數(shù)。 Oracle DBA基礎(chǔ)培訓(xùn)教程 14 密碼文件( password files):包含了數(shù)據(jù)庫管理員或操作員用戶在啟動和關(guān)閉實例時所需的密碼。雖然 Oracle 數(shù)據(jù)庫提供了相當完善的安全管理機制,但是在Oracle 數(shù)據(jù)庫沒有開啟時如何驗證要啟動數(shù)據(jù)庫的人是真正的數(shù)據(jù)庫管理員或操作員呢?這就是 Oracle 引入密碼文件的原因。 歸檔重做日志文件 ( archived redo log files):是重做日志文件的脫機備份。在系統(tǒng)崩潰后進行恢復(fù)時可能需要這些文件。 1.8 建立與 Oracle實例的連接 Oracle 實例( instance)是用 Oracle 的 STARTUP 命令啟動的(該命令將在后面的章節(jié)中詳細介紹)。它的啟動就意味著 SGA 的所有內(nèi)存結(jié)構(gòu)都已生成,所有必需的后臺進程都已在內(nèi)存中運行。那么此時用戶又是如何使用 Oracle 數(shù)據(jù)庫呢? 用戶在向 Oracle 數(shù)據(jù)庫發(fā)出 SQL 命令之前必須與實例( instance)建立連接。用戶啟動一個工具如 SQL*Plus,或運行一個利用 Oracle 工具開發(fā)的應(yīng)用程序,如用 Oracle Forms開發(fā)的應(yīng)用程序時,這個工具或應(yīng)用程序就被作為一個用戶進程來執(zhí)行。用戶進程是不能直接訪問數(shù)據(jù)庫的。 在專用連接的情況下(也是默認),當一個用戶登錄 Oracle 服務(wù)器時(如在 SQL*Plus的提示下輸入用戶名和密碼),如果登錄成功(即用戶名和密碼都準確無誤), Oracle 就在服務(wù)器所運行的計算機上創(chuàng)建一個服務(wù)器進程。在這種連接下,該服務(wù)器進程只能為這個用戶進程提供服務(wù)。用戶進程與服務(wù)器進程是一對一的關(guān)系。用戶進程向服務(wù)器進程發(fā)請求,服務(wù)器進程對數(shù)據(jù)庫進行實際的操作并把所得的結(jié)果返回給用戶進程。就好像一個大富豪想炒股票,但又不懂股票市場的運作,于是他請了一位股票經(jīng)紀人。這位富豪就相當于用戶進程,而股票經(jīng)紀人就相當于服務(wù)器進程,股票市場就相當于 Oracle 數(shù)據(jù)庫。 一個用戶每次登錄 Oracle 服務(wù)器,如果成功,該用戶就與 Oracle 服務(wù)器建立了連接,而這種連接又叫做會話。一個會話始于用戶成功地登錄 Oracle 服務(wù)器,終止于用戶退出或非正常終止連接。一個數(shù)據(jù)庫用戶可能同時有多個會話存在,即用相同的用戶名和密碼同時登錄多次。 1.9 各種不同的連接方式 連接是用戶進程與 Oracle 服務(wù)器之間的通信路徑。與 Oracle 服務(wù)器( server)的 3 種安裝方式相對應(yīng),一個數(shù)據(jù)庫用戶可能用以下 3 種方式之一與 Oracle 服務(wù)器連接。 ( 1)基于主機方式:此時的用戶進程與服務(wù)器進程是在同一臺計算機的相同的操作系統(tǒng)上的,用戶進程與 Oracle 服務(wù)器之間的通信路徑是通過操作系統(tǒng)內(nèi)部進程通信( inter process communication, IPC)機制來建立的。 ( 2)客戶端 -服務(wù)器( client-server)(兩層模型)方式:用戶進程與 Oracle 服務(wù)器之第 1章 Oracle的體系結(jié)構(gòu) 15 間的通信是通過網(wǎng)絡(luò)協(xié)議(如 TCP/IP)來完成的。 ( 3)客戶端 -應(yīng)用服務(wù)器 -服務(wù)器( client- application server- server)(三層模型):用戶的個人計算機通過網(wǎng)絡(luò)與應(yīng)用服務(wù)器或網(wǎng)絡(luò)服務(wù)器通信,而這個應(yīng)用服務(wù)器或網(wǎng)絡(luò)服務(wù)器又是通過網(wǎng)絡(luò)與運行數(shù)據(jù)庫的計算機相連的。例如,用戶使用瀏覽器通過網(wǎng)絡(luò)運行 NT服務(wù)器上的應(yīng)用程序,而 NT 服務(wù)器又從運行在 UNIX 主機上的 Oracle 數(shù)據(jù)庫中提取數(shù)據(jù)。 以上所介紹的連接是用戶進程與服務(wù)器進程的一對一的連接,也稱為專用服務(wù)器連接( dedicated server connection)。除了這種連接外,在聯(lián)機事務(wù)處理( online transaction processing, OLTP)系統(tǒng)的配置時還有另外的一種連接,它在 Oracle 9i 之前的版本中稱為多線程( MTS)連接,在 Oracle 9i 或以后的版本中稱為共享服務(wù)器( shared server)連接。有關(guān)這種連接在 Oracle 的網(wǎng)絡(luò)和調(diào)優(yōu)的書籍中介紹。 1.10 服務(wù)器進程 當 Oracle 創(chuàng)建一個服務(wù)器進程的同時要為該服務(wù)器進程分配一個內(nèi)存區(qū),這個內(nèi)存區(qū)稱為程序全局區(qū)( program global area, PGA)。與 SGA 不同, PGA 是一個私有的內(nèi)存區(qū),是不能共享的,是只屬于一個進程的。它隨著進程的創(chuàng)建而被分配,隨著進程的終止而被回收。在專用服務(wù)器進程的配置情況下,程序全局區(qū)包括了以下結(jié)構(gòu): ( 1)排序區(qū)( sort area):用于處理 SQL 語句所需的排序。 ( 2)游標狀態(tài)區(qū)( cursor state):用于指示會話當前所使用的 SQL 語句的處理狀態(tài)。 ( 3)會話信息區(qū)( session information):包括了會話的用戶權(quán)限和優(yōu)化統(tǒng)計信息。 ( 4)堆棧區(qū)( stack space):包括了其他的會話變量。 如果是共享服務(wù)器進程或多線程的配置,以上這些結(jié)構(gòu)除了堆棧區(qū)外大部分將存在SGA 中。如果有 large pool,它們就會被存在 large pool,否則它們就會被存在共享池中。 1.11 Oracle執(zhí)行 SQL查詢語句的步驟 如果用戶在 SQL*Plus 下輸入了如下的查詢語句: SELECT * FROM dept;,那么 Oracle又是如何來處理這個語句的呢? SQL語句的執(zhí)行主要由用戶進程與服務(wù)器進程來完成,其他的一些進程可能要輔助完成這一過程。查詢語句與其他的 SQL語句有 所不同,如果一個查詢語句執(zhí)行成功,它要返回查詢的結(jié)果。而其他的 SQL 語句只是返回執(zhí)行成功或失敗的信息。查詢語句的處理主要包括以下 3 個階段:編譯( parse)、執(zhí)行( execute) 和提取數(shù)據(jù)( fetch) 。 編譯( parse):在進行編譯時,服務(wù)器進程會將 SQL 語句的正文放入共享池( shared pool) 的庫高速緩存( library cache) 中并將完成以下處理: 首先在共享池中搜索是否有相同的 SQL 語句(正文),如果沒有就進行后續(xù)的處理。 檢查該 SQL 語句的語法是否正確。 Oracle DBA基礎(chǔ)培訓(xùn)教程 16 通過查看數(shù)據(jù)字典來檢查表和列 的定義。 對所操作的對象加編譯鎖( parse locks) 以便在編譯語句期間這些對象的定義不能被改變。 檢查所引用對象的用戶權(quán)限。 生成執(zhí)行該 SQL 語句所需的優(yōu)化的執(zhí)行計劃(執(zhí)行步驟)。 將 SQL 語句和執(zhí)行計劃裝入共享的 SQL 區(qū)。 以上的每一步操作都是在處理正確時才進行后續(xù)的處理。如果不正確,就返回錯誤。 執(zhí)行( execute) : Oracle 服務(wù)器進程開始執(zhí)行 SQL 語句是因為它已獲得了執(zhí)行SQL 語句所需的全部資源和信息。 提取數(shù)據(jù)( fetch) : Oracle 服務(wù)器進程選擇所需的數(shù)據(jù)行,并在需要時將其排序,最 后將結(jié)果返回給用戶(進程)。 1.12 共享池( shared pool) SGA 中的共享池( shared pool) 是由庫高速緩存( library cache) 和數(shù)據(jù)字典高速緩存( data dictionary cache) 兩部分所組成。服務(wù)器進程將 SQL(也可能是 PL/SQL) 語句的正文和編譯后的代碼( parsed code) 以及執(zhí)行計劃都放在共享池( shared pool) 的庫高速緩存中。在進行編譯時,服務(wù)器進程首先會在共享池中搜索是否有相同的 SQL 或 PL/SQL 語句(正文),如果有就不進行任何后續(xù)的 編譯處理,而是直接使用已存在的編譯后的代碼和執(zhí)行計劃。 提示: 庫高速緩存包含了共享 SQL區(qū)和共享 PL/SQL區(qū)兩部分,它們分別存放 SQL和 PL/SQL語句以及相關(guān)的信息。 要想共享 SQL 或 PL/SQL 語句,第一 , 庫高速緩存( library cache) 要足夠大,因為只有這樣要共享的 SQL 或 PL/SQL 語句才不會很快地淘汰出內(nèi)存。第二, SQL 或 PL/SQL 語句要是能共享的通用代碼( generic code) ,因為 Oracle 是通過比較 SQL 或 PL/SQL 語句的正文來決定兩個語句是否相同的,只有當兩個語句 的正文完全相同時 Oracle 才重用已存在的編譯后的代碼和執(zhí)行計劃。這里通過以下的實例來進一步解釋這一點。讀者猜如下的兩個 SQL 語句是否相同? select * from emp where sal = 1500; 和 select * from emp where sal = 1501; 答案是不相同的(在 Oracle 默認的配置下, Oracle 8i 和 Oracle 9i 以及更高的版本可以通過重新設(shè)置 CURSOR_SHARING 參數(shù)來修改默認配置,有興趣的讀者可參閱 Oracle 調(diào)優(yōu)方面的書籍)。 可以通 過使用綁定變量的方式來重寫以上的 SQL 語句,如下: select * from emp where sal = &v_sal; 第 1章 Oracle的體系結(jié)構(gòu) 17 這個語句就是可以共享的通用代碼,因為變量不是在編譯階段而是在運行階段賦值的。引入庫高速緩存( library cache) 的目的是共享 SQL 或 PL/SQL 代碼。那么 Oracle 又是怎樣有效地管理庫高速緩存( library cache) 的呢? Oracle 是使用一個稱為 LRU( least recently used)的隊列( list)或算法( algorithm)來實現(xiàn)對庫高速緩存的 管理的。 LRU 隊列的算法大致如下:剛使用的內(nèi)存塊(的地址)放在 LRU 隊列的頭上(最前面),當一個服務(wù)器進程需要庫高速緩存的內(nèi)存空間而又沒有空閑的內(nèi)存空間時,該進程就從 LRU 隊列的尾部(最后面)獲得所需的內(nèi)存塊,這些內(nèi)存塊一旦被使用,它們(的地址)就立即放在 LRU 隊列的最前面。這樣那些長時間沒使用過的內(nèi)存塊將自然地移到 LRU 隊列的尾部而被最先使用。 從以上的討論可知,為了能夠共享 SQL 或 PL/SQL 的代碼,庫高速緩存要足夠大,因為這樣那些可以共享的 SQL 或 PL/SQL 代碼才不會被很快地淘汰出內(nèi)存。不過 Oracle 并沒有給出直接設(shè)置庫高速緩存大小的方法,只能通過設(shè)置共享池的大小來間接地設(shè)置庫高速緩存的大小。 介紹完了庫高速緩存,接下來將介紹數(shù)據(jù)字典高速緩存( data dictionary cache) 。當Oracle 在執(zhí)行 SQL 語句時,服務(wù)器進程將把數(shù)據(jù)文件、表、索引、列、用戶和其他的數(shù)據(jù)對象的定義和權(quán)限的信息放入數(shù)據(jù)字典高速緩存。如果在這之后,有進程(用戶)需要同樣的信息,如表和列的定義,那么所有的這些信息將從數(shù)據(jù)字典高速緩存中獲得。因為以上所說的這些信息都是存在 Oracle 數(shù)據(jù)庫的數(shù)據(jù)字典中,這也可能就是該部 分內(nèi)存叫做數(shù)據(jù)字典高速緩存的原因。 表和列的定義等重用的機會要比 SQL 語句大,因此為了能達到共享這些信息的目的,數(shù)據(jù)字典高速緩存應(yīng)該盡可能設(shè)置得大一些。不過與庫高速緩存一樣, Oracle 并沒有給出直接設(shè)置數(shù)據(jù)字典高速緩存大小的方法,只能通過設(shè)置共享池的大小來間接地設(shè)置數(shù)據(jù)字典高速緩存的大小。在 Oracle 9i 之前的版本,可以通過修改參數(shù)文件中的 SHARED_POOL_ SIZE 的值來改變共享池的大小,但一定要重新啟動 Oracle 數(shù)據(jù)庫。在 Oracle 9i 或以后的版本中,也可以使用類似于例 1-1 的命令來改 變共享池的大?。?例 1-1 SQL ALTER SYSTEM SET SHARED_POOL_SIZE = 32M; 系統(tǒng)已更改。 但是所改變共享池的大小受限于 SGA_MAX_SIZE 參數(shù)。這個參數(shù)將在以后的章節(jié)中詳細地介紹。 注意: 在本書中采用如下的約定: SQL為 SQL*Plus的提示符。 沒有陰影的內(nèi)容為要輸入的 SQL 語句或 SQL*Plus 命令等。如在例 1-1 中要輸入ALTER SYSTEM SET SHARED_POOL_SIZE = 32M;。 陰影中的內(nèi)容為系統(tǒng)顯示(輸出)的結(jié)果。如在例 1-1中的“系統(tǒng)已更改?!?。 提示: 即使把共享池設(shè)置得足夠大并且所使用的 SQL 或 PL/SQL 語句也是能共享的代碼,Oracle DBA基礎(chǔ)培訓(xùn)教程 18 Oracle 也并不能一定使用內(nèi)存(共享池)中的代碼。例如當有用戶修改了某個對象的定義之后,所有使用這個對象的內(nèi)存(共享池)中的代碼全部被 Oracle設(shè)置為無效,因此在使用時必須重新編譯。 1.13 數(shù)據(jù)庫高速緩沖區(qū)( database buffer cache) 如果用戶發(fā)出了以下的 SQL 語句: SELECT * FROM emp, Oracle 又是怎樣提取數(shù)據(jù)庫中的數(shù)據(jù)呢?服務(wù)器進程將首先在 數(shù)據(jù)庫高速緩沖區(qū)( database buffer cache)中搜尋所需的數(shù)據(jù),如果找到了就直接使用而不進行磁盤操作,如果沒找到就將進行磁盤操作把數(shù)據(jù)文件中的數(shù)據(jù)讀入到數(shù)據(jù)庫高速緩沖區(qū)中。 從以上的討論可知,為了能夠共享數(shù)據(jù)庫中的數(shù)據(jù),數(shù)據(jù)庫高速緩沖區(qū)要足夠的大,因為這樣那些可以共享的數(shù)據(jù)才不會被很快地淘汰出內(nèi)存。 Oracle 也是使用一個叫做 LRU( least recently used)的隊列( list)或算法( algorithm)來實現(xiàn)對數(shù)據(jù)庫高速緩沖區(qū)的管理??梢允褂脜?shù)文件中的 DB_BLOCK_SIZE 和 DB_BLOCK_BUFFERS 兩個參數(shù)來設(shè)置數(shù)據(jù)庫高速緩沖區(qū)的大小。其中 DB_BLOCK_SIZE 為 Oracle 數(shù)據(jù)塊(內(nèi)存緩沖區(qū))的大小,在Oracle 數(shù)據(jù)庫中內(nèi)存和外存的數(shù)據(jù)塊的大小是相同的。 DB_BLOCK_BUFFERS 為內(nèi)存緩沖區(qū)的個數(shù)。數(shù)據(jù)庫高速緩沖區(qū)大小為這兩個參數(shù)的乘積。但是 DB_BLOCK_SIZE 的值是在創(chuàng)建數(shù)據(jù)庫時設(shè)定的,如果要改變該參數(shù)的值一般需要重建數(shù)據(jù)庫。因此多數(shù)情況下只能通過改變 DB_BLOCK_BUFFERS 的值來調(diào)整數(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ū)的大?。?例 1-2 SQL ALTER SYSTEM SET DB_CACHE_SIZE = 48M; 系統(tǒng)已更改。 1.14 內(nèi)存緩沖區(qū)顧問( v$db_cache_advice) Oracle 9i 或以后的版本還提供了一個稱為內(nèi)存緩沖區(qū)顧問( v$db_cache_advice)的工具來幫 助獲得調(diào)整數(shù)據(jù)庫高速緩沖區(qū)的統(tǒng)計信息。內(nèi)存緩沖區(qū)顧問一共有 3 種狀態(tài): ( 1) ON:該工具打開,為該工具分配內(nèi)存并進行統(tǒng)計信息的收集。要有一定的內(nèi)存和 CPU 開銷。 ( 2) READY:該工具關(guān)閉,為該工具分配內(nèi)存但不進行統(tǒng)計信息的收集,因此沒有CPU 的開銷。 ( 3) OFF:該工具關(guān)閉,不為該工具分配內(nèi)存也不進行 統(tǒng)計信息的收集,因此既沒有內(nèi)存的開銷也沒有 CPU 開銷。 第 1章 Oracle的體系結(jié)構(gòu) 19 可以通過修改初始化參數(shù) DB_CACHE_ADVICE 的值來改變該工具的狀態(tài)。這一 參數(shù)是一個動態(tài)參數(shù),因此可以使用 ALTER SYSTEM 命令來修改。 例如可以利用類似于例 1-3的 SQL 語句來查看它的 狀態(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行。 此時,例 1-3 的顯示結(jié)果表明了 內(nèi)存緩沖區(qū)顧問是在開啟狀態(tài)。 提示: 顯示結(jié)果中的 表示省略了一些行的顯示。 之后可以使用類似于例 1-4 的命令將內(nèi)存緩沖區(qū)顧問( v$db_cache_advice)工具關(guān)閉: 例 1-4 SQL alter system set db_cache_advice = off; 系統(tǒng)已更改。 這時可以再使用類似于例 1-5 的 SQL 語句來查看它的 狀態(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行。 此時,例 1-5 的顯示結(jié)果表明已成功地關(guān)閉了 內(nèi)存緩沖區(qū)顧問( 詳細地介紹該工具的Oracle DBA基礎(chǔ)培訓(xùn)教程 20 使用已超出了本書的范圍,有興趣的讀者可參閱 Oracle 9i/10g 調(diào)優(yōu)方面的書籍)。 1.15 重做日志緩沖區(qū)( redo log buffer) 從理論上來講,如果數(shù)據(jù)庫不會崩潰,根本沒有必要引入重做日志緩沖區(qū)( redo log buffer)。引入重做日志緩沖區(qū)的主要目的(在 Oracle 8i 之前的版本中也是惟一的目的)就是數(shù)據(jù)的恢復(fù)。 Oracle 在使用任何 DML 或 DDL 操作改變數(shù)據(jù)之前都將恢復(fù)所需的信息,即在寫數(shù)據(jù)庫高速緩沖區(qū)之前,先寫入重做日志緩沖區(qū)。 與執(zhí)行查詢語句有所不同, Oracle在執(zhí)行 DML語句時只有編譯( parse)和執(zhí)行( execute)兩個階段。以下是 Oracle 執(zhí)行 UPDATE 語句的步驟: ( 1) 如果 數(shù)據(jù)和回滾數(shù)據(jù)不在數(shù)據(jù)庫高速緩沖區(qū)中, Oracle 服務(wù)器進程將把它們從數(shù)據(jù)文件中讀到數(shù)據(jù)庫高速緩沖區(qū)中。 ( 2) Oracle 服務(wù)器進程在要修改的數(shù)據(jù)行上加鎖(行一級的鎖)。 ( 3) Oracle 服務(wù)器進程將數(shù)據(jù)的變化信息和回滾所需的信 息都記錄在重做日志緩沖 區(qū)中。 ( 4) Oracle 服務(wù)器進程將回滾所需的原始值和對數(shù)據(jù)所做的修改都寫入數(shù)據(jù)庫高速 緩沖區(qū)( database buffer cache)。之后在數(shù)據(jù)庫高速緩沖區(qū)中所有的這些數(shù)據(jù)塊都將被標為臟緩沖區(qū),因為此時內(nèi)外存的數(shù)據(jù)是不同的(不一致的)。 Oracle 處理 INSERT 或 DELETE 語句的步驟與處理 UPDATE 語句的步驟大體相同。 注意: 有關(guān)回滾數(shù)據(jù)在本書的后面章節(jié)中還要介紹,讀者也可以參閱筆者的另一本書從實踐中學(xué)習(xí) Oracle/SQL一書 12.20節(jié)的 258 259頁。 1.16 大池( large pool)和 Java池( Java pool) 除了以上所介紹的內(nèi)存結(jié)構(gòu)之外, SGA 中還有可能包含 large pool 和 Java pool 兩個可選的內(nèi)存結(jié)構(gòu)。 引入 large pool 的主要目的應(yīng)該是提高效率。 large pool 是一個相對比較簡單的內(nèi)存結(jié)構(gòu),與 shared pool 不同的是它沒有 LRU 隊列。在多線程( MTS)或共享服務(wù)器( shared server)連接時, Oracle 服務(wù)器進程的 PGA 的大部分區(qū)域(也叫 UGA)將放入 large pool( stack space 除外)。另外在大規(guī)模 I/O 及備份和恢復(fù)操作時可能使用該區(qū)??梢酝ㄟ^設(shè)置參數(shù)LARGE_POOL_SIZE 的值來配置 large pool 的大小。該參數(shù)也是一個動態(tài)參數(shù)。 引入 Java pool 的目的是能夠編譯 Java 語言的命令。如果要使用 Java 語言就必須設(shè)置Java pool。 Java 語言在 Oracle 數(shù)據(jù)庫中的存儲與 PL/SQL 語言幾乎完全相同。可以通過設(shè)置參數(shù) JAVA_POOL_SIZE 的值來配置 Java pool 的大小。其數(shù)字的單位是字節(jié)( bytes)。在 Oracle 9i 中 Java pool 的默 認大小為 24MB。 第 1章 Oracle的體系結(jié)構(gòu) 21 1.17 內(nèi)存緩沖區(qū)大小的設(shè)定 在 Oracle 9i 之前的版本中,只能通過設(shè)置初始化參數(shù)文件中的一些參數(shù)來間接地設(shè)置SGA 的大小,如 DB_BLOCK_BUFFERS、 LOG_BUFFER、 SHARED_POOL_SIZE 等。而且所有的這些參數(shù)都是靜態(tài)的,即當修改完初始化參數(shù)文件中這些參數(shù)的值之后必須重新啟動 Oracle 數(shù)據(jù)庫。 在 Oracle 9i 以后的版本中, SGA 為動態(tài)的。 SGA 中的內(nèi)存緩沖區(qū),如 數(shù)據(jù)庫高速緩沖區(qū)( database buffer cache)和共享池( shared pool) 等都可以動態(tài)地增加和減少。 Oracle是利用所謂的區(qū)組( granule) 來管理 SGA 的內(nèi)存的。 區(qū)組( granule) 就是一片連續(xù)的虛擬內(nèi)存區(qū)。區(qū)組是 Oracle 分配和回收內(nèi)存區(qū)的基本單位。 區(qū)組的大小取決于所估計的 SGA 的大小。如果 SGA 的尺寸小于 128MB,區(qū)組的大小就是 4MB。如果 SGA 的尺寸大于或等于 128MB,區(qū)組的大小就為 16MB。 Oracle 數(shù)據(jù)庫一旦啟動, SGA 中的每個內(nèi)存緩沖區(qū)就會獲得所需的區(qū)組。 SGA 中至少包括 3 個區(qū)組:一個是SGA 固定區(qū)(其中包含了重做日志緩沖區(qū));一個是數(shù)據(jù) 庫高速緩沖區(qū);一個是共享池。 Oracle 數(shù)據(jù)庫管理員可通過 ALTER SYSTEM SET 命令來分配和回收區(qū)組。但總的 內(nèi)存大小不能超過參數(shù) SGA_MAX_SIZE 所設(shè)定的值。該參數(shù)的單位是字節(jié)。 動態(tài)分配和回收 內(nèi)存的最大好處是在調(diào)整內(nèi)存緩沖區(qū)大小時不需要重新啟動 數(shù)據(jù)庫。這一點對那些 24 小時運營 7 天營業(yè)的 商業(yè) 數(shù)據(jù)庫是至關(guān)重要的。 1.18 內(nèi)存緩沖區(qū)信息的獲取 可以使用例 1-6 的命令來獲得參數(shù) SGA_MAX_SIZE 的值: 例 1-6 SQL show parameter 該命令將顯示出參數(shù)文件中可以設(shè) 置的全部 參數(shù)。另外也 可以使用例 1-7 的命令來獲得 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 命令來格式化顯示輸出: 例 1-8 SQL col name for a20 例 1-9 SQL col value for a25 之后,利用數(shù)據(jù)字典 v$parameter 使用例 1-10 的 SQL 查詢語句來獲得 參數(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 的各個部分內(nèi)存緩沖區(qū)之后,下面開始詳細地討論 Oracle 的主要后臺進程。 1.19 重做日志寫進程( LGWR)及快速 提交( fast commit) 重做日志寫進程( LOG writer, LGWR) 負責將重做日志緩沖區(qū)的記錄順序地寫到重做日志文件中。為了更好地理解 LOG writer 的操作原理,在這里先介紹一下 Oracle 提交( commit) 語句是如何工作的。 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ù)( transaction)被提交, Oracle 服務(wù)器都 將產(chǎn)生一個 SCN(號碼)并將其賦予該事務(wù)的所有數(shù)據(jù)行。在同一個數(shù)據(jù)庫中 SCN 是單調(diào)遞增的并且是惟一的。為了避免在進行一致性檢驗時操作系統(tǒng)時鐘可能引發(fā)的問題, Oracle 服務(wù)器將 SCN 作為 Oracle 的內(nèi)部時間戳來保證數(shù)據(jù)文件中的數(shù)據(jù)的同步和數(shù)據(jù)的讀一致性。 當在 SQL*Plus 中發(fā)了 commit 語句之后, Oracle 的內(nèi)部操作步驟如下: ( 1)服務(wù)器進程將把提交的記錄連同所產(chǎn)生的 SCN(號碼)一起寫入重做日志緩沖區(qū)中。 ( 2)重做日志寫進程( LGWR) 將把重做日志緩沖區(qū)中一直到所提交的記錄(包括該記錄)的所 有記錄連續(xù)地寫到重做日志文件中。在此之后, Oracle 服務(wù)器就可以保證即使第 1章 Oracle的體系結(jié)構(gòu) 23 在系統(tǒng)崩潰的情況下所有提交的數(shù)據(jù)也可以得到恢復(fù)。 ( 3) Oracle 通知用戶(進程)提交已經(jīng)完成。 ( 4)服務(wù)器進程將修改數(shù)據(jù)庫高速緩沖區(qū)中的相關(guān)數(shù)據(jù)的狀態(tài)并釋放資源和打開 鎖等。 此時可能這些 數(shù)據(jù)并未被寫到數(shù)據(jù) 文件中,這時這些 數(shù)據(jù)緩沖區(qū)被標為臟緩沖區(qū),因為相同的數(shù)據(jù)在內(nèi)外存中為不同的版本。數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)是由 DBWR 寫到數(shù)據(jù)文件中的。 曾有不少學(xué)生問過這樣一個問題:“為什么不同時寫兩個數(shù)據(jù)文件呢?” Oracle 的這種解決 方案的最大好處是在保證不丟失數(shù)據(jù)的同時數(shù)據(jù)庫的效率不會受到很大影響。因為重做日志文件中的記錄是以最緊湊的格式存放的,所以它的 I/O 量要比對數(shù)據(jù)文件的操作少得多。另外 LGWR 是順序地將重做日志緩沖區(qū)中的記錄寫到重做日志文件中的,這樣其I/O 速度要比將數(shù)據(jù)塊寫到數(shù)據(jù)文件中快得多。 重做日志寫進程 ( LGWR) 要在下列情況 下將重做日志 緩沖區(qū)的記錄(內(nèi)存)順序地寫到重做日志文件(外存)中: 當某個事務(wù)被提交時。 當 重做日志 緩沖區(qū)中變化的記錄超過一兆字節(jié)( 1MB)時。 當 重做日志 緩沖區(qū)中所存的記錄已超過緩沖區(qū)容量的 1/3。 在 DBWR 將數(shù)據(jù)庫高速緩沖區(qū)中修改過的數(shù)據(jù)塊寫到數(shù)據(jù) 文件之前。 每 3 秒鐘。 因為在進行數(shù)據(jù)庫恢復(fù)時需要重做日志數(shù)據(jù),所以重做日志寫進程( LGWR) 只有在重做日志數(shù)據(jù)寫到重做日志文件(磁盤)上時才能確定提交已經(jīng)完成。在 Oracle 8i 之前的版本中,重做日志數(shù)據(jù)的惟一目的和用處就是數(shù)據(jù)庫恢復(fù)。 Oracle 在 Oracle 8i 的版本中引入了一個叫做重做日志挖掘器( logminer)的工具。該工具可以將重做日志文件或歸檔重做日志文件中的數(shù)據(jù)轉(zhuǎn)換成用戶能理解的正文信息。在 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實例中可以啟動多個數(shù)據(jù)庫寫進程,特別是在要進行大規(guī)模輸入 /輸出并且運行在多 CPU 計算機上的 Oracle 數(shù)據(jù)庫系統(tǒng)。 Oracle 允許在一個實例上最多Oracle DBA基礎(chǔ)培訓(xùn)教程 24 啟動 10個數(shù)據(jù)庫寫進程,它們分別是 DBW0 DBW9。 數(shù)據(jù)庫寫進程 負責將 數(shù)據(jù)庫高速緩沖區(qū)中的臟緩沖區(qū)中的數(shù)據(jù)寫到數(shù)據(jù)文件上。為了提高效率,數(shù)據(jù)庫寫進程并不是數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)一有變化就寫數(shù)據(jù)文件,而是積累了足夠多的數(shù)據(jù)一次寫一大批內(nèi)存數(shù)據(jù)塊到數(shù)據(jù)文件上。 數(shù)據(jù)庫寫進程將在下列事件之一發(fā)生時把數(shù)據(jù)庫高速緩沖區(qū)中的數(shù) 據(jù)寫到數(shù)據(jù)文 件上: 當臟緩沖區(qū)的數(shù)量超過了所設(shè)定的限額。 當所設(shè)定的時間間隔已到。 當有進程需要數(shù)據(jù)庫高速緩沖區(qū)而卻找不到空閑的緩沖區(qū)時。 當校驗點發(fā)生時。 當某個表被刪除( drop)或被截斷( truncate)時。 當某個表空間被設(shè)置為只讀狀態(tài)( read only)時。 當使用類似于 ALTER TABLESPACE users BEGIN BACKUP 的命令對某個表空間進行聯(lián)機備份時。 當某個臨時表空間被設(shè)置為只脫機狀態(tài)( offline)或正常狀態(tài)( normal)時等。 1.21 系統(tǒng)監(jiān)督進程( SMON) 從前面的論述中可以知道,由于某種原因 Oracle 系統(tǒng)崩潰了(如斷電), SGA 中任何沒有來得及寫到磁盤中的信息都將丟失,如有些已經(jīng)提交的數(shù)據(jù)還沒有真正地被寫到數(shù)據(jù)文件中時就會丟失。在這種情況下,當數(shù)據(jù)庫重新開啟時,系統(tǒng)監(jiān)督進程( SMON)將自動地執(zhí)行 Oracle 實例的恢復(fù)工作。其步驟如下: ( 1)執(zhí)行前滾( roll forward) ,即將已經(jīng)寫到重做日志文件中但還沒寫到數(shù)據(jù)文件中的提交數(shù)據(jù)寫到數(shù)據(jù)文件中( Oracle 是用 SCN 號碼來識別提交記錄的)。 ( 2)在前滾完成后立即打開數(shù)據(jù)庫,此時用戶就可以 登錄并使用數(shù)據(jù)庫了。這時在數(shù)據(jù)文件中可能還有一些沒有提交的數(shù)據(jù)。之所以這樣安排主要是為了提高系統(tǒng)的效率。 ( 3)回滾沒有提交的事務(wù)(數(shù)據(jù))。除了 SMON 進程之外,服務(wù)器( server)進程也可能進行回滾沒有提交的事務(wù),但該進程只回滾它所用到的加鎖的數(shù)據(jù)行。 除此之外 , SMON 進程還要執(zhí)行如下的磁盤空間的維護工作 : 回收或組合數(shù)據(jù)文件中相連的空閑區(qū)。 釋放臨時段(在執(zhí)行 SQL 語句時用作排序的磁盤區(qū)),將它們還給數(shù)據(jù)文件以作為空閑區(qū)使用。 1.22 進程監(jiān)督進程( PMON) 當某個進程崩潰時(如在沒有正常退出 Oracle 的情況下重新啟動了所用的 PC) ,進程第 1章 Oracle的體系結(jié)構(gòu) 25 監(jiān)督進程( PMON) 將負責它的清理工作。 PMON 進程將負責進行如下的清理工作: 回滾用戶當前的事務(wù)。 釋放用戶所加的所有表一級和行一級的鎖。 釋放用戶所有的其他資源等。 1.23 校驗點( checkpoint)和校驗點進程 Oracle 系統(tǒng)為了提高系統(tǒng)的效率和數(shù)據(jù)庫的一致性,引入了一個稱為校驗點的事件。該事件是在當 DBWR 進程把在 SGA 中所有已經(jīng)改變了的數(shù)據(jù)庫高速緩沖區(qū)中的數(shù)據(jù)(包括提交的和沒提交的數(shù)據(jù))寫到數(shù)據(jù)文件上時產(chǎn)生。從理論上講校驗點( checkpoint)和校驗點進程可以完全不需要,因為 Oracle 系統(tǒng)利用重做日志數(shù)據(jù)和 SCN 號是能夠保證數(shù)據(jù)庫的完全恢復(fù)的。引入校驗點可能是為了提高系統(tǒng)的效率。因為所有到校驗點為止的變化了的數(shù)據(jù)都已寫到了數(shù)據(jù)文件中,在實例恢復(fù)時校驗點之前的重做日志 記錄已經(jīng)不再需要,這樣 實例

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論