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

Oracle 10g UNDO 數據核心作用與 UNDO 表空間全生命周期管理詳解

     編輯:Oracle 資料庫基礎

前言

UNDO 數據(回滾數據)是 Oracle 保障資料一致性、支援交易回滾、讀一致性、閃回查詢與實例恢復的基石。本文系統闡述 UNDO 四大核心作用,並詳細說明自動 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 管理三大核心初始化參數

參數說明建議值/備註
UNDO_MANAGEMENT管理模式:AUTO(自動,用 UNDO 表空間) / MANUAL(手動,用回滾段)生產環境強制 AUTO
UNDO_TABLESPACE指定實例使用的 UNDO 表空間RAC 每實例必須獨立 UNDO 表空間
UNDO_RETENTIONUNDO 目標保留秒數(指導值),影響閃回查詢最早可達時間點預設 900,視業務調整(如 10800=3小時)

注意:若 UNDO_MANAGEMENT=AUTO 但未設定 UNDO_TABLESPACE,Oracle 會自動選第一個可用 UNDO 表空間;若無可用則退回 SYSTEM 回滾段並在 Alert 記錄警告。


三、UNDO 表空間全生命周期操作指南

3.1 建立 UNDO 表空間

方式 A:CREATE DATABASE 時同步建立

CREATE DATABASE db01
...
UNDO TABLESPACE undotbs_01
DATAFILE '/opt/oracle/oradata/ge01/UNDOTBS1.dbf' SIZE 30M;

UNDO TABLESPACE 子句非必填。自動模式下若省略,Oracle 自動建立名為 UNDOTBS1 的 UNDO 表空間。

方式 B:獨立建立(最常用)

CREATE UNDO TABLESPACE undotbs2
DATAFILE '/opt/oracle/oradata/ge01/UNDOTBS2.dbf'
SIZE 100M REUSE AUTOEXTEND ON NEXT 50M MAXSIZE 5000M;
  • UNDO 表空間不能建立任何資料庫物件(表、索引、叢集)。
  • 建議啟用 AUTOEXTEND 並設 MAXSIZE 防止失控。

3.2 修改 UNDO 表空間

-- 增加資料檔
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;

3.3 切換 UNDO 表空間

-- 同一時刻單實例僅能使用一個 UNDO 表空間
ALTER SYSTEM SET undo_tablespace = undotbs2 SCOPE = BOTH;
  • 切換指令瞬間生效,新交易導向新表空間,舊表空間現有交易完成後段離線。
  • RAC 環境下各實例必須使用獨立 UNDO 表空間,不可共用。

3.4 刪除 UNDO 表空間

-- 必須先切換走,確認舊表空間所有段 OFFLINE
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;

四、核心監控視圖與常用查詢腳本

4.1 V$UNDOSTAT:表空間級統計(每 10 分鐘一筆,保留 4 天)

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+ 自動調優後的實際保留秒數,關鍵監控指標。

4.2 V$ROLLNAME + V$ROLLSTAT:UNDO 段級統計

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段頭獲取/等待次數(爭用指標)

4.3 活躍交易與會話關聯查詢

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';

4.4 DBA_UNDO_EXTENTS:區塊級狀態

SELECT extent_id, bytes, status
FROM dba_undo_extents
WHERE segment_name = '_SYSSMU5$';
  • STATUS:ACTIVE(交易使用中)、UNEXPIRED(保留期內)、EXPIRED(可覆寫)。

五、RAC 環境特殊考量

  1. 每個實例必須擁有專屬 UNDO 表空間,命名建議 UNDOTBS。
  2. UNDO_TABLESPACE 參數需在各實例 SPFILE 單獨設定,或使用 SID 限定:ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2 SCOPE=SPFILE SID='inst2';
  3. 跨實例查詢一致性由 Global Cache Service (GCS) 協調,UNDO 區塊可能在實例間傳輸。

六、容量規劃經驗法則

-- 粗略估算公式(參考 Oracle 白皮書)
UNDO 空間 ≈ (峰值 TPS × 平均 UNDO 區塊/交易 × UNDO_RETENTION 秒數 × DB_BLOCK_SIZE) + 安全裕度(20-30%)
  • 透過 V$UNDOSTAT.UNDOBLKS 觀察峰值區間消耗,反推所需大小。
  • 建議初始 1-5GB,AUTOEXTEND ON MAXSIZE 20-50GB(視磁碟容量)。

七、總結

UNDO 管理是 Oracle DBA 核心功課。掌握「四大作用 → 三大參數 → 全生命周期操作 → 多維監控」體系,才能在高併發、長查詢、批次作業等複雜場景下,平衡空間佔用與 ORA-01555 風險,保障資料庫穩定高效運行。

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