生產環境中,表空間長期運行易產生碎片與空間浪費。本文提供一套完整的「查詢 → 分析 → 生成縮容腳本 → ASM 磁盤組巡檢」自動化方案,助 DBA 安全回收閒置空間。
%CQLT%、%CQST%、TS%、IDX%、%HX%)且總量 > 100M 的文件,計算每個文件的實際已用空間。CREATE TABLE system.tbs_detail AS
SELECT a.tablespace_name,
a.bytes/1024/1024 "Sum_MB",
(a.bytes-b.bytes)/1024/1024 "used_MB",
b.bytes/1024/1024 "free_MB",
ROUND(((a.bytes-b.bytes)/a.bytes)*100,2) "percent_used"
FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) bytes, MAX(bytes) largest FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY ((a.bytes-b.bytes)/a.bytes) DESC;
CREATE TABLE system.datafile_space AS
SELECT a.tablespace_name,
a.file_name,
a.bytes/1024/1024 total,
b.sum_free/1024/1024 free
FROM dba_data_files a,
(SELECT file_id, SUM(bytes) sum_free FROM dba_free_space GROUP BY file_id) b
WHERE a.file_id = b.file_id
AND a.tablespace_name IN (
SELECT tablespace_name FROM system.tbs_detail
WHERE (tablespace_name LIKE '%CQLT%' OR tablespace_name LIKE '%CQST%'
OR tablespace_name LIKE 'TS%' OR tablespace_name LIKE 'IDX%'
OR tablespace_name LIKE '%HX%')
AND "Sum_MB" > 100);
SELECT 'ALTER DATABASE DATAFILE ''' || file_name || ''' RESIZE ' ||
ROUND(total - free + 100, 0) || 'M;'
FROM system.datafile_space;
配合 sqlplus / as sysasm 執行,輸出磁盤組名、狀態、類型、總/可用空間(MB),便於判斷是否需擴容或 Rebalance。
SET FEED OFF LINESIZE 200 PAGESIZE 200 ECHO OFF
SPOOL /home/oracle/check_log/chktbs.log APPEND
SELECT name, state, type, total_mb, free_mb FROM v$asm_diskgroup;
SPOOL OFF
SELECT * FROM v$session_longops WHERE opname LIKE 'Resize%';ALTER TABLE ... MOVE 或 SHRINK SPACE 移動高水位標記(HWM)。DROP TABLE system.tbs_detail, system.datafile_space; 避免 SYSAUX 膨脹。將上述邏輯封裝為 Shell/Python 定時任務,配合企業監控平台告警,即可實現表空間容量的「自動感知、人工審核、安全縮容」閉環管理。