9i前:手工管理回滾段(ROLLBACK SEGMENT),DBA需預估事務並發、手動創建/上線/離線段,極易產生「Snapshot too old」(ORA-01555)。
9i引入:自動UNDO管理,以UNDO TABLESPACE替代,實例自動創建/管理UNDO段。
10g/11g/19g:完全棄用回滾段,UNDO_MANAGEMENT=AUTO為強制默認。
| 作用 | 場景 | 關鍵機制 |
|---|---|---|
| 事務回滾 | ROLLBACK / 異常終止 | UNDO段存儲修改前鏡像,回滾時覆寫數據塊 |
| 讀一致性 | 查詢進行中數據被修改 | 構建CR(Consistent Read)塊,讀取查詢SCN時刻的舊版本 |
| 實例恢復 | 實例崩潰重啟 | SMON前滾Redo + 回滾未提交事務 |
| 閃回查詢 | AS OF TIMESTAMP / AS OF SCN | 利用UNDO保留窗口重構歷史版本 |
| 參數 | 推薦值/策略 | 說明 |
|---|---|---|
UNDO_MANAGEMENT | AUTO (強制) | MANUAL僅用於極舊版本兼容 |
UNDO_TABLESPACE | 顯式指定(如UNDOTBS1) | RAC每實例必須獨立UNDO表空間 |
UNDO_RETENTION | 900秒(默認) → 業務調整 | 目標:滿足最長查詢 + 閃回需求。單位:秒 |
CREATE DATABASE mydb
...
UNDO TABLESPACE undotbs1
DATAFILE '/u01/oradata/mydb/undo01.dbf' SIZE 500M AUTOEXTEND ON MAXSIZE 2G;
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/oradata/mydb/undo02.dbf' SIZE 1G AUTOEXTEND ON;
ALTER SYSTEM SET UNDO_TABLESPACE = undotbs2 SCOPE=BOTH;
-- 觀察切換進度
SELECT tablespace_name, status FROM dba_tablespaces WHERE contents = 'UNDO';
-- 舊表空間狀態變為 PENDING OFFLINE,待活躍事務提交後自動 OFFLINE
-- 確認無活躍事務
SELECT * FROM v$transaction WHERE status = 'ACTIVE';
-- 刪除
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
拒絕拍腦門,使用V$UNDOSTAT歷史統計:
-- 近期高峰期每10分鐘統計
SELECT TO_CHAR(begin_time, 'HH24:MI') begin_time,
undoblks * (SELECT value FROM v$parameter WHERE name = 'db_block_size') / 1024 / 1024 undo_mb,
txncount,
maxquerylen
FROM v$undostat
ORDER BY begin_time DESC;
UNDO_SPACE = UR * (UPS * DB_BLOCK_SIZE) + DBA_EXTENTS overhead
UR = UNDO_RETENTION (秒)
UPS = 平均每秒UNDO塊數 (UNDOBLKS / 600)
建議再乘 1.5~2 倍安全系數
SELECT * FROM V$UNDOSTAT; -- 歷史統計
SELECT * FROM V$UNDO_TARGET_ADVICE; -- 不同RETENTION下的空間建議
| 錯誤/現象 | 根因 | 解決 |
|---|---|---|
| ORA-01555 Snapshot too old | 長查詢需的UNDO已被覆寫 | 增大UNDO表空間 / 增加UNDO_RETENTION / 優化長查詢 / 啟用RETENTION GUARANTEE |
| ORA-30036 無法擴展UNDO表空間 | 表空間滿 / 達到MAXSIZE | ADD DATAFILE / 增大MAXSIZE / 檢查長事務未提交 |
| UNDO表空間持續增長不釋放 | 長事務 / 未提交 / 閃回保留 | 查詢V$TRANSACTION找長事務 / 縮短UNDO_RETENTION / 關閉不必要的閃回 |
| RAC實例啟動報ORA-01157 | 共享存儲上UNDO文件衝突 | 每實例獨立UNDO表空間,UNDO_TABLESPACE指向專屬表空間 |
-- 創建時指定
CREATE UNDO TABLESPACE undotbs_ret
DATAFILE '...' SIZE 2G
RETENTION GUARANTEE; -- 強制保留,寧願DML失敗(ORA-30036)也不覆寫未過期UNDO
-- 修改現有表空間
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
-- 取消
ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;
適用:合規要求嚴格審計軌跡、長時間閃回查詢業務。
-- 1. 當前UNDO使用率
SELECT tablespace_name,
ROUND(used_blocks * 8 / 1024, 2) used_mb,
ROUND(max_blocks * 8 / 1024, 2) max_mb
FROM v$undo_space;
-- 2. 活躍事務與UNDO生成率
SELECT sid, serial#, start_time, used_ublk, used_urec
FROM v$transaction
ORDER BY used_ublk DESC;
-- 3. ORA-01555風險預警
SELECT begin_time, maxquerylen, tuned_undoretention
FROM v$undostat
WHERE maxquerylen > tuned_undoretention;
UNDO表空間是Oracle一致性引擎的「時光機」。核心管理邏輯:設定合理UNDO_RETENTION → 分配足夠空間(含安全系數) → 監控V$UNDOSTAT動態調整 → 關鍵業務啟用RETENTION GUARANTEE。將UNDO納入日常容量規劃與巡檢體系,徹底告別ORA-01555。