UNDO 數據(回滾數據)是 Oracle 保障資料一致性、支援交易回滾、讀一致性、閃回查詢與實例恢復的基石。本文系統闡述 UNDO 四大核心作用,並詳細說明自動 UNDO 管理模式下的參數配置、表空間建立/修改/切換/刪除、監控視圖與常用操作指令。
| 作用 | 描述 | 典型場景 |
|---|---|---|
| 1. 交易回滾 | DML 修改前的舊值存入 UNDO 段,ROLLBACK 時將舊值寫回資料段 | 用戶誤執行 UPDATE,執行 ROLLBACK 撤銷 |
| 2. 讀一致性 | 查詢只能看到提交的數據(Read Committed)或特定時間點數據 | Session A 修改未提交,Session B 查詢仍見舊值 |
| 3. 實例恢復 | 實例失效重啟時,SMON 重做 Redo、回滾未提交交易 | 斷電、背景進程異常終止後自動恢復 |
| 4. 閃回查詢 | 9i 新特性,利用 UNDO 重建過去時間點數據 | SELECT * FROM emp AS OF TIMESTAMP ... |
| 參數 | 說明 | 建議值/備註 |
|---|---|---|
| UNDO_MANAGEMENT | 管理模式:AUTO(自動,用 UNDO 表空間) / MANUAL(手動,用回滾段) | 生產環境強制 AUTO |
| UNDO_TABLESPACE | 指定實例使用的 UNDO 表空間 | RAC 每實例必須獨立 UNDO 表空間 |
| UNDO_RETENTION | UNDO 目標保留秒數(指導值),影響閃回查詢最早可達時間點 | 預設 900,視業務調整(如 10800=3小時) |
注意:若
UNDO_MANAGEMENT=AUTO但未設定UNDO_TABLESPACE,Oracle 會自動選第一個可用 UNDO 表空間;若無可用則退回 SYSTEM 回滾段並在 Alert 記錄警告。
CREATE DATABASE db01
...
UNDO TABLESPACE undotbs_01
DATAFILE '/opt/oracle/oradata/ge01/UNDOTBS1.dbf' SIZE 30M;
UNDO TABLESPACE 子句非必填。自動模式下若省略,Oracle 自動建立名為 UNDOTBS1 的 UNDO 表空間。
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/opt/oracle/oradata/ge01/UNDOTBS2.dbf'
SIZE 100M REUSE AUTOEXTEND ON NEXT 50M MAXSIZE 5000M;
AUTOEXTEND 並設 MAXSIZE 防止失控。-- 增加資料檔
ALTER TABLESPACE undotbs2 ADD DATAFILE '/path/undotbs2_02.dbf' SIZE 500M;
-- 移動資料檔(磁碟滿時)
ALTER TABLESPACE undotbs2 RENAME DATAFILE '/old/path.dbf' TO '/new/path.dbf';
-- 脫機/聯機
ALTER DATABASE DATAFILE '/path/undotbs2.dbf' OFFLINE/ONLINE;
-- 熱備份(ARCHIVELOG 模式下)
ALTER TABLESPACE undotbs2 BEGIN BACKUP;
-- ... 複製檔案 ...
ALTER TABLESPACE undotbs2 END BACKUP;
-- 同一時刻單實例僅能使用一個 UNDO 表空間
ALTER SYSTEM SET undo_tablespace = undotbs2 SCOPE = BOTH;
-- 必須先切換走,確認舊表空間所有段 OFFLINE
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
SELECT TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME,
TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME,
UNDOBLKS,
TUNED_UNDORETENTION
FROM V$UNDOSTAT
ORDER BY BEGIN_TIME DESC;
UNDOBLKS:區間內消耗的 UNDO 區塊數,乘以 DB_BLOCK_SIZE 即空間用量。TUNED_UNDORETENTION:10g+ 自動調優後的實際保留秒數,關鍵監控指標。SELECT a.name, b.xacts, b.writes, b.extends, b.shrinks, b.wraps,
b.rssize/1024/1024 AS rssize_mb, b.hwmsize/1024/1024 AS hwm_mb
FROM v$rollname a, v$rollstat b
WHERE a.usn = b.usn
ORDER BY b.rssize DESC;
| 欄位 | 含義 |
|---|---|
| USN | 回滾段號 |
| RSSIZE | 回滾段當前大小 |
| XACTS | 活躍交易數 |
| WRITES | 寫入位元組數 |
| SHRINKS | 收縮次數 |
| EXTENDS | 擴展次數 |
| WRAPS | 環繞次數 |
| GETS/WAITS | 段頭獲取/等待次數(爭用指標) |
COL username FORMAT A10
COL name FORMAT A10
SELECT a.username, b.name, c.used_ublk
FROM v$session a, v$rollname b, v$transaction c
WHERE a.saddr = c.ses_addr
AND b.usn = c.xidusn
AND a.username = 'GEDB';
SELECT extent_id, bytes, status
FROM dba_undo_extents
WHERE segment_name = '_SYSSMU5$';
STATUS:ACTIVE(交易使用中)、UNEXPIRED(保留期內)、EXPIRED(可覆寫)。UNDOTBS。UNDO_TABLESPACE 參數需在各實例 SPFILE 單獨設定,或使用 SID 限定:ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2 SCOPE=SPFILE SID='inst2';-- 粗略估算公式(參考 Oracle 白皮書)
UNDO 空間 ≈ (峰值 TPS × 平均 UNDO 區塊/交易 × UNDO_RETENTION 秒數 × DB_BLOCK_SIZE) + 安全裕度(20-30%)
V$UNDOSTAT.UNDOBLKS 觀察峰值區間消耗,反推所需大小。AUTOEXTEND ON MAXSIZE 20-50GB(視磁碟容量)。UNDO 管理是 Oracle DBA 核心功課。掌握「四大作用 → 三大參數 → 全生命周期操作 → 多維監控」體系,才能在高併發、長查詢、批次作業等複雜場景下,平衡空間佔用與 ORA-01555 風險,保障資料庫穩定高效運行。