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

Oracle 11g 匯出空表完整解決方案:遞延段建立特性與 EXPDP 最佳實踐

     編輯:Oracle 資料庫相關知識

問題根因

11g 引入 Deferred Segment Creation (遞延段建立):CREATE TABLE 不立即分配段,直到第一筆 INSERT 才建立段。傳統 EXP 依賴段存在來匯出物件,導致空表無法被 EXP 匯出。

解決方案對比

方法可行性操作複雜度備註
EXPDP (Data Pump)✅ 完美支援低直接讀取字典,不依賴段
手動 ALTER TABLE ... ALLOCATE EXTENT + EXP⚠️ 可行但繁瑣高需先收集統計資訊識別空表,再逐表分配
參數 DEFERRED_SEGMENT_CREATION=FALSE🔧 根治但影響全庫中需重啟實例,新建表即分配段

EXPDP 實戰指令

expdp hr/hr schemas=hr dumpfile=expdp.dmp directory=dbtest

可匯出含空表在內的所有物件,跨版本匯入亦相容。

識別空表腳本 (若必須用 EXP)

-- 需先收集統計資訊
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。

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