解讀Oracle數(shù)據(jù)庫(kù)后臺(tái)進(jìn)程的功能
DBWR進(jìn)程:該進(jìn)程執(zhí)行將緩沖區(qū)寫入數(shù)據(jù)文件,是負(fù)責(zé)緩沖存儲(chǔ)區(qū)管理的一個(gè)Oracle后臺(tái)進(jìn)程。當(dāng)緩沖區(qū)中的一緩沖區(qū)被修改,它被標(biāo)志為“弄臟”,DBWR的主要任務(wù)是將“弄臟”的緩沖區(qū)寫入磁盤,使緩沖區(qū)保持“干凈”。由于緩沖存儲(chǔ)區(qū)的緩沖區(qū)填入數(shù)據(jù)庫(kù)或被用戶進(jìn)程弄臟,未用的緩沖區(qū)的數(shù)目減少。當(dāng)未用的緩沖區(qū)下降到很少,以致用戶進(jìn)程要從磁盤讀入塊到內(nèi)存存儲(chǔ)區(qū)時(shí)無(wú)法找到未用的緩沖區(qū)時(shí),DBWR將管理緩沖存儲(chǔ)區(qū),使用戶進(jìn)程總可得到未用的緩沖區(qū)。
Oracle采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持內(nèi)存中的數(shù)據(jù)塊是最近使用的,使I/O最小。在下列情況預(yù)示DBWR 要將弄臟的緩沖區(qū)寫入磁盤:
當(dāng)一個(gè)服務(wù)器進(jìn)程將一緩沖區(qū)移入“弄臟”表,該弄臟表達(dá)到臨界長(zhǎng)度時(shí),該服務(wù)進(jìn)程將通知DBWR進(jìn)行寫。該臨界長(zhǎng)度是為參數(shù)DB-BLOCK-WRITE-BATCH的值的一半。
當(dāng)一個(gè)服務(wù)器進(jìn)程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT緩沖區(qū)時(shí),沒有查到未用的緩沖區(qū),它停止查找并通知DBWR進(jìn)行寫。出現(xiàn)超時(shí)(每次3秒),DBWR 將通知本身。當(dāng)出現(xiàn)檢查點(diǎn)時(shí),LGWR將通知DBWR.在前兩種情況下,DBWR將弄臟表中的塊寫入磁盤,每次可寫的塊數(shù)由初始化參數(shù)DB-BLOCK- WRITE-BATCH所指定。如果弄臟表中沒有該參數(shù)指定塊數(shù)的緩沖區(qū),DBWR從LUR表中查找另外一個(gè)弄臟緩沖區(qū)。
如果DBWR在三秒內(nèi)未活動(dòng),則出現(xiàn)超時(shí)。在這種情況下DBWR對(duì)LRU表查找指定數(shù)目的緩沖區(qū),將所找到任何弄臟緩沖區(qū)寫入磁盤。每當(dāng)出現(xiàn)超時(shí),DBWR查找一個(gè)新的緩沖區(qū)組。每次由DBWR查找的緩沖區(qū)的數(shù)目是為寢化參數(shù)DB-BLOCK- WRITE-BATCH的值的二倍。如果數(shù)據(jù)庫(kù)空運(yùn)轉(zhuǎn),DBWR最終將全部緩沖區(qū)存儲(chǔ)區(qū)寫入磁盤。
在出現(xiàn)檢查點(diǎn)時(shí),LGWR指定一修改緩沖區(qū)表必須寫入到磁盤。DBWR將指定的緩沖區(qū)寫入磁盤。
在有些平臺(tái)上,一個(gè)實(shí)例可有多個(gè)DBWR.在這樣的實(shí)例中,一些塊可寫入一磁盤,另一些塊可寫入其它磁盤。參數(shù)DB-WRITERS控制DBWR進(jìn)程個(gè)數(shù)。
LGWR進(jìn)程:該進(jìn)程將日志緩沖區(qū)寫入磁盤上的一個(gè)日志文件,它是負(fù)責(zé)管理日志緩沖區(qū)的一個(gè)Oracle后臺(tái)進(jìn)程。LGWR進(jìn)程將自上次寫入磁盤以來(lái)的全部日志項(xiàng)輸出,LGWR輸出:
當(dāng)用戶進(jìn)程提交一事務(wù)時(shí)寫入一個(gè)提交記錄。
每三秒將日志緩沖區(qū)輸出。
當(dāng)日志緩沖區(qū)的1/3已滿時(shí)將日志緩沖區(qū)輸出。
當(dāng)DBWR將修改緩沖區(qū)寫入磁盤時(shí)則將日志緩沖區(qū)輸出。
LGWR進(jìn)程同步地寫入到活動(dòng)的鏡象在線日志文件組。如果組中一個(gè)文件被刪除或不可用,LGWR 可繼續(xù)地寫入該組的其它文件。
日志緩沖區(qū)是一個(gè)循環(huán)緩沖區(qū)。當(dāng)LGWR將日志緩沖區(qū)的日志項(xiàng)寫入日志文件后,服務(wù)器進(jìn)程可將新的日志項(xiàng)寫入到該日志緩沖區(qū)。LGWR 通常寫得很快,可確保日志緩沖區(qū)總有空間可寫入新的日志項(xiàng)。
注意:有時(shí)候當(dāng)需要更多的日志緩沖區(qū)時(shí),LWGR在一個(gè)事務(wù)提交前就將日志項(xiàng)寫出,而這些日志項(xiàng)僅當(dāng)在以后事務(wù)提交后才永久化。
ORACLE使用快速提交機(jī)制,當(dāng)用戶發(fā)出COMMIT語(yǔ)句時(shí),一個(gè)COMMIT記錄立即放入日志緩沖區(qū),但相應(yīng)的數(shù)據(jù)緩沖區(qū)改變是被延遲,直到在更有效時(shí)才將它們寫入數(shù)據(jù)文件。當(dāng)一事務(wù)提交時(shí),被賦給一個(gè)系統(tǒng)修改號(hào)(SCN),它同事務(wù)日志項(xiàng)一起記錄在日志中。由于SCN記錄在日志中,以致在并行服務(wù)器選項(xiàng)配置情況下,恢復(fù)操作可以同步。
CKPT進(jìn)程:該進(jìn)程在檢查點(diǎn)出現(xiàn)時(shí),對(duì)全部數(shù)據(jù)文件的標(biāo)題進(jìn)行修改,指示該檢查點(diǎn)。在通常的情況下,該任務(wù)由LGWR執(zhí)行。然而,如果檢查點(diǎn)明顯地降低系統(tǒng)性能時(shí),可使CKPT進(jìn)程運(yùn)行,將原來(lái)由LGWR進(jìn)程執(zhí)行的檢查點(diǎn)的工作分離出來(lái),由 CKPT進(jìn)程實(shí)現(xiàn)。對(duì)于許多應(yīng)用情況,CKPT進(jìn)程是不必要的。只有當(dāng)數(shù)據(jù)庫(kù)有許多數(shù)據(jù)文件,LGWR在檢查點(diǎn)時(shí)明顯地降低性能才使CKPT運(yùn)行。 CKPT進(jìn)程不將塊寫入磁盤,該工作是由DBWR完成的。
相關(guān)文章:
1. MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理2. SQL Server 數(shù)據(jù)庫(kù)的更改默認(rèn)備份目錄的詳細(xì)步驟3. Sql Server 壓縮數(shù)據(jù)庫(kù)日志文件的方法4. MySQL 如何設(shè)計(jì)統(tǒng)計(jì)數(shù)據(jù)表5. MySql分頁(yè)時(shí)使用limit+order by會(huì)出現(xiàn)數(shù)據(jù)重復(fù)問(wèn)題解決6. SQL Server和Oracle數(shù)據(jù)鎖定比較7. Oracle數(shù)據(jù)庫(kù)中獲取固定記錄數(shù)的實(shí)用方法8. 用 SQL 查詢 DB2 XML 數(shù)據(jù)(1)9. 詳細(xì)分析mysql MDL元數(shù)據(jù)鎖10. 實(shí)例講解如何使用Oracle數(shù)據(jù)庫(kù)to_date()
