當大批量 DML 操作導致 UNDO 表空間擴展至數十 GB 且物理空間不被釋放時,可通過創建新 UNDO 表空間、切換、舊段離線、刪除舊表空間並手動清理文件的方式完成重構。同樣適用於 TEMP 表空間暴增場景。
SELECT name FROM v$tablespace;
SELECT file_name, bytes/1024/1024 AS size_mb
FROM dba_data_files
WHERE tablespace_name = 'UNDOTBS1';
SELECT s.username, u.name
FROM v$transaction t, v$rollstat r, v$rollname u, v$session s
WHERE s.taddr = t.addr
AND t.xidusn = r.usn
AND r.usn = u.usn
ORDER BY s.username;
SELECT usn, xacts, rssize/1024/1024/1024 AS rssize_gb,
hwmsize/1024/1024/1024 AS hwmsize_gb, shrinks
FROM v$rollstat
ORDER BY rssize;
CREATE UNDO TABLESPACE undotbs2
DATAFILE 'D:\Oracle\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS02.DBF'
SIZE 10M REUSE AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;
ALTER SYSTEM SET undo_tablespace = undotbs2 SCOPE = BOTH;
持續監控 v$rollstat 中 status 列,直到所有屬於 undotbs1 的段顯示 OFFLINE 或 PENDING OFFLINE:
SELECT usn, xacts, status, rssize/1024/1024/1024 AS rssize_gb,
hwmsize/1024/1024/1024 AS hwmsize_gb, shrinks
FROM v$rollstat
ORDER BY rssize;
注意:此過程可能需數分鐘至數小時,視活躍事務長短而定。生產環境請安排維護窗口。
DROP TABLESPACE undotbs1 INCLUDING CONTENTS;
SELECT name FROM v$tablespace;
UNDOTBS01.DBF 物理文件。
原因:DROP TABLESPACE ... INCLUDING CONTENTS 僅移除數據字典關聯,不會自動刪除作業系統層面的物理文件。
CREATE TEMPORARY TABLESPACE temp2 TEMPFILE ...ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;(臨時表空間可直接帶 AND DATAFILES 自動刪除物理文件)。UNDO_RETENTION 與 MAXSIZE,防止無限增長。UNDO TABLESPACE 自動擴展並設置上限,配合 RETENTION GUARANTEE 保護關鍵回滾段。v$undostat 與 dba_hist_undostat 評估空間需求。APPEND 模式減少 UNDO 產生。通過「新建→切換→待離線→刪除→清理文件」的標準化流程,可安全、徹底地回收 UNDO/TEMP 表空間佔用的物理磁盤空間,避免磁盤耗盡導致資料庫掛起。