Oracle 11g 使用傳統 exp 導出時,**空表 (無資料列) 無法導出**,導致遷移/備份不完整。
| 參數 | 預設值 | 行為 |
|---|---|---|
| DEFERRED_SEGMENT_CREATION | TRUE | 建立空表時**不分配 Segment (Extent)**,節省空間;僅在首次 INSERT 時分配 |
exp 僅導出已分配 Segment 的物件,空表因無 Segment 被跳過。
-- 為每個空表插入一筆再刪除,觸發 Segment 分配
BEGIN
FOR t IN (SELECT table_name FROM user_tables WHERE num_rows = 0) LOOP
EXECUTE IMMEDIATE 'INSERT INTO ' || t.table_name || ' VALUES (NULL)'; -- 需根據表結構調整
EXECUTE IMMEDIATE 'ROLLBACK';
END LOOP;
END;
/
-- 或手動執行 ALLOCATE EXTENT (更通用,不需構造 INSERT 值)
SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;'
FROM user_tables
WHERE num_rows = 0;
-- 複製輸出結果在 SQL*Plus 執行
-- 源端導出 CREATE DIRECTORY expdp_dir AS '/backup/expdp'; GRANT READ, WRITE ON DIRECTORY expdp_dir TO source_user; expdp source_user/password \ DIRECTORY=expdp_dir \ DUMPFILE=schema_%U.dmp \ LOGFILE=expdp.log \ SCHEMAS=source_user \ PARALLEL=4; -- 目標端導入 CREATE DIRECTORY impdp_dir AS '/backup/impdp'; GRANT READ, WRITE ON DIRECTORY impdp_dir TO target_user; impdp target_user/password \ DIRECTORY=impdp_dir \ DUMPFILE=schema_%U.dmp \ LOGFILE=impdp.log \ REMAP_SCHEMA=source_user:target_user \ TABLE_EXISTS_ACTION=REPLACE;
| 方案 | 適用場景 | 優點 | 缺點 | 生效範圍 |
|---|---|---|---|---|
| INSERT+ROLLBACK / ALLOCATE EXTENT | 現有空表急需導出 | 即時生效、不重啟 | 需逐表處理、臨時產生 REDO | 現有空表 |
| ALTER SYSTEM SET deferred_segment_creation=FALSE | 新建資料庫、長期規劃 | 一勞永逸、標準化 | 需重啟、不影響既有空表 | 未來新建表 |
| expdp/impdp (Data Pump) | 所有遷移/備份場景 | 功能完整、支援並行/壓縮/網路模式、不受 Segment 限制 | 需目錄物件、版本相容性檢查 | 所有表 (含空表) |
ALTER SYSTEM SET deferred_segment_creation=FALSE SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP;
USER_TABLES.NUM_ROWS=0 且 USER_SEGMENTS 無記錄的表