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

Oracle SCN 機制深度解析:從事務提交到資料檔持久化的完整鏈路

     編輯:Oracle 資料庫基礎

SCN 在事務生命週期中的流轉

  1. 事務開始:分配 Undo Segment、Transaction Table Slot,記錄啟動 SCN (Start SCN)。
  2. 資料修改:
    • 在 Buffer Cache 找到/讀入資料塊。
    • 修改塊內容,生成 Redo Vector (含變更向量、SCN)。
    • 將 Redo Vector 複製到 Log Buffer (Redo Log Buffer)。
    • 修改後的塊標記為「髒塊」 (Dirty Buffer),加入 Dirty List / LRU List。
  3. Commit:
    • LGWR 將 Log Buffer 中該事務的所有 Redo (含 Commit 記錄) **同步寫入** Online Redo Log File (等待 I/O 完成)。
    • 賦予該事務 **Commit SCN** (即當前全局 SCN),寫入 Redo、Control File、Transaction Table Slot。
    • 釋放行鎖 (TX Lock)、Undo Segment 鎖,喚醒等待的併發事務。
    • 向用戶回傳「Commit 成功」。
  4. 後續持久化 (非同步):
    • DBWn 依 Checkpoint / LRU / Tablespace Offline 等觸發條件,將髒塊寫入 Datafile。
    • Checkpoint 完成時,CKPT 更新 Control File 與 Datafile Header 的 **Checkpoint SCN**。

關鍵背景程序與 SCN

程序角色SCN 相關動作
LGWRLog WriterCommit 時同步寫 Redo + Commit SCN 至 Online Redo Log
DBWnDatabase Writer批次寫髒塊至 Datafile,不直接處理 SCN
CKPTCheckpoint協調 Checkpoint,更新 Control File & Datafile Header Checkpoint SCN
SMONSystem Monitor執行個體復原時,從 Datafile Header Checkpoint SCN 開始應用 Redo
ARCnArchiver歸檔 Redo Log,檔名含 SCN 範圍 (thread_seq_scn.dbf)
RFSRemote File Server (DG)接收 Primary Redo,按 SCN 順序寫 Standby Redo Log
MRPManaged Recovery (DG)應用 Standby Redo Log,推進 Standby Checkpoint SCN

SCN 的四大持久化位置 (Checkpoint 時)

  1. Control File: System Checkpoint SCN (V$DATABASE.CHECKPOINT_CHANGE#) — 資料庫級最近 Checkpoint SCN。
  2. Control File: Datafile Checkpoint SCN (V$DATAFILE.CHECKPOINT_CHANGE#) — 各檔案級最近 Checkpoint SCN。
  3. Control File: Stop SCN — 資料庫最後正常關閉時的 SCN (用於啟動時判斷是否需執行個體復原)。
  4. Datafile Header (Block 1) — 檔案自身的 Checkpoint SCN,啟動時與 Control File 比對。

啟動邏輯:若 Stop SCN = 所有 Datafile Header Checkpoint SCN → 乾淨關閉,直接 OPEN;否則 → 執行個體復原,從最小 Datafile Header Checkpoint SCN 開始應用 Redo。

SCN 與 Flashback / 恢復 / 複製的整合

Flashback Query / Table / Database

  • 依 UNDO_RETENTION 保留 Undo,Undo Header 記錄交易 Commit SCN。
  • AS OF SCN 123456:根據 SCN 定位 Undo,重建歷史版本。
  • FLASHBACK DATABASE:依 Flashback Log (含 SCN) 將整個資料庫還原至指定 SCN。

RMAN 備份與恢復

  • 備份集標記 CHECKPOINT_CHANGE# (資料檔) 與 REDO_START_SCN (歸檔)。
  • RECOVER DATABASE UNTIL SCN 123456:精確至 SCN 的 PITR。
  • 增量備份 Level 1:依 BLOCK CHANGE TRACKING 記錄的 SCN 篩選變更塊。

Data Guard / GoldenGate

  • Primary 產生 Redo (含 SCN) → 傳輸 → Standby Apply / GoldenGate Replicat 按 SCN 順序重放,保證邏輯一致性。
  • V$DATAGUARD_STATS.APPLY_LAG = (Primary Current SCN - Standby Applied SCN) / SCN 生成速率。

SCN 匯總風險與 12c+ 保護機制

  • SCN 48 位元 (約 2.8e14),正常增長極難耗盡 (每秒 16,384 SCN 上限,約 500 年)。
  • 異常增長來源:Bug (如 12.1.0.2 某 Patch 前)、惡意程式大量 Commit、錯誤 DBLINK 同步 (舊版)、跨資料庫強制同步。
  • SCN Headroom (12c+):Oracle 內部計算「合理 SCN 上限」 = (當前時間 - 1988/01/01) * 16384。若實際 SCN 接近上限,資料庫會拒絕新交易 (ORA-19700/ORA-19701) 並寫入 Alert Log。
  • 監控:SELECT * FROM V$SCN_HEADROOM;、DBMS_SCN.GET_SCN_HEADROOM。

實用診斷查詢

-- 當前 SCN 產生速率 (需建立監控表定期採樣)
CREATE TABLE scn_monitor (sample_time TIMESTAMP, current_scn NUMBER);
-- 排程每分鐘 INSERT
INSERT INTO scn_monitor VALUES (SYSTIMESTAMP, DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER);

-- 查詢最近 1 小時平均速率
SELECT (MAX(current_scn) - MIN(current_scn)) / 
       (EXTRACT(DAY FROM (MAX(sample_time)-MIN(sample_time)))*86400 +
        EXTRACT(HOUR FROM (MAX(sample_time)-MIN(sample_time)))*3600 +
        EXTRACT(MINUTE FROM (MAX(sample_time)-MIN(sample_time)))*60 +
        EXTRACT(SECOND FROM (MAX(sample_time)-MIN(sample_time)))) AS scn_per_sec
FROM scn_monitor
WHERE sample_time > SYSTIMESTAMP - INTERVAL '1' HOUR;

-- 檢查是否接近 Headroom (12c+)
SELECT * FROM V$SCN_HEADROOM;

-- 查詢資料檔 Header SCN (需 DBA)
SELECT file#, checkpoint_change# FROM v$datafile_header;

總結

SCN 是 Oracle 一致性時鐘的核心,貫穿 事務提交 → Redo 持久化 → Checkpoint 推進 → 執行個體復原 → Flashback → 備份恢復 → 複製同步 全鏈路。理解 SCN 在各背景程序、各儲存介質 (Log Buffer、Online Redo、Control File、Datafile Header、Archive Log、Flashback Log) 的流轉與持久化時機,是診斷資料不一致、設計高可用架構、排查效能抖動的關鍵內功。

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