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

Oracle Rollback Segment 全生命週期管理:從概念到故障排查

     編輯:Oracle 資料庫基礎

什麼是 Rollback Segment?

Rollback Segment(回滾段)是 Oracle **舊版本(9i 及之前)核心 Undo 儲存結構**,用於儲存資料修改前的舊映像。10g+ 推薦使用 **Automatic Undo Management (AUM)**,但理解 RBS 仍是維護舊系統、排查 ORA-01555 的基石。

三大核心職能

  1. 事務回滾:ROLLBACK 時用前映像還原資料。
  2. 事務恢復:Instance Crash 後,利用 Redo + Undo 回滾未提交事務。
  3. 讀一致性:查詢啟動時刻 (SCN) 之後的未提交變更不可见;長查詢遇到被修改區塊,用 Undo 構造 CR (Consistent Read) 版本。

Rollback Segment 分類

空間分配與 Extent 循環機制

  • 事務啟動 → 分配擁有**最少活動事務**的 RBS。
  • 可指定:SET TRANSACTION USE ROLLBACK SEGMENT rbs01;
  • 事務循環使用 Extents:Extent 1 → 2 → 3 → 4 → 回 Extent 1(Wrap)。
  • 多事務可共用同一 Extent,**但同一 Block 只屬於一個事務**。

擴展 與 OPTIMAL 參數

  • 當前 Extent 滿、下一 Extent 被活動事務佔用 → **分配新 Extent(Extend)**。
  • Extend 上限受 MAXEXTENTS 限制。
  • OPTIMAL:指定 RBS 閒置時應縮減到的大小(Extent 數 × Extent Size)。超過 OPTIMAL 的 Extent 在事務結束後會被**動態回收 (Shrink)**,歸還表空間自由空間。
  • 建議:INITIAL = NEXT、設定合理 OPTIMAL、**勿設 MAXEXTENTS=UNLIMITED**、RBS 專用表空間。

建立範例

CREATE ROLLBACK SEGMENT rbs01
  TABLESPACE rbs
  STORAGE (
    INITIAL 100K
    NEXT 100K
    MINEXTENTS 10
    MAXEXTENTS 500
    OPTIMAL 1000K
  );

ALTER ROLLBACK SEGMENT rbs01 ONLINE;

-- 參數檔自動上線
ROLLBACK_SEGMENTS = (rbs01, rbs02, rbs03)

監控關鍵視圖與查詢

1. 當前活動事務與 RBS 對應

SELECT s.USERNAME, t.XIDUSN, t.UBAFIL, t.UBABLK, t.USED_UBLK
FROM V$SESSION s, V$TRANSACTION t
WHERE s.SADDR = t.SES_ADDR;

2. RBS 狀態與大小

SELECT segment_name, status, initial_extent, next_extent, min_extents, max_extents, optimal_size
FROM DBA_ROLLBACK_SEGS;

3. 擴展/縮減歷史

SELECT * FROM V$WAITSTAT WHERE CLASS = 'undo header';  -- 等待統計
SELECT * FROM V$UNDOSTAT;  -- 10g+ AUM 統計

兩大經典錯誤與解決方案

ORA-01560 / ORA-01628:空間不足或達 MAXEXTENTS

  • 現象:事務需要更多 Undo,但表空間滿或 RBS 達 MAXEXTENTS。
  • 對策:
    1. 擴大表空間:ALTER TABLESPACE rbs ADD DATAFILE ... 或 RESIZE。
    2. 調大 MAXEXTENTS:ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);
    3. 檢查是否有「失控長事務」佔用大量 Undo(V$TRANSACTION.USED_UBLK 巨大)。

ORA-01555 Snapshot Too Old:讀一致性失效

  • 本質:長查詢需要的舊映像已被覆寫(RBS 循環覆蓋)。
  • 對策(由輕到重):
    1. 增大 MINEXTENTS(保留更多 Extents)。
    2. 增大 Extent Size(NEXT),減少 Wrap 頻率。
    3. 設定較高 OPTIMAL,避免過度 Shrink。
    4. **根治**:遷移至 **Automatic Undo Management (10g+)**,設定 UNDO_RETENTION 保證保留時長。

RBS 數量規劃經驗值

類型用途建立/上線方式
System僅存 SYSTEM 表空間物件前映像建庫自動建立,永遠在線
Non-System (Private)存使用者表空間物件前映像手工建立,列入 ROLLBACK_SEGMENTS 參數自動上線
Non-System (Public)OPS/RAC 環境共用啟動時自動上線
Deferred表空間離線時產生的 Undo系統自動建立/刪除,不可控

從 RBS 遷移到 AUM (10g+)

  1. 建立 Undo 表空間:CREATE UNDO TABLESPACE undotbs1 DATAFILE ...
  2. 參數切換:UNDO_MANAGEMENT = AUTO、UNDO_TABLESPACE = undotbs1、UNDO_RETENTION = 900(秒)
  3. 離線舊 RBS:ALTER ROLLBACK SEGMENT rbs01 OFFLINE; 逐個離線並 Drop。

結語

Rollback Segment 是 Oracle 早期 Undo 管理的精妙設計,Extent 循環、OPTIMAL Shrink、讀一致性構造皆體現「空間換時間」的工程智慧。現代系統請直接使用 **AUM + UNDO_RETENTION**,但維護舊系統時,理解 Extent 機制、監控 V$TRANSACTION、精準調整 OPTIMAL/MAXEXTENTS 仍是解決 ORA-01555、ORA-01628 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
系統類型建議策略
OLTP(大量小事務)**多、小** RBS:每 4 事務 1 個 RBS,單 RBS ≤ 10 事務
批次/數倉(少量大事務)**少、大** RBS:每事務 1 個專用大 RBS