Rollback Segment(回滾段)是 Oracle **舊版本(9i 及之前)核心 Undo 儲存結構**,用於儲存資料修改前的舊映像。10g+ 推薦使用 **Automatic Undo Management (AUM)**,但理解 RBS 仍是維護舊系統、排查 ORA-01555 的基石。
| 類型 | 用途 | 建立/上線方式 |
| System | 僅存 SYSTEM 表空間物件前映像 | 建庫自動建立,永遠在線 |
| Non-System (Private) | 存使用者表空間物件前映像 | 手工建立,列入 ROLLBACK_SEGMENTS 參數自動上線 |
| Non-System (Public) | OPS/RAC 環境共用 | 啟動時自動上線 |
| Deferred | 表空間離線時產生的 Undo | 系統自動建立/刪除,不可控 |
空間分配與 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。
- 對策:
- 擴大表空間:
ALTER TABLESPACE rbs ADD DATAFILE ... 或 RESIZE。
- 調大 MAXEXTENTS:
ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);
- 檢查是否有「失控長事務」佔用大量 Undo(
V$TRANSACTION.USED_UBLK 巨大)。
ORA-01555 Snapshot Too Old:讀一致性失效
- 本質:長查詢需要的舊映像已被覆寫(RBS 循環覆蓋)。
- 對策(由輕到重):
- 增大
MINEXTENTS(保留更多 Extents)。
- 增大 Extent Size(
NEXT),減少 Wrap 頻率。
- 設定較高
OPTIMAL,避免過度 Shrink。
- **根治**:遷移至 **Automatic Undo Management (10g+)**,設定
UNDO_RETENTION 保證保留時長。
RBS 數量規劃經驗值
| 系統類型 | 建議策略 |
| OLTP(大量小事務) | **多、小** RBS:每 4 事務 1 個 RBS,單 RBS ≤ 10 事務 |
| 批次/數倉(少量大事務) | **少、大** RBS:每事務 1 個專用大 RBS |
從 RBS 遷移到 AUM (10g+)
- 建立 Undo 表空間:
CREATE UNDO TABLESPACE undotbs1 DATAFILE ...
- 參數切換:
UNDO_MANAGEMENT = AUTO、UNDO_TABLESPACE = undotbs1、UNDO_RETENTION = 900(秒)
- 離線舊 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 的關鍵。
- 上一篇文章: Oracle 進程記憶體架構深度解析:PGA、UGA、CGA 邊界與生命週期
- 下一篇文章: Oracle 殭屍鎖定會話徹底清除:從優雅 KILL 到 OS 強制終結
Copyright ©
程式碼之家 All Rights Reserved