隨著DML操作頻繁執行,表空間內部會產生大量非連續的空閒塊,導致:
ORA-01652錯誤本文提供三種針對性方案,覆蓋從緊急修復到長期治理的完整鏈路。
適用場景:核心業務表碎片嚴重、維護窗口充足、需同時調整存儲參數。
exp userid=/ file=tables.dmp tables=TABLE1,TABLE2 compress=Y
compress=Y關鍵作用:將所有Extent合併為單一Initial Extent,導入時自動分配連續空間。
TRUNCATE TABLE TABLE1; TRUNCATE TABLE TABLE2;(保留結構、索引、權限)imp userid=/ file=tables.dmp tables=TABLE1,TABLE2 ignore=YALTER INDEX ... REBUILD| 優點 | 缺點 |
|---|---|
| 徹底消除行遷移/鏈接、碎片歸零 | 需停業務,大表耗時長 |
| 可同步調整PCTFREE/INITRANS等參數 | 臨時需雙倍存儲空間 |
| 統計信息自動收集 | 外鍵約束需先禁用後啟用 |
適用場景:業務7×24不停機、碎片中等、表空間為字典管理模式(DMT)。
ALTER TABLESPACE users COALESCE;
SMON進程掃描表空間位圖,將相鄰的空閒Extent合併為更大Extent。僅合併相鄰塊,不移動數據,不鎖表,業務無感知。
SELECT tablespace_name,
COUNT(*) fragments,
MAX(bytes)/1024/1024 max_free_mb,
SUM(bytes)/1024/1024 total_free_mb
FROM dba_free_space
WHERE tablespace_name = 'USERS'
GROUP BY tablespace_name;
觀察fragments下降、max_free_mb上升即生效。
核心參數:PCTINCREASE控制Extent增長倍率,關鍵影響SMON合併行為。
ALTER TABLESPACE users STORAGE (PCTINCREASE 1);
| PCTINCREASE值 | SMON行為 | Extent增長模式 | 建議場景 |
|---|---|---|---|
| 0 | 不合併碎片(除非手動COALESCE) | 固定大小(NEXT恆定) | 嚴格控制空間、配合手動維護 |
| 1(推薦) | 定期合併相鄰碎片 | 緩慢增長,近似線性 | 通用生產環境,平衡自動化與可控性 |
| >1(如50) | 合併頻率同1 | 幾何級數增長(1.5倍) | 禁用:導致空間浪費、分配失敗 |
AUTOEXTEND ON NEXT 100M MAXSIZE 10G控制,純線性增長若表空間不再創建新對象,PCTINCREASE只需≠0即可,具體值無影響。
碎片嚴重度評估
│
├─ 緊急/核心表/有維護窗口 → 方案一 EXP/IMP 重組
│
├─ 輕微/無停機窗口/DMT表空間 → 方案二 COALESCE 手動合併
│
└─ 長期治理/防患未然 → 方案三 PCTINCREASE=1 + 定期監控
SELECT tablespace_name,
ROUND(SUM(bytes)/1024/1024,2) total_free_mb,
COUNT(*) fragment_count,
ROUND(MAX(bytes)/1024/1024,2) largest_free_mb,
ROUND(COUNT(*) * 100 / NULLIF(SUM(blocks),0),2) frag_ratio_pct
FROM dba_free_space
GROUP BY tablespace_name
HAVING COUNT(*) > 100 OR ROUND(MAX(bytes)/1024/1024,2) < 100
ORDER BY fragment_count DESC;
告警閾值:碎片數>100 或 最大連續空閒<100MB 觸發人工介入。
表空間碎片治理遵循「急症手術(EXP/IMP)→日常理療(COALESCE)→長效養生(PCTINCREASE=1)」三級體系。配合每日監控腳本、定期ANALYZE/DBMS_STATS收集統計信息,可將空間管理風險控制在業務可接受範圍內。