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

《Oracle 核心技術》閱讀筆記:架構、Redo/Undo、交易一致性、鎖與 Latch、快取、恢復、解析優化、RAC

     編輯:Oracle 教學

《Oracle 核心技術》閱讀筆記:架構、Redo/Undo、交易一致性、鎖與 Latch、快取、恢復、解析優化、RAC

本文為 Jonathan Lewis 經典著作《Oracle Core》的結構化閱讀筆記,涵蓋核心架構、Redo/Undo 機制、交易與一致性、鎖與 Latch、緩存與複製、寫入與恢復、解析與優化、RAC 等核心主題。適合資深 DBA 與效能調優工程師作為知識地圖參考。

目錄結構

  1. 開始:SGA/SCN 核心三進程
  2. Redo 與 Undo
  3. 交易與一致性
  4. 鎖與 Latch
  5. 緩存與複製
  6. 寫入與恢復
  7. 解析與優化
  8. RAC 及「缺陷」
  9. 附錄 A:轉儲與調試

第一章:開始 — 核心三進程

真正需要理解的僅三個背景進程:

  • LGWR (Log Writer):串行寫入 Redo Log Buffer 到 Online Redo Log
  • DBWR (Database Writer):將髒緩衝區寫入資料檔
  • DBWn:多重 DBWR 平行寫入

SCN (System Change Number) 是 Oracle 內部時鐘,序列化所有變更。

第二章:Redo 與 Undo — 變更向量與四步驟

核心概念:Change Vector (改變向量)

Oracle v6 起採用「改變向量」描述資料變更,兩份儲存:

  1. 當前狀態:資料塊本身的修改
  2. Redo 記錄:描述如何重做此變更

資料修改四關鍵步驟(理論順序)

  1. 建立變更操作描述 → Redo Change Vector
  2. 建立 Undo 描述 → 寫入 Undo 表空間的 Undo 區塊
  3. 建立 Undo 描述的描述 → Undo 的 Redo Change Vector
  4. 實際改變資料項

實際執行順序:3 → 1 → 2 → 4

  • 步驟 1 與 3 合併為一條 Redo 記錄寫入 Redo Log Buffer
  • 此設計確保:資料修改可逆,支援崩潰恢復與交易回滾

關鍵洞見

  • Redo 簡單,Undo 複雜:Undo 讓會話看見舊版本資料(讀一致性)
  • Redo Allocation Latch:保護 Redo Log Buffer,類 Linux spin_lock
  • 協作開銷:每個人做一點「額外工作」,避免單點競爭
  • 讀一致性:有限 ITL entries,超出轉為 Undo 記錄「倒帶」
  • 回滾產生新 Redo:類版控系統 revert 產生新 Commit
  • 消除回滾成本:全域暫存表 (GTT)

第三章:交易與一致性

  • Undo Segment 結構:Segment Header、Extent Map、Extent Control Header、Transaction Table (TRN TBL,含 Wrap#)
  • Transaction Table Slot:在 v$transaction 稱為「槽」
  • Commit Cleanout:延遲區塊清除,「均攤」隱藏工作量
  • ORA-1555 Snapshot Too Old:Undo 被覆寫導致讀一致性失敗
  • LOB 特例:僅需關心索引的交易與讀一致性,ORA-22924
  • ITL Entry 結構:XID、UBA、SCN

第四章:鎖與 Latch

Latch (閂鎖)

  • 保護共享記憶體結構
  • 本質:記憶體位置 + Test-and-Set CPU 原子操作 ≈ Linux spin_lock
  • 單核 CPU 下 Spin Lock 無效
  • 統計視圖:v$latch_parent、v$latch_children (gets, misses, spin_gets, sleeps, wait_time)
  • 等待喚醒機制 ≈ Linux 信號量
  • 11g 多數 Latch 移除,僅剩 library cache load lock

Lock (鎖)

  • 保護資料物件(鎖 = 排隊?)
  • 基礎結構:x$ksqrs (v$resource)、x$ksqeq (鎖模式)、v$lock
  • 鎖定流程:加入等待隊列尾 → 等待隊列與轉換隊列無前驅 → 附加到擁有者隊列
  • 死鎖:TX/4 等待
  • 鎖模式:NL, SS, RS, SX, RX, S, SSX, SRX, X
  • KGL Lock/Pin → 11g 後逐步被 Mutex 取代

第五章:緩存與複製

  • 10g ASMM:db_cache_size/shared_pool_size → 固定 Granule
  • 8 種快取:db_cache_size, db_keep_cache_size, db_recycle_cache_size, db_2k_cache_size...
  • LRU/TCH 演算法:極重要,待細讀
  • REPL_AUX → REPL_MAIN 複製機制
  • 查找資料流程:Pin 緩衝區 → 邏輯 IO → 更新 → 載入 Hash 鏈 → 讀一致性拷貝 → 物理 IO → 表掃描

第六章:寫入與恢復

  • LGWR:Redo Sync Writes、Log File Sync
  • 10g+ 新 Commit 選項
  • Redo Wastage、Private Redo Threads
  • DBWR:緩衝區 Header、檢查點隊列、增量檢查點
  • 寫進程交互、相對/絕對檔號
  • 恢復機制

第七章:解析與優化

  • Data Dictionary Cache:v$sgastat
  • cursor_sharing
  • Parse 活動與 Parse Call
  • Library Cache、Shared Pool
  • 解析、優化、Executing、Locking、Pinning

第八章:RAC 及『缺陷』

  • GRD (Global Resource Directory)
  • VIP 與 SCAN
  • 至少 4 Instance 才有 Master/Shadow 意義
  • GCS (Global Cache Service) 與 GES (Global Enqueue Service)
  • Cache Fusion (緩存融合)

附錄 A:轉儲與調試

Systemstate Dump、Errorstack、Hanganalyze、Block Dump 等進階診斷技術。


註:此筆記為粗略結構整理,多處標註「待有時間細讀」。建議配合原書原文與官方文件深入研讀各章節細節。

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