Oracle 從未正式發布完整的緩存塊管理機制文檔,DBA 與內核工程師主要通過 v$bh 動態性能視圖、塊轉储、跟蹤文件反推機制。掌握塊狀態對以下場景至關重要:
buffer busy waits 等待事件分析。SQL> DESC v$bh
Name Null? Type
------------- -------- ------------
FILE# NUMBER
BLOCK# NUMBER
CLASS# NUMBER
STATUS VARCHAR2(6) -- 核心狀態欄位
XID RAW(8)
BA RAW(8)
CR_SCN_BAS NUMBER
CR_SCN_WRP NUMBER
CR_XID_USN NUMBER
CR_XID_SLOT NUMBER
CR_XID_SQN NUMBER
...
查詢當前實例存在的所有塊狀態:
SELECT DISTINCT status FROM v$bh;
| 狀態碼 | 全稱 | 含義 | 典型場景 |
|---|---|---|---|
| xcur | Exclusive Current | 當前塊的排他版本,持有者可修改。非 RAC 下唯一的「當前」版本。 | 正常 DML 修改、全表掃描讀取後駐留 |
| cr | Consistent Read | 一致性讀克隆塊,由當前塊通過應用 Undo 構建,滿足查詢的 SCN 可見性。只讀,可多份共存。 | 長查詢、Flashback Query、CTAS |
| free | Free | 空閒塊,未被任何對象使用,位於 LRU 列表末端,可被立即覆寫。 | 緩存預熱後、對象截斷/刪除後 |
| read | Reading | 正在從磁盤讀取數據到緩存的過渡狀態,極短暫。 | 物理讀(db file sequential/scattered read)進行中 |
| write | Writing | 正在將髒塊寫回磁盤的過渡狀態(DBWR/LGWR 異步寫入)。 | Checkpoint、快速啟動故障恢復 |
| 狀態碼 | 全稱 | 含義 |
|---|---|---|
| mrec | Media Recovery | 介質恢復過程中,從備份恢復數據文件並應用 Redo/Archive Log,塊處於恢復中。 |
| irec | Instance Recovery | 實例恢復(崩潰恢復)階段,SMON 適用線程 Redo 前滾,塊處於恢復中。 |
| 狀態碼 | 全稱 | 含義 | GCS 角色 |
|---|---|---|---|
| scur | Shared Current | 共享當前塊,多實例同時持有當前模式,協調由 GCS 授權。可讀可寫,但寫入需獲取排他鎖(X 模式)並廣播失效通知。 | 多實例頻繁讀寫同一塊 |
| xcur | Exclusive Current | 實例獨佔當前塊,其他實例需請求獲取(可能觸發 gc cr block busy、gc current block busy)。 | 熱塊單實例寫入 |
| cr | Consistent Read | RAC 下的 CR 塊可由持有當前塊的實例構建並傳輸(gc cr block 2-way/3-way),減少磁盤讀取。 | 跨實例一致性讀 |
| null | Null | 實例持有塊但無鎖權限,僅作為佔位,實際訪問時升級。 | 預取、預熱 |
SELECT o.object_name, o.object_type, bh.status, COUNT(*) block_count
FROM v$bh bh
JOIN dba_objects o ON bh.objd = o.data_object_id
GROUP BY o.object_name, o.object_type, bh.status
ORDER BY block_count DESC;
SELECT inst_id, file#, block#, class#, status, COUNT(*) cnt
FROM gv$bh
WHERE status IN ('xcur','scur')
GROUP BY inst_id, file#, block#, class#, status
HAVING COUNT(*) > 1 -- 多實例持有同一塊
ORDER BY cnt DESC;
SELECT class, COUNT(*) waits
FROM v$waitstat
WHERE wait_count > 0
ORDER BY waits DESC;
free → read → xcur/scur → (修改) → write → free;查詢時 xcur/scur → cr(構建一致性讀)。scur 實現多實例共享讀寫,通過 GCS 鎖傳輸(gc current block、gc cr block)維持一致性,xcur 為排他寫入模式。mrec/irec 標記塊正在經歷 Redo 前滾,此時不可訪問,恢復完成後轉為 xcur 或 cr。熟練解讀 v$bh.status 是 Oracle 內核級性能診斷的入門技能。建議結合 v$bh、gv$bh、v$waitstat、v$sysstat(consistent gets/db block gets)建立全鏈路分析視角:從等待事件 → 爭用塊 → 爭用對象 → SQL/應用優化。