ORACLE體系結構,很詳細
轉子:http://blog.csdn.net/sinat_33363493/article/details/51782609
數據庫(Database)
數據庫是一個數據的集合,不僅是指物理上的數據,也指物理、存儲及進程對象的一個組合。Oracle是一個基于B/S模式的
關系型數據庫管理系統(RDBMS)。
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保持不變。行遷移的原理如下圖所示:
無論是行鏈接還是行遷移,都會影響數據庫的性能。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的整數倍。
(以上摘自http://www.bitscn.com/pdb/oracle/200904/160356.html)
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命令來修改。用戶最好不要用編輯器進行修改。
數據庫實例(也稱為服務器Server)就是用來訪問一個數據庫文件集的一個存儲結構及后臺進程的集合。它使一個單獨的數據庫可以被多個實例訪問(也就是ORACLE并行服務器-- OPS)。
實例在操作系統中用ORACLE_SID來標識,在Oracle中用參數INSTANCE_NAME來標識, 它們兩個的值是相同的。數據庫啟動時,系統首先在服務器內存中分配系統全局區(SGA),構成了Oracle的內存結構,然后啟動若干個常駐內存的操作系統進程,即組成了Oracle的 進程結構,內存區域和后臺進程合稱為一個Oracle實例。
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進程個數。
2、LGWR進程:該進程將日志緩沖區寫入磁盤上的一個日志文件,它是負責管理日志緩沖區的一個Oracle后臺進程。LGWR進程將自上次寫入磁盤以來的全部日志項輸出,LGWR輸出:
◆當用戶進程提交一事務時寫入一個提交記錄。 ◆每三秒將日志緩沖區輸出。 ◆當日志緩沖區的1/3已滿時將日志緩沖區輸出。 ◆當DBWR將修改緩沖區寫入磁盤時則將日志緩沖區輸出。
LGWR進程同步地寫入到活動的鏡象在線日志文件組。如果組中一個文件被刪除或不可用,LGWR可繼續地寫入該組的其它文件。
日志緩沖區是一個循環緩沖區。當LGWR將日志緩沖區的日志項寫入日志文件后,服務器進程可將新的日志項寫入到該日志緩沖區。LGWR 通常寫得很快,可確保日志緩沖區總有空間可寫入新的日志項。
注意:有時候當需要更多的日志緩沖區時,LWGR在一個事務提交前就將日志項寫出,而這些日志項僅當在以后事務提交后才永久化。
ORACLE使用快速提交機制,當用戶發出COMMIT語句時,一個COMMIT記錄立即放入日志緩沖區,但相應的數據緩沖區改變是被延遲,直到在更有效時才將它們寫入數據文件。當一事務提交時,被賦給一個系統修改號(SCN),它同事務日志項一起記錄在日志中。由于SCN記錄在日志中,以致在并行服務器選項配置情況下,恢復操作可以同步。
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以前的版本的用戶),網絡接收器進程不能將此用戶連接到一調度進程。在這種情況下,網絡接收器建立一個專用服務器進程,建立一種合適的連接。