首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 表與表空間監控實戰:空間碎片、歷史趨勢、增長預測三板斧

     編輯:Oracle 資料庫相關知識

生產庫「空間告警」高發,DBA 需要從「事後滅火」轉向「事前預測」。本文提供三套即拿即用的監控腳本,覆蓋表級空間碎片分析、表空間歷史水位趨勢、表級增長預測,構建立體監控視圖。

一、表級空間碎片診斷:DBMS_SPACE.SPACE_USAGE

適用於 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。
• 定期採集對比,建立表級「碎片健康度」儀表盤。

二、表空間歷史水位趨勢:DBA_HIST_TBSPC_SPACE_USAGE

依賴 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% 觸發工單,自動觸發擴容或清理流程。

三、表級增長預測:DBMS_SPACE.OBJECT_GROWTH_TREND

基於 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),實現「採集→存儲→分析→告警→工單→執行」全閉環,徹底告別「半夜被空間告警叫醒」的被動局面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved