當 Undo 表空間空間不足、需調整大小或進行維護時,Oracle 支援動態切換 Undo 表空間,無需停機。本文詳述完整切換流程、關鍵檢查 SQL 及兩種場景(有/無作用中事務)的實操步驟。
-- 檢查是否有 ACTIVE 範段(正在回滾/被查詢引用)
SELECT SUM(bytes) FROM dba_undo_extents
WHERE tablespace_name = 'UNDOTBS1' AND status = 'ACTIVE';
-- 若非 NULL,表示有未提交事務或長查詢依賴,切換後舊表空間進入 PENDING OFFLINE
-- 強制關機 SHUTDOWN IMMEDIATE 會失敗,SMON 重啟後仍需繼續回滾,影響效能
-- 1. 建立新 Undo 表空間 (不可用 ASSM、UNIFORM SIZE,預設 LMT)
CREATE UNDO TABLESPACE undotbs3 DATAFILE '/dev/rlv_04_210' SIZE 500M AUTOEXTEND ON;
ALTER TABLESPACE undotbs3 ADD DATAFILE '/dev/rlv_04_211';
ALTER TABLESPACE undotbs3 ADD DATAFILE '/dev/rlv_04_212';
ALTER TABLESPACE undotbs3 ADD DATAFILE '/dev/rlv_04_213';
ALTER TABLESPACE undotbs3 ADD DATAFILE '/dev/rlv_04_214';
-- 2. 動態切換 (UNDO_TABLESPACE 為動態參數)
ALTER SYSTEM SET undo_tablespace = 'undotbs3' SCOPE = BOTH; -- 若 RAC 需指定 SID
-- 3. 離線並刪除舊表空間 (需確認無 ACTIVE 事務)
ALTER TABLESPACE undotbs1 OFFLINE;
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
SELECT COUNT(*) FROM v$transaction; -- 應為 0
CREATE UNDO TABLESPACE undotbs3 ...;
ALTER SYSTEM SET undo_tablespace = 'undotbs3';
ALTER TABLESPACE undotbs1 OFFLINE;
DROP TABLESPACE undotbs1;
-- 1. 找出阻塞事務的 Session/Process
SELECT s.sid, s.serial#, p.spid
FROM v$transaction t, v$session s, v$process p
WHERE t.addr = s.taddr AND s.paddr = p.addr;
-- 2. 業務低峰期 Kill 對應 OS Process (謹慎!會導致用戶報錯)
-- $ kill -9
-- 3. 再次確認 v$transaction 為 0 後,執行場景一步驟
PENDING OFFLINE,允許既存事務繼續使用,但不接受新事務。ALTER SYSTEM SET undo_tablespace='undotbs3' SID='inst1';V$UNDOSTAT 確認新表空間運作正常掌握動態 Undo 切換,讓 Oracle 維護操作更從容、業務零中斷。