執行大批量 DML(如批量更新、刪除、導入)後,UNDO 表空間(或臨時表空間 TEMP)膨脹至數十 GB,即使事務提交、Checkpoint 完成,數據文件物理大小也不會自動縮減,導致磁盤空間告警甚至寫入失敗。本文提供標準化的 UNDO 表空間重構流程,同樣適用於 TEMP 表空間。
DROP TABLESPACE 僅刪除數據字典關聯,不會自動刪除作業系統層面的數據文件,需手動清理。SYSDBA 或 ALTER TABLESPACE、CREATE TABLESPACE、DROP TABLESPACE 權限。-- 表空間列表
SELECT tablespace_name, contents, extent_management, allocation_type
FROM dba_tablespaces
WHERE contents = 'UNDO';
-- 文件詳情
SELECT file_name, bytes/1024/1024 MB, autoextensible, maxbytes/1024/1024 MAX_MB
FROM dba_data_files
WHERE tablespace_name = 'UNDOTBS1';
SELECT s.username, r.name segment_name, t.start_time, t.used_ublk
FROM v$transaction t
JOIN v$rollstat r ON t.xidusn = r.usn
JOIN v$session s ON t.addr = s.taddr
ORDER BY t.start_time;
若有活躍事務,建議等待提交或協調應用端終止。
SELECT usn, xacts, status,
rssize/1024/1024/1024 rssize_gb,
hwmsize/1024/1024/1024 hwm_gb,
shrinks
FROM v$rollstat
ORDER BY rssize DESC;
記錄當前 status 為 ONLINE 的段數量。
CREATE UNDO TABLESPACE undotbs2
DATAFILE 'D:\Oracle\ORADATA\ORCL\undotbs02.dbf'
SIZE 10M REUSE
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
SIZE 10M:初始小文件,避免瞬間佔用大量空間。AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED:按需增長,防止 ORA-01652。ALTER SYSTEM SET undo_tablespace = undotbs2 SCOPE = BOTH;
SCOPE=BOTH:同時修改內存(SPFILE)與運行實例,立即生效並持久化。undotbs2,舊 undotbs1 的 Segment 逐漸變為 OFFLINE 狀態(待活躍事務結束)。-- 定期輪詢,直到無 ONLINE 段
SELECT usn, xacts, status,
rssize/1024/1024/1024 rssize_gb
FROM v$rollstat
WHERE status = 'ONLINE'
ORDER BY rssize DESC;
視事務長短,可能需等待數分鐘至數小時。可通過 v$transaction 監控殘留事務。
SELECT usn, xacts, status, rssize/1024/1024/1024 rssize_gb
FROM v$rollstat
WHERE status = 'ONLINE';
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
INCLUDING CONTENTS:刪除段元數據。AND DATAFILES:關鍵參數,同時刪除作業系統層面的 .dbf 文件,釋放磁盤空間。若省略此參數,需手動刪除文件。SELECT tablespace_name FROM dba_tablespaces WHERE contents = 'UNDO';
應僅剩 undotbs2。
-- 1. 創建新 TEMP
CREATE TEMPORARY TABLESPACE temp2
TEMPFILE 'D:\Oracle\ORADATA\ORCL\temp02.dbf'
SIZE 10M REUSE AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;
-- 2. 切換默認臨時表空間
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
-- 3. 等待舊 TEMP 無活躍排序/雜湊操作(查詢 v$sort_usage)
-- 4. 刪除舊 TEMP
DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
ALTER TABLESPACE undotbs2 RETENTION GUARANTEE; 防止長查詢 ORA-01555,但會限制空間復用,視業務權衡。SELECT tablespace_name, max(bytes)/1024/1024 max_mb FROM dba_data_files GROUP BY tablespace_name; 關注未釋放的大文件。UNDO/TEMP 表空間膨脹是大數據量操作的常見副作用。通過「新建 → 切換 → 等待 OFFLINE → 刪除含文件」標準化流程,可安全、無停機地回收磁盤空間。關鍵在於耐心等待舊 Segment 自然 OFFLINE,切勿強制刪除導致事務失敗或實例不穩定。