首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 緩存塊狀態全解析:v$bh 視圖與 XCUR/CR/FREE/READ/SCUR 含義詳解

     編輯:Oracle 資料庫基礎

背景:為什麼要關注緩存塊狀態?

Oracle 從未正式發布完整的緩存塊管理機制文檔,DBA 與內核工程師主要通過 v$bh 動態性能視圖、塊轉储、跟蹤文件反推機制。掌握塊狀態對以下場景至關重要:

  • 緩存命中率異常、buffer busy waits 等待事件分析。
  • RAC 環境下 Global Cache 服務(GCS)傳輸優化。
  • 數據損壞恢復、介質恢復、實例恢復階段的塊狀態識別。
  • 性能調優中判斷熱塊、對象級爭用。

v$bh 視圖核心欄位

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;

非 RAC 環境塊狀態詳解

狀態碼全稱含義典型場景
xcurExclusive Current當前塊的排他版本,持有者可修改。非 RAC 下唯一的「當前」版本。正常 DML 修改、全表掃描讀取後駐留
crConsistent Read一致性讀克隆塊,由當前塊通過應用 Undo 構建,滿足查詢的 SCN 可見性。只讀,可多份共存。長查詢、Flashback Query、CTAS
freeFree空閒塊,未被任何對象使用,位於 LRU 列表末端,可被立即覆寫。緩存預熱後、對象截斷/刪除後
readReading正在從磁盤讀取數據到緩存的過渡狀態,極短暫。物理讀(db file sequential/scattered read)進行中
writeWriting正在將髒塊寫回磁盤的過渡狀態(DBWR/LGWR 異步寫入)。Checkpoint、快速啟動故障恢復

恢復階段特有狀態

狀態碼全稱含義
mrecMedia Recovery介質恢復過程中,從備份恢復數據文件並應用 Redo/Archive Log,塊處於恢復中。
irecInstance Recovery實例恢復(崩潰恢復)階段,SMON 適用線程 Redo 前滾,塊處於恢復中。

RAC 環境擴展狀態

狀態碼全稱含義GCS 角色
scurShared Current共享當前塊,多實例同時持有當前模式,協調由 GCS 授權。可讀可寫,但寫入需獲取排他鎖(X 模式)並廣播失效通知。多實例頻繁讀寫同一塊
xcurExclusive Current實例獨佔當前塊,其他實例需請求獲取(可能觸發 gc cr block busy、gc current block busy)。熱塊單實例寫入
crConsistent ReadRAC 下的 CR 塊可由持有當前塊的實例構建並傳輸(gc cr block 2-way/3-way),減少磁盤讀取。跨實例一致性讀
nullNull實例持有塊但無鎖權限,僅作為佔位,實際訪問時升級。預取、預熱

實戰診斷查詢

1. 找出佔用緩存最多的對象及其塊狀態分佈

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;

2. 監控 RAC Global Cache 爭用熱塊

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;

3. 結合 v$waitstat 定位具體爭用類別

SELECT class, COUNT(*) waits
FROM v$waitstat
WHERE wait_count > 0
ORDER BY waits DESC;

核心機制總結

  1. 狀態流轉:free → read → xcur/scur → (修改) → write → free;查詢時 xcur/scur → cr(構建一致性讀)。
  2. RAC 核心:scur 實現多實例共享讀寫,通過 GCS 鎖傳輸(gc current block、gc cr block)維持一致性,xcur 為排他寫入模式。
  3. 恢復語義:mrec/irec 標記塊正在經歷 Redo 前滾,此時不可訪問,恢復完成後轉為 xcur 或 cr。

結語

熟練解讀 v$bh.status 是 Oracle 內核級性能診斷的入門技能。建議結合 v$bh、gv$bh、v$waitstat、v$sysstat(consistent gets/db block gets)建立全鏈路分析視角:從等待事件 → 爭用塊 → 爭用對象 → SQL/應用優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved