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

Oracle 回滾段 (Rollback Segment) 管理完整指南:建立、監控與最佳實務

     編輯:關於SqlServer

回滾段核心概念

回滾段儲存交易的「前像」資料,支援:

  • 交易回滾:ROLLBACK 時依前像還原資料
  • 讀取一致性:查詢看到交易開始時刻 (SCN) 的資料快照
  • 資料庫復原:執行個體復原時回滾未提交交易

系統回滾段 vs. 非系統回滾段

屬性SYSTEM 回滾段非 SYSTEM 回滾段
建立時機建立資料庫時自動建立DBA 手動建立於非 SYSTEM 表空間
用途僅限 Oracle 內部系統交易所有使用者交易
數量固定 1 個可建立多個,依交易量規劃
可否離線不可可 ONLINE/OFFLINE 動態切換

最佳實務:資料庫建立後立即在 SYSTEM 表空間建立一個臨時非系統回滾段,供後續建立其他表空間/回滾段的操作使用;完成後再刪除該臨時段。

回滾段獲取機制:公用 vs. 私用

參數控制

  • TRANSACTIONS:預期同時交易數
  • TRANSACTIONS_PER_ROLLBACK_SEGMENT:每段服務交易數 (預設 30,建議 20-50)
  • ROLLBACK_SEGMENTS:指定私用段名稱清單 (SPFILE/INIT.ORA)
  • MAX_ROLLBACK_SEGMENTS:實例最大段數上限

獲取邏輯

  1. 啟動時先獲取 ROLLBACK_SEGMENTS 指定的私用段
  2. 計算需求公用段數 = CEIL(TRANSACTIONS / TRANSACTIONS_PER_ROLLBACK_SEGMENT) - 私用段數
  3. 不足則自動獲取公用段補足

回滾段建立語法

私用回滾段

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 大小,避免碎片化。

動態管理:ONLINE / OFFLINE

-- 線上/離線 (需 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 管理 (Oracle 9i+)

強烈建議啟用 自動 UNDO 管理 (UNDO_MANAGEMENT=AUTO):

  • 建立 UNDO 表空間:CREATE UNDO TABLESPACE undotbs DATAFILE ...
  • 設定保留時間:UNDO_RETENTION = 900 (秒)
  • Oracle 自動管理段建立/縮減/分配,免除手動規劃負擔。

僅在極特殊效能調校需求下考慮手動管理模式。

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