Oracle imp 看似簡單,但生產環境中匯入失敗、資料不全、效能極差,絕大多數集中在六大類根因。本文逐一拆解現象、原因、解法與預防措施,並附上生產級參數檔防禦模板。
ORA-00955: name is already used by an existing object,匯入停止或跳過該表資料。IGNORE=Y:表存在則跳過建立,直接載入資料。ORA-00001 記錄於日誌)。DROP TABLE、DROP SEQUENCE、DROP PROCEDURE、DROP TRIGGER 等。TRUNCATE TABLE 清空資料,再 IGNORE=Y 匯入。IGNORE=Y(防禦性,即使預期表不存在)。ORA-02291: integrity constraint violated - parent key not found:子表資料先匯入,父表尚無資料。ORA-02298: cannot validate (FK) - parent keys not found:匯入後啟用 FK 失敗。TABLES=(PARENT_TABLE, CHILD_TABLE) 父表優先。CONSTRAINTS=N,資料全載入後,手動執行 ALTER TABLE ... ADD CONSTRAINT ...。ALTER TABLE child DISABLE CONSTRAINT fk_xxx,匯入後 ENABLE NOVALIDATE 快速啟用,再 VALIDATE。IMP-00017 / ORA-01031: insufficient privilegesIMP_FULL_DATABASE。GRANT IMP_FULL_DATABASE TO imp_user;
-- 或由 SYSTEM/SYS 執行 imp,配合 FROMUSER/TOUSER 重映射
ORA-01658: unable to create INITIAL extent for segment in tablespaceCOMPRESS=Y(預設)導致匯出時將所有 Extents 合併為單一巨大 INITIAL,匯入時需連續空間。COMPRESS=N:保留原段儲存參數,匯入時按原 Extent 分配,極大降低連續空間需求。AUTOEXTEND、足夠 MAXSIZE。ALTER TABLESPACE ... ADD DATAFILE 擴容。Character set conversion warning 或 EXP-00056。export NLS_LANG=AMERICAN_AMERICA.AL32UTF8。imp 讀取來源端 exp 產出的 DMP。# imp_defense.par - 複製即用
USERID=system/xxx
FILE=source.dmp
LOG=imp_&DATE.log
IGNORE=Y
COMMIT=Y
BUFFER=64000000
FEEDBACK=50000
STATISTICS=NONE
SKIP_UNUSABLE_INDEXES=Y
GRANTS=Y
INDEXES=Y
CONSTRAINTS=Y
ROWS=Y
# 視場景啟用:
# FROMUSER=old_schema
# TOUSER=new_schema
# TABLES=(table1,table2)
# FULL=Y
六大避坑核心對策:IGNORE=Y 防物件衝突、CONSTRAINTS=N/順序控制 防 FK 失敗、IMP_FULL_DATABASE 防權限不足、COMPRESS=N 防大表空間失敗、NLS_LANG 對齊 防字符集損壞、高版本 Imp 讀低版本 DMP 防版本不相容。將防禦參數檔模板納入團隊標準,匯入失敗率可降至 1% 以下。