Oracle imp 工具操作介面直觀,但實務中常因權限不足、物件衝突、字符集不匹配導致匯入失敗或資料不全。本文梳理兩大核心匯入場景、權限授予標準流程、常見錯誤對照表與生產級最佳實踐清單。
# 基本形式
imp system/manager@TEST FILE=d:\daochu.dmp
# 實戰增強版(忽略物件已存在錯誤、指定日誌)
imp aichannel/aichannel@HUST FULL=Y FILE=d:\data\newsmgnt.dmp IGNORE=Y LOG=imp_20240115.log
關鍵參數:IGNORE=Y 讓匯入遇到表已存在時跳過建立錯誤,繼續載入資料——重跑、斷點續傳必備。
imp system/manager@TEST FILE=d:\daochu.dmp TABLES=(TABLE1) LOG=imp_table1.log
TRUNCATE TABLE table1 或 DROP TABLE table1 再匯入,避免主鍵衝突。| 檢查項 | 命令/方法 | 異常處理 |
|---|---|---|
| 網路連通性 | tnsping TEST | 檢查 Listener、防火牆、tnsnames.ora |
| 資料庫狀態 | SELECT status FROM v$instance; | OPEN 狀態才能匯入 |
| 用戶權限 | 見下節權限授予腳本 | 缺權限報 IMP-00017 / ORA-01031 |
| 字符集一致性 | SELECT * FROM nls_database_parameters WHERE parameter LIKE 'NLS%CHARACTERSET'; | 客戶端 NLS_LANG 需與目標庫一致 |
| 磁碟空間 | df -h /u01 | 表空間/磁碟剩餘 > DMP 檔 2-3 倍 |
執行用戶需具備 IMP_FULL_DATABASE 權限(全量匯入)或至少 RESOURCE + CREATE SESSION + 目標表空間 Quota(Schema 級匯入)。
-- 以 SYS/SYSTEM 登入
CONNECT / AS SYSDBA
-- 1. 建立匯入用戶(若不存在)
CREATE USER imp_user IDENTIFIED BY xxx
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;
-- 2. 授予核心權限
GRANT CREATE SESSION TO imp_user;
GRANT RESOURCE TO imp_user; -- 含 CREATE TABLE, SEQUENCE, PROCEDURE 等
GRANT IMP_FULL_DATABASE TO imp_user; -- 全量匯入需此角色
GRANT EXP_FULL_DATABASE TO imp_user; -- 對稱授予,便於雙向操作
GRANT DBA TO imp_user; -- 簡化處理:含以上所有,生產環境視風險裁減
-- 3. 表空間配額(若非 UNLIMITED)
ALTER USER imp_user QUOTA 10G ON app_data;
ALTER USER imp_user QUOTA 5G ON app_index;
最小權限原則:僅匯入特定 Schema 時,授予 RESOURCE + CREATE SESSION + 目標表空間 Quota 即可,不要常態授予 DBA。
| 錯誤代碼/訊息 | 原因 | 解法 |
|---|---|---|
| IMP-00017 / ORA-01031: insufficient privileges | 匯入用戶缺權限 | 授予 IMP_FULL_DATABASE 或 RESOURCE+QUOTA |
| IMP-00003: ORACLE error 1435 encountered | 用戶不存在 | 先建立用戶或使用 FROMUSER/TOUSER 重映射 |
| IMP-00041: Import terminated successfully with warnings | 部分物件失敗(通常是約束/索引) | 檢查 .log 定位具體 ORA 錯誤,補建失敗物件 |
| ORA-00001: unique constraint violated | 資料重複(主鍵/唯一鍵衝突) | 匯入前 TRUNCATE TABLE 或刪除衝突資料 |
| ORA-02291: integrity constraint violated - parent key not found | 外鍵父表資料缺失 | 先匯入父表,或匯入時 CONSTRAINTS=N 事後建 FK |
| ORA-01502: index in UNUSABLE state | 匯入過程索引標記不可用 | 匯入後 ALTER INDEX ... REBUILD 或 SKIP_UNUSABLE_INDEXES=Y |
| Character set conversion warning | 來源/目標字符集不同 | 統一 NLS_LANG;若目標為超集(AL32UTF8)通常安全 |
| IMP-00010: not a valid export file | DMP 損壞或版本不相容 | 用目標端版本 Imp 讀取;檢查檔案完整性 |
imp.par,命令列僅 imp parfile=imp.par。IGNORE=Y COMMIT=Y LOG=imp_YYYYMMDD.log BUFFER=32000000。DROP INDEX/DISABLE CONSTRAINT/DISABLE TRIGGER,匯入後並行重建。CONSTRAINTS=N 統一最後建立。STATISTICS=NONE 避免匯入過時統計,匯入後跑 DBMS_STATS.GATHER_SCHEMA_STATS。SELECT COUNT(*) FROM key_tables、關鍵欄位 MIN/MAX、行數與來源一致。Imp 匯入的成敗在於前置檢查(權限/字符集/空間)、參數檔標準化(IGNORE=Y/COMMIT=Y/BUFFER大)、大表優化(索引約束延後)、驗收核對(行數/關鍵值)。將上述清單製成團隊「匯入作業 SOP」,新人也能零失誤完成生產匯入。