1. 程式人生 > >Oracle物理結構、邏輯結構、記憶體結構

Oracle物理結構、邏輯結構、記憶體結構

資料庫(Database)

資料庫是一個數據的集合,不僅是指物理上的資料,也指物理、儲存及程序物件的一個組合。Oracle是一個基於B/S模式的關係型資料庫管理系統(RDBMS)。

Oracle系統體系結構由三部分組成:邏輯結構、物理結構和例項。

oracle總體系

一、Oracle的邏輯結構

Oracle的邏輯結構是一種層次結構。主要由:表空間、段、區和資料塊等概念組成。邏輯結構是面向使用者的,使用者使用Oracle開發應用程式使用的就是邏輯結構。資料庫儲存層次結構及其構成關係,結構物件也從資料塊到表空間形成了不同層次的粒度關係。

oracle邏輯結構

1.資料塊(Data Blocks)

資料塊是Oracle最小的儲存單位,Oracle資料存放在“塊”中。一個塊佔用一定的磁碟空間。特別注意的是,這裡的“塊”是Oracle的“資料塊”,不是作業系統的“塊”。

Oracle每次請求資料的時候,都是以塊為單位。也就是說,Oracle每次請求的資料是塊的整數倍。如果Oracle請求的資料量不到一塊,Oracle也會讀取整個塊。所以說,“塊”是Oracle讀寫資料的最小單位或者最基本的單位。

塊的標準大小由初始化引數DB_BLOCK_SIZE指定。具有標準大小的塊稱為標準塊(Standard Block)。塊的大小和標準塊的大小不同的塊叫非標準塊(Nonstandard Block)。

作業系統每次執行I/O的時候,是以作業系統的塊為單位;Oracle每次執行I/O的時候,都是以Oracle的塊為單位。

Oracle資料塊大小一般是作業系統塊的整數倍。

資料塊的格式(Data Block Format)

塊中存放表的資料和索引的資料,無論存放哪種型別的資料,塊的格式都是相同的,塊由塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory),空餘空間(Free Space)和行資料(Row Data)五部分組成,如下圖

Oracle資料塊

塊頭(header/Common and Variable):存放塊的基本資訊,如:塊的實體地址,塊所屬的段的型別(是資料段還是索引段)。

表目錄(Table Directory):存放表的資訊,即:如果一些表的資料被存放在這個塊中,那麼,這些表的相關資訊將被存放在“表目錄”中。

行目錄(Row Directory):如果塊中有行資料存在,則,這些行的資訊將被記錄在行目錄中。這些資訊包括行的地址等。

行資料(Row Data):是真正存放表資料和索引資料的地方。這部分空間是已被資料行佔用的空間。

空餘空間(Free Space):空餘空間是一個塊中未使用的區域,這片區域用於新行的插入和已經存在的行的更新。

頭部資訊區(Overhead):我們把塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory)這三部分合稱為頭部資訊區(Overhead)。頭部資訊區不存放資料,它存放的整個塊的資訊。頭部資訊區的大小是可變的。一般來說,頭部資訊區的大小介於84位元組(bytes)到107位元組(bytes)之間。

資料塊中自由空間的使用

當往資料庫中插入(INSERT)資料的時候,塊中的自由空間會減少;當對塊中已經存在的行進行修改(UPDATE)的時候(使記錄長度增加),塊中的自由空間也會減少。

DELETE語句和UPDATE語句會使塊中的自由空間增加。當使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候,Oracle會釋放出一部分自由空間。釋放出的自由空間並不一定是連續的。通常情況下,Oracle不會對塊中不連續的自由空間進行合併。因為合併資料塊中不連續的自由空間會影響資料庫的效能。只有當用戶進行資料插入(INSERT)或者更新(UPDATE)操作,卻找不到連續的自由空間的時候,Oracle才會合併資料塊中不連續的自由空間。

對於塊中的自由空間,Oracle提供兩種管理方式:自動管理,手動管理

行連結和行遷移(Row Chaining and Migrating)

行連結(Row Chaining):如果我們往資料庫中插入(INSERT)一行資料,這行資料很大,以至於一個數據塊存不下一整行,Oracle就會把一行資料分作幾段存在幾個資料塊中,這個過程叫行連結(Row Chaining)。如下圖所示:

普通行

如果一行資料是普通行,這行資料能夠存放在一個數據塊中;如果一行資料是連結行,這行資料存放在多個數據塊中。

行遷移(Row Migrating):資料塊中存在一條記錄,使用者執行UPDATE更新這條記錄,這個UPDATE操作使這條記錄變長,這時候,Oracle在這個資料塊中進行查詢,但是找不到能夠容納下這條記錄的空間,無奈之下,Oracle只能把整行資料移到一個新的資料塊。原來的資料塊中保留一個“指標”,這個“指標”指向新的資料塊。被移動的這條記錄的ROWID保持不變。行遷移的原理如下圖所示:

00

無論是行連結還是行遷移,都會影響資料庫的效能。Oracle在讀取這樣的記錄的時候,Oracle會掃描多個數據塊,執行更多的I/O。

塊中自由空間的自動管理

Oracle使用點陣圖(bitmap)來管理和跟蹤資料塊,這種塊的空間管理方式叫“自動管理”。自動管理有下面的好處:

◆易於使用

◆更好地利用空間

◆可以對空間進行實時調整

塊中自由空間的手動管理

使用者可以通過PCTFREE, PCTUSED來調整塊中空間的使用,這種管理方式叫手動管理。相對於自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費。

PCTUSED也是用於設定一個百分比,當塊中已使用的空間的比例小於這個百分比的時候,這個塊才被標識為有效狀態。只有有效的塊才被允許插入資料。

PCTFREE引數用於指定塊中必須保留的最小空閒空間百分例,預設值為10。之所以要預留這樣的空間,是因為UPDATE時,需要這些空間。如果UPDATE時,沒有空餘空間,Oracle就會分配一個新的塊,這會產生行遷移(Row Migrating)。

例如,假定在Create table語句中指定了pctfree為20,則說明在該表的資料段內每個資料塊的20%被作為可利用的空閒空間,用於更新已在資料塊記憶體在的資料行其餘80%是用於插入新的資料行,直到達到80%為止。顯然,pctfree值越小,則為現存行更新所預留的空間越少。因此,如果pctfree設定得太高,則在全表掃描期間增加I/O,浪費磁碟空間;如果pctfree設定得太低,則會導致行遷移。 
pctused引數設定了資料塊是否是空閒的界限。當資料塊的使用空間低於pctused的值時,此資料塊標誌為空閒,該空閒空間僅用於插入新的行。如果資料塊已經達到了由pctfree所確定的上邊界時,Oracle就認為此資料塊已經無法再插入新的行。例如,假定在Create table語句中指定pctused為40,則當小於或等於39時,該資料塊才是可用的。所以,可將資料塊填得更滿,這樣可節省空間,但卻增加了處理開銷,因為資料塊的空閒空間總是要被更新的行佔據,所以對資料塊需要頻繁地進行重新組織。比較低的pctused增加了資料庫的空閒空間,但減少了更新操作的處理開銷。所以,如果pctused設定過高,則會降低磁碟的利用率導致行遷移;若pctused設定過低,則浪費磁碟空間,增加全表掃描時的I/O輸出。pctused是與pctfree相對的引數。 
那麼,如何選擇pctfree和pctused的值呢?有個公式可供參考。顯然,pctfree和pctused的之和不能超過100。若兩者之和低於100,則空間的利用與系統的I/O之間的最佳平衡點是:pctfree與pctused之和等於100%減去一行的大小佔塊空間大小的百分比。例如,如果塊大小為2048位元組,則它需要100個位元組的開銷,而行大小是390位元組(為可用塊的20%)。為了充分利用空間,pctfree與pctused之和最好為80%。 
那麼,怎樣確定資料塊大小呢?有兩個因素需要考慮: 
一是資料庫環境型別。例如,是DSS環境還是OLTP環境?在資料倉庫環境(OLAP或DSS)下,使用者需要進行許多執行時間很長的查詢,所以應當使用大的資料塊。在OLTP系統中,使用者處理大量的小型事務,採用較小資料塊能夠獲得更好的效果。 
二是SGA的大小。資料庫緩衝區的大小由資料塊大小和初始化檔案的db_block_buffers引數決定。最好設為作業系統I/O的整數倍。

2.資料區(Extent)

是一組連續的資料塊。當一個表、回滾段或臨時段建立或需要附加空間時,系統總是為之分配一個新的資料區。一個數據區不能跨越多個檔案,因為它包含連續的資料塊。使用區的目的是用來儲存特定資料型別的資料,也是表中資料增長的基本單位。在Oracle資料庫中,分配空間就是以資料區為單位的。一個Oracle物件包含至少一個數據區。設定一個表或索引的儲存引數包含設定它的資料區大小。

3.段(Segment)

是由多個數據區構成的,它是為特定的資料庫物件(如表段、索引段、回滾段、臨時段)分配的一系列資料區。段內包含的資料區可以不連續,並且可以跨越多個檔案。使用段的目的是用來儲存特定物件。 
一個Oracle資料庫有4種類型的段: 
資料段:資料段也稱為表段,它包含資料並且與表和簇相關。當建立一個表時,系統自動建立一個以該表的名字命名的資料段。 
索引段:包含了用於提高系統性能的索引。一旦建立索引,系統自動建立一個以該索引的名字命名的索引段。 
回滾段:包含了回滾資訊,並在資料庫恢復期間使用,以便為資料庫提供讀入一致性和回滾未提交的事務,即用來回滾事務的資料空間。當一個事務開始處理時,系統為之分配回滾段,回滾段可以動態建立和撤銷。系統有個預設的回滾段,其管理方式既可以是自動的,也可以是手工的。 
臨時段:它是Oracle在執行過程中自行建立的段。當一個SQL語句需要臨時工作區時,由Oracle建立臨時段。一旦語句執行完畢,臨時段的區間便退回給系統。

4.表空間(tablespace)

是資料庫的邏輯劃分。任何資料庫物件在儲存時都必須儲存在某個表空間中。表空間對應於若干個磁碟檔案,即表空間是由一個或多個磁碟檔案構成的。表空間相當於作業系統中的資料夾,也是資料庫邏輯結構與物理檔案之間的一個對映。每個資料庫至少有一個表空間(system tablespace),表空間的大小等於所有從屬於它的資料檔案大小的總和。

(1)系統表空間(system tablespace)

是每個Oracle資料庫都必須具備的。其功能是在系統表空間中存放諸如表空間名稱、表空間所含資料檔案等資料庫管理所需的資訊。系統表空間的名稱是不可更改的。系統表空間必須在任何時候都可以用,也是資料庫執行的必要條件。因此,系統表空間是不能離線的。 
系統表空間包括資料字典、儲存過程、觸發器和系統回滾段。為避免系統表空間產生儲存碎片以及爭用系統資源的問題,應建立一個獨立的表空間用來單獨儲存使用者資料。

(2)SYSAUX表空間 
是隨著資料庫的建立而建立的,它充當SYSTEM的輔助表空間,主要儲存除資料字典以外的其他物件。SYSAUX也是許多Oracle 資料庫的預設表空間,它減少了由資料庫和DBA管理的表空間數量,降低了SYSTEM表空間的負荷。

(3)臨時表空間 
相對於其他表空間而言,臨時表空間(temp tablespace)主要用於儲存Oracle資料庫執行期間所產生的臨時資料。資料庫可以建立多個臨時表空間。當資料庫關閉後,臨時表空間中所有資料將全部被清除。除臨時表空間外,其他表空間都屬於永久性表空間。

(4)撤銷表空間 
用於儲存Oracle資料庫撤銷資訊,即儲存使用者回滾段的表空間稱之為回滾表空間(或簡稱為RBS撤銷表空間(undo tablespace))。在Oracle8i中是rollback tablespace,從Oracle9i開始改為undo tablespace。在Oracle 10g中初始建立的只有6個表空間sysaux、system、temp、undotbs1、example和users。其中temp是臨時表空間,undotbs1是undo撤銷表空間。

(5)USERS表空間

使用者表空間,用於存放永久性使用者物件的資料和私有資訊。每個資料塊都應該有一個使用者表空間,以便在建立使用者是將其分配給使用者。

表空間

二、物理結構

Oracle物理結構包含了資料檔案、日誌檔案和控制檔案

1.資料檔案

每一個ORACLE資料庫有一個或多個物理的資料檔案(data file)。一個數據庫的資料檔案包含全部資料庫資料。邏輯資料庫結構(如表、索引)的資料物理地儲存在資料庫的資料檔案中。資料檔案有下列特徵: 
一個數據檔案僅與一個數據庫聯絡。

一旦建立,資料檔案不能改變大小.

一個表空間(資料庫儲存的邏輯單位)由一個或多個數據檔案組成。 
資料檔案中的資料在需要時可以讀取並存儲在ORACLE記憶體儲區中。例如:使用者要存取資料庫一表的某些資料,如果請求資訊不在資料庫的記憶體儲存區內,則從相應的資料檔案中讀取並存儲在記憶體。當修改和插入新資料時,不必立刻寫入資料檔案。為了減少磁碟輸出的總數,提高效能,資料儲存在記憶體,然後由ORACLE後臺程序DBWR決定如何將其寫入到相應的資料檔案。

2.日誌檔案

每一個數據庫有兩個或多個日誌檔案(redo log file)的組,每一個日誌檔案組用於收集資料庫日誌。日誌的主要功能是記錄對資料所作的修改,所以對資料庫作的全部修改是記錄在日誌中。在出現故障時,如果不能將修改資料永久地寫入資料檔案,則可利用日誌得到該修改,所以從不會丟失已有操作成果。 
日誌檔案主要是保護資料庫以防止故障。為了防止日誌檔案本身的故障,ORACLE允許鏡象日誌(mirrored redo log),以致可在不同磁碟上維護兩個或多個日誌副本。 
日誌檔案中的資訊僅在系統故障或介質故障恢復資料庫時使用,這些故障阻止將資料庫資料寫入到資料庫的資料檔案。然而任何丟失的資料在下一次資料庫開啟時,ORACLE自動地應用日誌檔案中的資訊來恢復資料庫資料檔案。

Oralce兩種日誌檔案型別:

聯機日誌檔案 
這是Oracle用來迴圈記錄資料庫改變的作業系統檔案

歸檔日誌檔案 
這是指為避免聯機日誌檔案重寫時丟失重複資料而對聯機日誌檔案所做的備份

Oracle有兩種歸檔日誌模式,Oracle資料庫可以採用其中任何一種模式:

NOARCHIVELOG 
不對日誌檔案進行歸檔。這種模式可以大大減少資料庫備份的開銷,但可能回導致資料的不可恢復

ARCHIVELOG 
在這種模式下,當Oracle轉向一個新的日誌檔案時,將以前的日誌檔案進行歸檔。為了防止出現歷史“缺口”的情況,一個給定的日誌檔案在它成功歸檔之前是不能重新使用的。歸檔的日誌檔案,加上聯機日誌檔案,為資料庫的所有改變提供了完整的歷史資訊。

在Oracle利用日誌檔案和歸檔日誌檔案來恢復資料庫時,內部序列號可以起一個嚮導的作用。

3.控制檔案

每一ORACLE資料庫有一個控制檔案(control file),它記錄資料庫的物理結構,包含下列資訊型別: 
資料庫名; 
資料庫資料檔案和日誌檔案的名字和位置; 
資料庫建立日期。 
為了安全起見,允許控制檔案被鏡象。 
每一次ORACLE資料庫的例項啟動時,它的控制檔案用於標識資料庫和日誌檔案,當著手資料庫操作時它們必須被開啟。當資料庫的物理組成更改時,ORACLE自動更改該資料庫的控制檔案。資料恢復時,也要使用控制檔案。

4.引數檔案

除了構成Oracle資料庫物理結構的三類主要檔案外,Oracle資料庫還具有另外一種重要的檔案:引數檔案。引數檔案記錄了Oracle資料庫的基本引數資訊,主要包括資料庫名、控制檔案所在路徑、程序等。與舊版本的初始化引數檔案INITsid.ora不同,在Oracle10g中還可以使用二進進制服務器引數檔案,並且該伺服器引數檔案在安裝Oracle資料庫系統時由系統自動建立,檔案的名稱為SPFILEsid.ora,sid為所建立的資料庫例項名。 
SPFILEsid.ora中的引數是由Oracle系統自動管理。如果想要對資料庫的某些引數進行設定,則可能過OEM或ALTER SYSTEM命令來修改。使用者最好不要用編輯器進行修改。

三、例項(instance)

資料庫例項(也稱為伺服器Server)就是用來訪問一個數據庫檔案集的一個儲存結構及後臺程序的集合。它使一個單獨的資料庫可以被多個例項訪問(也就是ORACLE並行伺服器-- OPS)。

例項在作業系統中用ORACLE_SID來標識,在Oracle中用引數INSTANCE_NAME來標識, 它們兩個的值是相同的。資料庫啟動時,系統首先在伺服器記憶體中分配系統全域性區(SGA),構成了Oracle的記憶體結構,然後啟動若干個常駐記憶體的作業系統程序,即組成了Oracle的 程序結構,記憶體區域和後臺程序合稱為一個Oracle例項。

instance
1.系統全域性區(SGA)

SGA是一組為系統分配的共享的記憶體結構,可以包含一個數據庫例項的資料或控制信:  息。如果多個使用者連線到同一個資料庫例項,在例項的SGA中,資料可以被多個使用者共享, 當資料庫例項啟動時,SGA的記憶體被自動分配;當資料庫例項關閉時,SGA記憶體被回收。  SGA是佔用記憶體最大的一個區域,同時也是影響資料庫效能的重要因素。

系統全域性區(SGA),主要包括:

1)資料塊快取區 
資料塊快取區(datablockbuffercache)是SGA中的一個快取記憶體區域,用來儲存從資料庫中讀取資料段的資料塊(如表、索引和簇)。資料塊快取區的大小由資料庫伺服器init.ora檔案中的DB_LOCK_BUFFERS引數決定(用資料庫塊的個數表示)。在調整和管理資料庫時,調整資料塊快取區的大小是一個重要的部分。

因為資料塊快取區的大小固定,並且其大小通常小於資料庫段所使用的空間,所以它不能一次裝載下記憶體中所有的資料庫段。通常,資料塊快取區只是資料庫大小的1%~2%,Oracle使用最近最少使用(LRU,leastrecentlyused)演算法來管理可用空間。當儲存區需要自由空間時,最近最少使用塊將被移出,新資料塊將在儲存區代替它的位置。通過這種方法,將最頻繁使用的資料儲存在儲存區中。

然而,如果SGA的大小不足以容納所有最常使用的資料,那麼,不同的物件將爭用資料塊快取區中的空間。當多個應用程式共享同一個SGA時,很有可能發生這種情況。此時,每個應用的最近使用段都將與其他應用的最近使用段爭奪SGA中的空間。其結果是,對資料塊快取區的資料請求將出現較低的命中率,導致系統性能下降。

2)字典快取區 
資料庫物件的資訊儲存在資料字典表中,這些資訊包括使用者帳號資料、資料檔名、段名、盤區位置、表說明和許可權,當資料庫需要這些資訊(如檢查使用者查詢一個表的授權)時,將讀取資料字典表並且將返回的資料儲存在字典快取區的SGA中。

資料字典快取區通過最近最少使用(LRU)演算法來管理。字典快取區的大小由資料庫內部管理。字典快取區是SQL共享池的一部分,共享池的大小由資料庫檔案init.ora中的SHARED_POOL_SIZE引數來設定。

如果字典快取區太小,資料庫就不得不反覆查詢資料字典表以訪問資料庫所需的資訊,這些查詢稱為迴圈呼叫(recuesivecall),這時的查詢速度相對字典快取區獨立完成查詢時要低。

3)重做日誌緩衝區 
重做項描述對資料庫進行的修改。它們寫到聯機重做日誌檔案中,以便在資料庫恢復過程中用於向前滾動操作。然而,在被寫入聯機重做日誌檔案之前,事務首先被記錄在稱作重做日誌緩衝區(redologbuffer)的SGA中。資料庫可以週期地分批向聯機重做日誌檔案中寫重做項的內容,從而優化這個操作。重做日誌緩衝區的大小(以位元組為單位)由init.ora檔案中的LOG_BUFFER引數決定。

4)SQL共享池 
SQL共享池儲存資料字典快取區及庫快取區(librarycache),即對資料庫進行操作的語句資訊。當資料塊緩衝區和字典快取區能夠共享資料庫使用者間的結構及資料資訊時,庫快取區允許共享常用的SQL語句。

SQL共享池包括執行計劃及執行資料庫的SQL語句的語法分析樹。在第二次執行(由任何使用者)相同的SQL語句時,可以利用SQL共享池中可用的語法分析資訊來加快執行速度。

SQL共享池通過LRU演算法來管理。當SQL共享池填滿時,將從庫快取區中刪掉最近最少使用的執行路徑和語法分析樹,以便為新的條目騰出空間。如果SQL共享池太小,語句將被連續不斷地再裝入到庫快取區,從而影響操作效能。

SQL共享池的大小(以位元組為單位)由init.ora檔案引數SHARED_POOL_SIZE決定。

5)大池 
大池(LargePool)是一個可選記憶體區。如果使用執行緒伺服器選項或頻繁執行備份/恢復操作,只要建立一個大池,就可以更有效地管理這些操作。大池將致力於支援SQL大型命令。利用大池,就可以防止這些SQL大型命令把條目重寫入SQL共享池中,從而減少再裝入到庫快取區中的語句數量。大池的大小(以位元組為單位)通過init.ora檔案的LARGE_POOL_SIZE引數設定,使用者可以使用init.ora檔案的LARGE_POOL_MIN_ALLOC引數設定大池中的最小位置。Oracle8i已不用這個引數。作為使用LargePool的一種選擇方案,可以用init.ora檔案的SHARED_POOL_RESERVED_SIZE引數為SQL大型語句保留一部分SQL共享池。

6)Java池 
由其名字可知,Java池為Java命令提供語法分析。Java池的大小(以位元組為單位)通過在Oracle8i引入的init.ora檔案的JAVA_POOL_SIZE引數設定。init.ora檔案的JAVA_POOL_SIZE引數預設設定為10MB。

7)多緩衝池 
可以在SGA中建立多個緩衝池,能夠用多個緩衝池把大資料集與其他的應用程式分開,以減少它們爭奪資料塊快取區內相同資源的可能性。對於建立的每一個緩衝池,都要規定其LRU鎖存器的大小和數量。緩衝區的數量必須至少比LRU鎖存器的數量多50倍。

建立緩衝池時,需要規定儲存區(keeparea)的大小和再迴圈區(recyclearea)的大小。與SQL共享池的保留區一樣,儲存區保持條目,而再迴圈區則被頻繁地再迴圈使用。可以通過BUFFER_POOL_KEEP引數規定來儲存區的大小。例如: 
儲存和再迴圈緩衝池的容量減少了資料塊緩衝儲存區中的可用空間(通過DB_BLOCK_BUFFERS引數設定)。對於使用一個新緩衝池的表,通過表的storage子句中的buffer_pool引數來規定緩衝池的名字。例如,如果需要從記憶體中快速刪除一個表,就把它賦予RECYCLE池。預設池叫作DEFAULT,這樣就能在以後用altertable命令把一個錶轉移到DEFAULT池。

2.後臺程序(Backgroung Process)

資料庫的物理結構與記憶體結構之間的互動要通過後臺程序來完成。

1、DBWR程序:該程序執行將緩衝區寫入資料檔案,是負責緩衝儲存區管理的一個Oracle後臺程序。當緩衝區中的一緩衝區被修改,它被標誌為“弄髒”,DBWR的主要任務是將“弄髒”的緩衝區寫入磁碟,使緩衝區保持“乾淨”。由於緩衝儲存區的緩衝區填入資料庫或被使用者程序弄髒,未用的緩衝區的數目減少。當未用的緩衝區下降到很少,以致使用者程序要從磁碟讀入塊到記憶體儲存區時無法找到未用的緩衝區時,DBWR將管理緩衝儲存區,使使用者程序總可得到未用的緩衝區。

Oracle採用LRU(LEAST RECENTLY USED)演算法(最近最少使用演算法)保持記憶體中的資料塊是最近使用的,使I/O最小。在下列情況預示DBWR 要將弄髒的緩衝區寫入磁碟:

當一個伺服器程序將一緩衝區移入“弄髒”表,該弄髒表達到臨界長度時,該服務程序將通知DBWR進行寫。該臨界長度是為引數DB-BLOCK-WRITE-BATCH的值的一半。

當一個伺服器程序在LRU表中查詢DB-BLOCK-MAX-SCAN-CNT緩衝區時,沒有查到未用的緩衝區,它停止查詢並通知DBWR進行寫。出現超時(每次3秒),DBWR 將通知本身。當出現檢查點時,LGWR將通知DBWR.在前兩種情況下,DBWR將弄髒表中的塊寫入磁碟,每次可寫的塊數由初始化引數DB-BLOCK- WRITE-BATCH所指定。如果弄髒表中沒有該引數指定塊數的緩衝區,DBWR從LUR表中查詢另外一個弄髒緩衝區。

如果DBWR在三秒內未活動,則出現超時。在這種情況下DBWR對LRU表查詢指定數目的緩衝區,將所找到任何弄髒緩衝區寫入磁碟。每當出現超時,DBWR查詢一個新的緩衝區組。每次由DBWR查詢的緩衝區的數目是為寢化引數DB-BLOCK- WRITE-BATCH的值的二倍。如果資料庫空運轉,DBWR最終將全部緩衝區儲存區寫入磁碟。

在出現檢查點時,LGWR指定一修改緩衝區表必須寫入到磁碟。DBWR將指定的緩衝區寫入磁碟。

在有些平臺上,一個例項可有多個DBWR.在這樣的例項中,一些塊可寫入一磁碟,另一些塊可寫入其它磁碟。引數DB-WRITERS控制DBWR程序個數。

DBWn

2、LGWR程序:該程序將日誌緩衝區寫入磁碟上的一個日誌檔案,它是負責管理日誌緩衝區的一個Oracle後臺程序。LGWR程序將自上次寫入磁碟以來的全部日誌項輸出,LGWR輸出:

◆當用戶程序提交一事務時寫入一個提交記錄。 
◆每三秒將日誌緩衝區輸出。 
◆當日志緩衝區的1/3已滿時將日誌緩衝區輸出。 
◆當DBWR將修改緩衝區寫入磁碟時則將日誌緩衝區輸出。

LGWR程序同步地寫入到活動的鏡象線上日誌檔案組。如果組中一個檔案被刪除或不可用,LGWR可繼續地寫入該組的其它檔案。

日誌緩衝區是一個迴圈緩衝區。當LGWR將日誌緩衝區的日誌項寫入日誌檔案後,伺服器程序可將新的日誌項寫入到該日誌緩衝區。LGWR 通常寫得很快,可確保日誌緩衝區總有空間可寫入新的日誌項。

注意:有時候當需要更多的日誌緩衝區時,LWGR在一個事務提交前就將日誌項寫出,而這些日誌項僅當在以後事務提交後才永久化。

ORACLE使用快速提交機制,當用戶發出COMMIT語句時,一個COMMIT記錄立即放入日誌緩衝區,但相應的資料緩衝區改變是被延遲,直到在更有效時才將它們寫入資料檔案。當一事務提交時,被賦給一個系統修改號(SCN),它同事務日誌項一起記錄在日誌中。由於SCN記錄在日誌中,以致在並行伺服器選項配置情況下,恢復操作可以同步。

LGWR

3、CKPT程序:該程序在檢查點出現時,對全部資料檔案的標題進行修改,指示該檢查點。在通常的情況下,該任務由LGWR執行。然而,如果檢查點明顯地降低系統性能時,可使CKPT程序執行,將原來由LGWR程序執行的檢查點的工作分離出來,由CKPT程序實現。對於許多應用情況,CKPT程序是不必要的。只有當資料庫有許多資料檔案,LGWR在檢查點時明顯地降低效能才使CKPT執行。 CKPT程序不將塊寫入磁碟,該工作是由DBWR完成的。初始化引數CHECKPOINT-PROCESS控制CKPT程序的使能或使不能。預設時為FALSE,即為使不能。

    由於Oracle中LGWR和DBWR工作的不一致,Oracle引入了檢查點的概念,用於同步資料庫,保證資料庫的一致性。在Oracle裡面,檢查點分為兩種:完全檢查點和增量檢查點。下面我們分別介紹這兩種檢查點的作用:

1、完全檢查點

    在Oracle8i之前,資料庫的發生的檢查點都是完全檢查點,完全檢查點會將資料緩衝區裡面所有的髒資料塊寫入相應的資料檔案中,並且同步資料檔案頭和控制檔案,保證資料庫的一致。完全檢查點在8i之後只有在下列兩種情況下才會發生:

(1)DBA手工執行alter system checkpoint的命令;

(2)資料庫正常shutdown(immediate,transcational,normal)。

由於完全檢查點會將所有的髒資料庫塊寫入,巨大的IO往往會影響到資料庫的效能。因此Oracle從8i開始引入了增量檢查點的概念。

2、 增量檢查點

Oracle從8i開始引入了檢查點佇列這麼一種概念,用於記錄資料庫裡面當前所有的髒資料塊的資訊,DBWR根據這個佇列而將髒資料塊寫入到資料檔案中。檢查點佇列按時間先後記錄著資料庫裡面髒資料塊的資訊,裡面的條目包含RBA(Redo Block Address,重做日誌裡面用於標識檢查點期間資料塊在重做日誌裡面第一次發生更改的編號)和資料塊的資料檔案號和塊號。在檢查點期間不論資料塊更改幾次,它在檢查點佇列裡面的位置始終保持不變,檢查點佇列也只會記錄它最早的RBA,從而保證最早更改的資料塊能夠儘快寫入。當DBWR將檢查點佇列裡面的髒資料塊寫入到資料檔案後,檢查點的位置也要相應地往後移,CKPT每三秒會在控制檔案中記錄檢查點的位置,以表示Instance Recovery時開始恢復的日誌條目,這個概念稱為檢查點的“心跳”(heartbeat)。檢查點位置發生變更後,Oracle裡面通過4個引數用於控制檢查點位置和最後的重做日誌條目之間的距離。在這裡面需要指出的是,多數人會將這4個引數看作控制增量檢查點發生的時間。事實上這是錯誤的,這4個引數是用於控制檢查點佇列裡面的條目數量,而不是控制檢查點的發生。

(1)fast_start_io_target

該引數用於表示資料庫發生Instance Recovery的時候需要產生的IO總數,它通過v$filestat的AVGIOTIM來估算的。比如我們一個數據庫在發生Instance Crash後需要在10分鐘內恢復完畢,假定OS的IO每秒為500個,那麼這個資料庫發生Instance Recovery的時候大概將產生500*10*60=30,000次IO,也就是我們將可以把fast_start_io_target設定為30000。

(2)fast_start_mttr_target

我們從上面可以看到fast_start_io_target來估算檢查點位置比較麻煩。Oracle為了簡化這個概念,從9i開始引入了fast_start_mttr_target這麼一個引數,用於表示資料庫發生Instance Recovery的時間,以秒為單位。這個引數我們從字面上也比較好理解,其中的mttr是mean time to recovery的簡寫,如上例中的情況我們可以將fast_start_mttr_target設定為600。當設定了fast_start_mttr_target後,fast_start_io_target這個引數將不再生效,從9i後fast_start_io_target這個引數被Oracle廢除了。

(3)log_checkpoint_timeout

該引數用於表示檢查點位置和重做日誌檔案末尾之間的時間間隔,以秒為單位,預設情況下是1800秒。

(4)log_checkpoint_interval

該引數是表示檢查點位置和重做日誌末尾的重做日誌塊的數量,以OS塊表示。

(5)90% OF SMALLEST REDO LOG

除了以上4個初始化引數外,Oracle內部事實上還將重做日誌檔案末尾前面90%的位置設為檢查點位置。在每個重做日誌中,這麼幾個引數指定的位置可能不盡相同,Oracle將離日誌檔案末尾最近的那個位置確認為檢查點位置。

4、SMON程序:該程序例項啟動時,執行例項恢復,還負責清理不再使用的臨時段。在具有並行伺服器選項的環境下,SMON對有故障CPU或例項進行例項恢復。SMON程序有規律地被呼醒,檢查是否需要,或者其它程序發現需要時可以被呼叫。

5、PMON程序:該程序在使用者程序出現故障時執行程序恢復,負責清理記憶體儲區和釋放該程序所使用的資源。例:它要重置活動事務表的狀態,釋放封鎖,將該故障的程序的ID從活動程序表中移去。PMON還週期地檢查排程程序(DISPATCHER)和伺服器程序的狀態,如果已死,則重新啟動(不包括有意刪除的程序)。

PMON有規律地被呼醒,檢查是否需要,或者其它程序發現需要時可以被呼叫。

6、RECO程序:該程序是在具有分散式選項時所使用的一個程序,自動地解決在分散式事務中的故障。一個結點RECO後臺程序自動地連線到包含有懸而未決的分散式事務的其它資料庫中,RECO自動地解決所有的懸而不決的事務。任何相應於已處理的懸而不決的事務的行將從每一個數據庫的懸掛事務表中刪去。

當一資料庫伺服器的RECO後臺程序試圖建立同一遠端伺服器的通訊,如果遠端伺服器是不可用或者網路連線不能建立時,RECO自動地在一個時間間隔之後再次連線。

RECO後臺程序僅當在允許分散式事務的系統中出現,而且DISTRIBUTED C TRANSACTIONS引數是大於0。

7、ARCH程序:該程序將已填滿的線上日誌檔案拷貝到指定的儲存裝置。當日志是為ARCHIVELOG使用方式、並可自動地歸檔時ARCH程序才存在。

8、LCKn程序:是在具有並行伺服器選件環境下使用,可多至10個程序(LCK0,LCK1……,LCK9),用於例項間的封鎖。

9、Dnnn程序(排程程序):該程序允許使用者程序共享有限的伺服器程序(SERVER PROCESS)。沒有排程程序時,每個使用者程序需要一個專用服務程序(DEDICATEDSERVER PROCESS)。對於多線索伺服器(MULTI-THREADED SERVER)可支援多個使用者程序。如果在系統中具有大量使用者,多線索伺服器可支援大量使用者,尤其在客戶_伺服器環境中。

在一個數據庫例項中可建立多個排程程序。對每種網路協議至少建立一個排程程序。資料庫管理員根據作業系統中每個程序可連線數目的限制決定啟動的排程程式的最優數,在例項執行時可增加或刪除排程程序。多線索伺服器需要SQL*NET版本2或更後的版本。在多線索伺服器的配置下,一個網路接收器程序等待客戶應用連線請求,並將每一個傳送到一個排程程序。如果不能將客戶應用連線到一排程程序時,網路接收器程序將啟動一個專用伺服器程序。該網路接收器程序不是Oracle例項的組成部分,它是處理與Oracle有關的網路程序的組成部分。在例項啟動時,該網路接收器被開啟,為使用者連線到Oracle建立一通訊路徑,然後每一個排程程序把連線請求的排程程序的地址給予它的接收器。當一個使用者程序作連線請求時,網路接收器程序分析請求並決定該使用者是否可使用一排程程序。如果是,該網路接收器程序返回該排程程序的地址,之後使用者程序直接連線到該排程程序。有些使用者程序不能排程程序通訊(如果使用SQL*NET以前的版本的使用者),網路接收器程序不能將此使用者連線到一排程程序。在這種情況下,網路接收器建立一個專用伺服器程序,建立一種合適的連線。

(以上都參考自網上資料)