生產庫「空間告警」高發,DBA 需要從「事後滅火」轉向「事前預測」。本文提供三套即拿即用的監控腳本,覆蓋表級空間碎片分析、表空間歷史水位趨勢、表級增長預測,構建立體監控視圖。
適用於 ASSM (Automatic Segment Space Management) 表空間,精確統計塊級空閒分布,識別「高水位標記 (HWM) 以下碎片嚴重」導致的空間浪費。
DECLARE
unf_blocks NUMBER; unf_bytes NUMBER;
fs1_blocks NUMBER; fs1_bytes NUMBER; -- 0-25% free
fs2_blocks NUMBER; fs2_bytes NUMBER; -- 25-50% free
fs3_blocks NUMBER; fs3_bytes NUMBER; -- 50-75% free
fs4_blocks NUMBER; fs4_bytes NUMBER; -- 75-100% free
full_blocks NUMBER; full_bytes NUMBER;
BEGIN
DBMS_SPACE.SPACE_USAGE(
segment_owner => UPPER('&1'), -- 表擁有者
segment_name => UPPER('&2'), -- 表名
segment_type => 'TABLE',
unformatted_blocks => unf_blocks,
unformatted_bytes => unf_bytes,
fs1_blocks => fs1_blocks, fs1_bytes => fs1_bytes,
fs2_blocks => fs2_blocks, fs2_bytes => fs2_bytes,
fs3_blocks => fs3_blocks, fs3_bytes => fs3_bytes,
fs4_blocks => fs4_blocks, fs4_bytes => fs4_bytes,
full_blocks => full_blocks, full_bytes => full_bytes
);
DBMS_OUTPUT.PUT_LINE('Unformatted Blocks (Above HWM) : ' || unf_blocks);
DBMS_OUTPUT.PUT_LINE('Full Blocks (0% free) : ' || full_blocks);
DBMS_OUTPUT.PUT_LINE('FS1 Blocks (0-25% free) : ' || fs1_blocks);
DBMS_OUTPUT.PUT_LINE('FS2 Blocks (25-50% free) : ' || fs2_blocks);
DBMS_OUTPUT.PUT_LINE('FS3 Blocks (50-75% free) : ' || fs3_blocks);
DBMS_OUTPUT.PUT_LINE('FS4 Blocks (75-100% free) : ' || fs4_blocks);
END;
/
解讀指南:
• Unformatted 佔比高 → 表曾大量刪除/截斷,HWM 未下移,建議 ALTER TABLE ... MOVE 或 SHRINK SPACE。
• FS1/FS2 佔比高 → 大量更新導致行遷移/鏈接,考慮重組或調整 PCTFREE。
• 定期採集對比,建立表級「碎片健康度」儀表盤。
依賴 AWR 採集(需 Diagnostic Pack 授權),每天保留一個採樣點,繪製表空間增長曲線,支撐容量規劃。
SELECT b.name,
a.rtime,
a.tablespace_usedsize,
a.tablespace_size,
ROUND(100 * a.tablespace_usedsize / a.tablespace_size) used_pct
FROM dba_hist_tbspc_space_usage a,
(SELECT t2.name,
MIN(rtime) rtime,
MIN(tablespace_id) tablespace_id
FROM dba_hist_tbspc_space_usage t1
JOIN v$tablespace t2 ON t1.tablespace_id = t2.ts#
WHERE t2.name = UPPER('&1')
GROUP BY name, SUBSTR(rtime,1,10)
) b
WHERE a.tablespace_id = b.tablespace_id
AND a.rtime = b.rtime
ORDER BY a.rtime;
進階用法:
• 對接 Grafana/Prometheus,繪製「日增長 MB」「預計滿盤天數」趨勢圖。
• 設置閾值告警:used_pct > 85% 觸發工單,自動觸發擴容或清理流程。
基於 AWR 歷史採樣,線性外推未來 7/30/90 天表大小,精準指導分區歸檔、表壓縮、表空間擴容決策。
SELECT * FROM TABLE(
DBMS_SPACE.OBJECT_GROWTH_TREND(
'ECC_CC', -- Owner
'YTKC_ORDERRELEVANCE', -- Table
'TABLE' -- Type
)
);
返回欄位含 TIMEPOINT、SPACE_USAGE、SPACE_ALLOC、QUALITY(採樣質量),可直接餵給預測模型。
| 維度 | 採集頻率 | 保留周期 | 告警閾值 | 自動化響應 |
|---|---|---|---|---|
| 表空間使用率 | 15 分鐘 | 13 個月 | > 85% | 自動生成 Resize/擴容工單 |
| 表碎片率 (FS1+FS2/Total) | 每日 | 6 個月 | > 30% | 納入維護窗口重組計劃 |
| 表日增長量 | 每日 | 13 個月 | 異常激增 | 觸發 SQL 審計、業務確認 |
| 預計滿盤天數 | 每日 | 13 個月 | < 30 天 | 容量擴容項目啟動 |
將上述腳本封裝為 Python/Shell 模組,接入企業 CMDB + 監控平台(Zabbix/Prometheus/Grafana),實現「採集→存儲→分析→告警→工單→執行」全閉環,徹底告別「半夜被空間告警叫醒」的被動局面。