SELECT df.tablespace_name "表空間",
(df.totalspace - NVL(fs.freespace, 0)) "已使用(MB)",
NVL(fs.freespace, 0) "剩餘(MB)",
df.totalspace "總計(MB)",
ROUND(100 * (1 - NVL(fs.freespace, 0) / df.totalspace), 2) "使用率(%)"
FROM (
SELECT tablespace_name, ROUND(SUM(bytes)/1048576) totalspace
FROM dba_data_files GROUP BY tablespace_name
) df,
(
SELECT tablespace_name, ROUND(SUM(bytes)/1048576) freespace
FROM dba_free_space GROUP BY tablespace_name
) fs
WHERE df.tablespace_name = fs.tablespace_name(+)
ORDER BY 5 DESC;
關鍵點:外連接(+)確保無空閒空間表空間也顯示,單位轉換為MB(1048576=1024²)。
SELECT tablespace_name,
SQRT(MAX(blocks)/SUM(blocks)) * (100/SQRT(SQRT(COUNT(blocks)))) FSFI
FROM dba_free_space
GROUP BY tablespace_name
ORDER BY FSFI DESC;
原理:綜合考慮自由區塊最大值、總和、數量三個維度。
ALTER TABLESPACE ts_name DEFAULT STORAGE (PCTINCREASE 1);
設置PCTINCREASE > 0啟用SMON後台進程定期合並相鄰自由區塊。PCTINCREASE=1為推薦值。
ALTER TABLESPACE ts_name COALESCE;
立即合並該表空間所有相鄰自由區塊,不移動數據,在線操作,鎖定時間極短。
-- 1. 創建新表空間
CREATE TABLESPACE ts_new DATAFILE '...' SIZE 10G AUTOEXTEND ON;
-- 2. 移動表/索引 (在線可用DBMS_REDEFINITION)
ALTER TABLE big_table MOVE TABLESPACE ts_new;
ALTER INDEX big_idx REBUILD TABLESPACE ts_new;
-- 3. 刪除舊表空間 (確認無對象後)
DROP TABLESPACE ts_old INCLUDING CONTENTS AND DATAFILES;
DBA_SEGMENTS定位大對象、高增長對象| 現象 | 可能原因 | 處理 |
|---|---|---|
| 使用率突然飆升 | 大批量導入、歸檔失效、審計日志暴增 | 檢查DBA_SEGMENTS增長對象、清理歸檔目標 |
| 剩餘空間充足但報ORA-01653 | 碎片嚴重、文件未自動擴展、達到MAXSIZE | COALESCE、檢查AUTOEXTEND、調整MAXSIZE |
| UNDO表空間持續增長 | 長事務、提交頻率低、UNDO_RETENTION過大 | 優化事務邏輯、調整保留時間、啟用保留保證 |