天天看點

【Oracle】-【體系結構-DBWR】-DBWR程序相關了解

對DBWR的一些了解

首先從名稱上,DBWR全稱是Database Writer Process,屬于Oracle背景程序的一種,有的地方也叫DBWn,我想這裡是出于DBWR程序個數的原因,DBWR程序在一個Oracle Server中可以最多有20個,編号是DBW1-DBW9和DBWa-DBWj,下面根據不同文檔、官方手冊以及高手帖的了解,總結關于DBWR的一些關鍵點:

1、DBWR是将資料庫buffer cache中的dirty資料塊寫到磁盤中,這裡dirty表示的是buffer cache中被修改的buffer緩存,DBWR是根據LRU算法實作從緩存寫到磁盤的,與dirty相對的還有cold(或clean)塊的概念,即未修改的緩存。根據LRU算法,DBWR會将最近最少被使用的buffer寫入磁盤,以讓其它的資料内容可以寫入該緩存,也就是free buffer增加,否則一味地占用buffer

cache,新的資料就不能利用buffer cache了。

2、新增的DBWn不能在單處理器中使用,對于數量,每8個CPU可以至少利用一個DBWR程序,如果是處理器組,那麼有多少個處理器組,就應該有多少個DBWR程序。DBWR的個數可以由初始化參數DB_WRITER_PROCESSES決定。總結來講,DBWR的個數如果沒有在啟動時由使用者指定,那麼Oracle會根據CPU和處理器組的個數來設定DB_WRITER_PROCESSES參數。

3、DBWR程序會将dirty緩存寫入磁盤,條件是:

(1)、服務程序在掃描buffer個數門檻值(由隐藏參數:_db_block_max_scan_pct,代表已經掃描的buffer header的個數占整個LRU連結清單上buffer header總數的百分比)後還沒找到一塊clean未用的緩存時,會觸發DBWR。當執行其它處理時,DBWR會異步地将dirty緩存寫入磁盤。

(2)、當出現checkpoint時,DBWR會将dirty的緩存寫到磁盤。

(3)、資料檔案或表空間離線。

(4)、表空間在備份。

(5)、表空間隻讀。

(6)、逾時。

(7)、表被删除或截斷。

4、DBWR是批量(多塊)寫入,以提高性能。塊的數量在不同的作業系統有不同的設定。

5、關于DB_WRITER_PROCESSES,官方文檔注明它的預設值是1或CPU數量/8,以及任何大于它的值,範圍是1到20。

最重要的一點就是不是每次交易執行commit時,都會立即調用DBWR,換句話說,commit時DBWR不會做任何事情。