本文基于oracle 19c 做事務提交以及oracle臟數據落盤的相關解讀
第一章 相關進程及組件介紹:
1.LGWR:
重做日志條目在系統全局區域 (SGA) 的重做日志緩沖區中生成。LGWR 按順序將重做日志條目寫入重做日志文件。如果數據庫具有多重做日志,則 LGWR 會將重做日志條目寫入一組重做日志文件。
2.DBWn:
數據庫寫入器進程 (DBW)?將數據庫緩沖區的內容寫入數據文件。DBW 進程將數據庫緩沖區緩存中修改的緩沖區寫入磁盤。
盡管一個數據庫寫入器進程 (DBW0) 對于大多數系統來說已經足夠了,但您可以配置其他進程(DBW1 到 DBW9、DBWa 到 DBWz 以及 BW36 到 BW99),以便在系統大量修改數據時提高寫入性能。這些額外的 DBW 進程在單處理器系統上沒有用。
3.CKPT:
在特定時間,CKPT 通過向 DBWn?發送消息來啟動檢查點請求,以開始寫入臟緩沖區。在完成單個檢查點請求后,CKPT 會更新數據文件頭和控制文件以記錄最近的檢查點。
CKPT 每 3 秒檢查一次,查看內存量是否超過初始化參數的值,如果是,則執行“PGA_AGGREGATE_LIMIT”中描述的操作。
4 buffer cache:
數據庫緩沖區高速緩存(也稱為緩沖區高速緩存)是存儲從數據文件中讀取的數據塊副本的內存區域。
緩沖區是一個主內存地址,緩沖區管理器在其中臨時緩存當前或最近使用的數據塊。并發連接到數據庫實例的所有用戶共享對緩沖區緩存的訪問權限。
數據庫緩沖區緩存的用途
Oracle 數據庫使用緩沖區緩存來實現多個目標。
目標包括:
-
優化物理 I/O
數據庫更新緩存中的數據塊,并將有關更改的元數據存儲在重做日志緩沖區中。之后,數據庫將重做緩沖區寫入聯機重做日志,但不會立即將數據塊寫入數據文件。相反,數據庫寫入器 (DBW)?在后臺執行延遲寫入。
COMMIT
-
將經常訪問的塊保存在緩沖區緩存中,并將不經常訪問的塊寫入磁盤
啟用數據庫智能閃存緩存(閃存緩存)后,部分緩沖區緩存可以駐留在閃存緩存中。此緩沖區緩存擴展存儲在一個或多個閃存設備上,這些設備是使用閃存的固態存儲設備。數據庫可以通過在閃存中緩存緩沖區而不是從磁盤讀取來提高性能。
使用 和 初始化參數配置多個閃存設備。緩沖區緩存跟蹤每個設備,并將緩沖區均勻地分配給設備。
DB_FLASH_CACHE_FILE
DB_FLASH_CACHE_SIZE
緩沖區狀態
翻譯出來就是:
-
閑置
緩沖區可供使用,因為它從未使用過或當前未使用過。這種類型的緩沖區是數據庫最容易使用的。
-
干凈
此緩沖區以前使用過,現在包含截至某個時間點的塊的讀取一致性版本。該塊包含數據,但“干凈”,因此不需要檢查點。數據庫可以固定塊并重用它。
-
臟
緩沖區包含尚未寫入磁盤的已修改數據。數據庫在重用塊之前必須對塊進行檢查點。
第二章 事務提交
當事務提交時,將發生以下操作:
-
數據庫為 .
COMMIT
關聯撤消表空間的內部事務表記錄了事務已提交的記錄。事務的對應唯一SCN被分配并記錄在事務表中。
-
日志寫入器進程 (LGWR)?進程將重做日志緩沖區中剩余的重做日志條目寫入聯機重做日志,并將事務 SCN 寫入聯機重做日志。此原子事件構成事務的提交。
-
Oracle 數據庫釋放了對行和表的鎖。
在未提交事務持有的鎖上排隊等待的用戶可以繼續他們的工作。
-
Oracle 數據庫刪除保存點。
在表 10-1?中,事務中不存在任何保存點,因此不會擦除任何保存點。
sal_update
-
Oracle 數據庫執行提交清理。
第三章:redo從緩沖區記錄到日志文件
在以下情況下,LGWR 會寫入自上次寫入以來已復制到緩沖區中的所有重做條目:
-
用戶提交事務。
-
發生聯機重做日志切換。
-
自 LGWR 上次寫信以來已經過去了三秒鐘。
-
重做日志緩沖區已滿三分之一或包含 1 MB 的緩沖數據。
-
DBW 必須將修改后的緩沖區寫入磁盤。
在 DBW 可以寫入臟緩沖區之前,數據庫必須將與緩沖區更改關聯的重做記錄(預寫協議)寫入磁盤。如果 DBW 發現某些重做記錄尚未寫入,它會向 LGWR 發出信號,將記錄寫入磁盤,并等待 LGWR 完成,然后再將數據緩沖區寫入磁盤。
第四章 臟數據落盤:
臟數據落盤主要由DBWn進程來完成,我們來看下官網的解釋:
Process Architecture (oracle.com)
在以下情況下,DBW 進程將臟緩沖區寫入磁盤:
1.描緩沖區數的閾值數后找不到干凈的緩沖區
當服務器進程在掃描緩沖區數的閾值數后找不到干凈的可重用緩沖區時,它會向 DBW 發出寫入信號。如果可能,DBW 在執行其他處理時將臟緩沖區異步寫入磁盤。
這種情況下由參數_db_block_max_scan_pct決定。_db_block_max_scan_pct表示已經掃描的buffer header的個數占整個LRU鏈表上buffer header總數的百分比。
當進程在輔助LRU鏈表和主LRU鏈表上掃描以查找可以覆蓋的buffer header(空閑緩沖區)時,如果已經掃描的buffer header的數量達到一定的限度(由隱藏參數:_db_block_max_scan_pct決定)時,觸發DBWR進程。
如果主LRUW鏈表和輔助LRUW鏈表上的臟數據塊的總數超過一定限度,也將觸發DBWR進程。該限度由隱藏參數:_db_large_dirty_queue決定。
查詢隱含參數的方法:
-- xxx是你想查找的參數名
SELECT ksppinm, ksppstvl, ksppdesc FROM x$ksppi x, x$ksppcv y WHERE x.indx = y.indx AND ksppinm like '%xxxx%';
2.定期啟動
DBW 會定期寫入緩沖區以推進檢查點,檢查點是重做線程中實例恢復開始的位置。檢查點的日志位置由緩沖區緩存中最早的臟緩沖區確定。
在許多情況下,DBW 寫入的塊分散在整個磁盤中。因此,寫入往往比 LGWR 執行的順序寫入慢。DBW 盡可能執行多塊寫入以提高效率。多塊寫入中寫入的塊數因操作系統而異。
這個定期啟動在ckpt解釋中可以找到,每三秒執行一次,檢查點會觸發DBWn進程。
3.其他(這些是在網上搜集的具體沒有驗證)
(1)將表空間設置為離線(offline)狀態時觸發DBWR。
(2)發出命令:alter tablespace … begin backup,從而將表空間設置為熱備份狀態時觸發DBWR。
(3)將表空間設置為只讀狀態時,觸發DBWR。
(4)刪除對象時(比如刪除某個表)會觸發DBWR。
參考:Oracle DBWR,LGWR,CKPT,ARCH 觸發條件 - 墨天輪 (modb.pro)