11g 引入 Deferred Segment Creation (遞延段建立):CREATE TABLE 不立即分配段,直到第一筆 INSERT 才建立段。傳統 EXP 依賴段存在來匯出物件,導致空表無法被 EXP 匯出。
| 方法 | 可行性 | 操作複雜度 | 備註 |
|---|---|---|---|
| EXPDP (Data Pump) | ✅ 完美支援 | 低 | 直接讀取字典,不依賴段 |
手動 ALTER TABLE ... ALLOCATE EXTENT + EXP | ⚠️ 可行但繁瑣 | 高 | 需先收集統計資訊識別空表,再逐表分配 |
參數 DEFERRED_SEGMENT_CREATION=FALSE | 🔧 根治但影響全庫 | 中 | 需重啟實例,新建表即分配段 |
expdp hr/hr schemas=hr dumpfile=expdp.dmp directory=dbtest
可匯出含空表在內的所有物件,跨版本匯入亦相容。
-- 需先收集統計資訊
EXEC DBMS_STATS.GATHER_TABLE_STATS('USER', 'TABLE');
-- 或
ANALYZE TABLE tbl COMPUTE STATISTICS;
-- 查詢空表
SELECT table_name FROM user_tables WHERE num_rows = 0;
-- 批量產生 ALLOCATE EXTENT 指令
SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;'
FROM user_tables WHERE num_rows = 0;
實務建議:全面改用 EXPDP/IMPDP,避免手動分配段的維護負債。僅在必須匯入 10g/9i 等舊版本時,才考慮臨時分配段配合 EXP。