回滾段儲存交易的「前像」資料,支援:
| 屬性 | SYSTEM 回滾段 | 非 SYSTEM 回滾段 |
|---|---|---|
| 建立時機 | 建立資料庫時自動建立 | DBA 手動建立於非 SYSTEM 表空間 |
| 用途 | 僅限 Oracle 內部系統交易 | 所有使用者交易 |
| 數量 | 固定 1 個 | 可建立多個,依交易量規劃 |
| 可否離線 | 不可 | 可 ONLINE/OFFLINE 動態切換 |
最佳實務:資料庫建立後立即在 SYSTEM 表空間建立一個臨時非系統回滾段,供後續建立其他表空間/回滾段的操作使用;完成後再刪除該臨時段。
TRANSACTIONS:預期同時交易數TRANSACTIONS_PER_ROLLBACK_SEGMENT:每段服務交易數 (預設 30,建議 20-50)ROLLBACK_SEGMENTS:指定私用段名稱清單 (SPFILE/INIT.ORA)MAX_ROLLBACK_SEGMENTS:實例最大段數上限ROLLBACK_SEGMENTS 指定的私用段CEIL(TRANSACTIONS / TRANSACTIONS_PER_ROLLBACK_SEGMENT) - 私用段數CREATE ROLLBACK SEGMENT rbs_01
TABLESPACE rbs_ts
STORAGE (
INITIAL 1M
NEXT 1M
MINEXTENTS 10
MAXEXTENTS UNLIMITED
OPTIMAL 10M
PCTINCREASE 0
);
CREATE PUBLIC ROLLBACK SEGMENT pub_rbs_01
TABLESPACE rbs_ts
STORAGE (...);
關鍵儲存參數:
OPTIMAL:理想大小,超過則自動縮減 (釋放 extent),防止段無限增長。建議設為 INITIAL + NEXT * (MINEXTENTS-1)。PCTINCREASE 0:固定 extent 大小,避免碎片化。-- 線上/離線 (需 ALTER ROLLBACK SEGMENT 權限)
ALTER ROLLBACK SEGMENT rbs_01 ONLINE;
ALTER ROLLBACK SEGMENT rbs_01 OFFLINE;
-- 參數檔永久生效 (僅私用段)
-- SPFILE/INIT.ORA 增加: ROLLBACK_SEGMENTS = (rbs_01, rbs_02, ...)
-- 重啟後自動 ONLINE;未列入者重啟後變 OFFLINE
-- 公用段不受參數檔限制,永遠可被任何實例獲取
-- 回滾段狀態與大小
SELECT segment_name, tablespace_name, status, initial_extent, next_extent, min_extents, max_extents, optimal_size
FROM dba_rollback_segs;
-- 即時使用情況 (V$ROLLSTAT)
SELECT rn.name, rs.extents, rs.rssize, rs.optsize, rs.hwmsize, rs.xacts, rs.waits
FROM v$rollstat rs, v$rollname rn WHERE rs.usn = rn.usn;
-- 等待統計 (判斷段數是否不足)
SELECT class, count, time FROM v$waitstat WHERE class IN ('undo header','undo block');
| 現象 | 原因 | 對策 |
|---|---|---|
| ORA-01555 Snapshot too old | 查詢執行時間長,舊 undo 被覆寫 | 增大 OPTIMAL/UNDO 表空間、提高 UNDO_RETENTION、優化長跑查詢 |
| 交易等待 'undo header' 高 | 回滾段不足,新交易無可用段 | 增加公用/私用段數量、調大 TRANSACTIONS_PER_ROLLBACK_SEGMENT |
| 回滾段無限增長 | 未設 OPTIMAL 或長跑交易阻礙縮減 | 設定合理 OPTIMAL、避免超長交易、定期 SHRINK |
強烈建議啟用 自動 UNDO 管理 (UNDO_MANAGEMENT=AUTO):
CREATE UNDO TABLESPACE undotbs DATAFILE ...UNDO_RETENTION = 900 (秒)僅在極特殊效能調校需求下考慮手動管理模式。