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

Oracle 8i 回滾段機制與 ORA-01555 成因深度剖析

     編輯:Oracle 資料庫基礎

回滾段架構與循環使用

  • 由連續 Extent 組成,Head 指向當前寫入 Extent,Tail 指向最早未提交事務的回滾資訊。
  • Extent 循環使用:寫滿移至下一 Extent;若下一 Extent 含 Tail(活躍事務),則動態分配新 Extent(擴展)。
  • 8i 限制:單一事務僅能使用一個回滾段;多事務可共用 Extent,但 Active 事務不共用 Block。

一致性讀流程與 ORA-01555 觸發點

  1. 讀取資料區塊 → 行頭 → ITL 取得交易 ID (XID)。
  2. 查交易表:若已提交且 Commit SCN < Query SCN → 區塊清理,重新驗證。
  3. 若交易表找不到 XID(Slot 被覆蓋):比較 Query SCN 與 Control SCN(該回滾段最早可見提交 SCN)。
      - Query SCN ≤ Control SCN → 無法判斷提交順序 → ORA-01555。
      - Query SCN > Control SCN → 接受區塊,標記 ITL "U" (Upper bound commit)。
  4. 讀取 Undo 區塊 (Uba) → 比對 XID:不符 → 回滾資訊被覆蓋 → ORA-01555。
  5. XID 符合 → 記憶體複製區塊,從 Head 應用 Undo 重構舊映像;鏈式追溯至無前驅區塊為止。

兩大 ORA-01555 成因與對策

成因現象對策
交易表 Slot 被覆蓋長查詢遇到高併發短事務,Slot 循環複用增加回滾段數量,降低 Slot 複用頻率
Undo 區塊被覆蓋長查詢所需的 Undo 已被後續事務覆寫增加回滾段大小/Extent 數,延長 Undo 保留時間

診斷利器:Event 1555 Trace

event = "1555 trace name processstate forever, level 10"
-- 產生 Process State Dump,顯示嘗試回滾的區塊類型
-- 若為回滾段 Header Block,證實為 Slot 覆蓋問題

參考:IXORA Undo 詳細說明

延遲區塊清理 的關聯

查詢遇到未清理區塊時觸發清理動作,同樣需讀取 Undo 重構舊映像,故同樣面臨 ORA-01555 風險。

總結

ORA-01555 本質是「查詢 SCN 落在 Undo 保留窗口之外」。8i 以手動管理回滾段為主,透過增加段數量與尺寸、調整 MAXEXTENTS、監控 V$ROLLSTAT 緩解。9i 引入自動 Undo 管理與 UNDO_RETENTION 參數,從根本上簡化了此類問題的處理。

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