1. 程式人生 > >Oracle匯入匯出的常見錯誤

Oracle匯入匯出的常見錯誤

做資料的匯入匯出操作,最常用的就是imp/exp和impdp/expdp,經常會碰見各種錯誤,之前總結過一些,《解決匯入過程中出現的ORA-02289錯誤》、《生產資料匯入測試環境碰見的一些問題》。

 

補充一些最近碰見的錯誤。

 

1. exp匯出提示"PLS-00302:必須說明SET_NO_OUTLINES 元件"

如果客戶端是Oracle 11g,而伺服器端是Oracle 9i,執行exp就會有如下錯誤:

Export: Release 11.1.0.6.0 - Production on 星期五 7月 15 21:40:58 2011    

Copyright (c) 1982, 2007, Oracle.  All rights reserved

EXP-00056: 遇到 ORACLE 錯誤 6550  
ORA-06550: 第 1 行, 第 41 列:  
PLS-00302: 必須說明 'SET_NO_OUTLINES' 元件  
ORA-06550: 第 1 行, 第 15 列:  
PL/SQL: Statement ignored  
EXP-00000: 匯出終止失敗  

 

Oracle不同版本匯入匯出存在一些問題,比如從Oracle 9i中exp出來的dmp檔案(在安裝有oracle 9i的機器上使用exp命令),可以imp到Oracle 11g中去(裝有Oracle 11g的機器),但是反過來確實不行。

同時,不能直接在客戶端(安裝有Oracle 11g)上使用exp命令向伺服器端(Oracle 9i)上的資料庫發出請求匯出資料到客戶端機器上,就會提示“PLS-00302”。

這就是所謂向下相容。

 

2. imp匯入dmp檔案時報錯"IMP-00038"

執行imp匯入操作,提示,

IMP-00038: Could not convert to environment character set’s handle 

IMP-00000: Import terminated unsuccessfully

這是因為檔案匯出用的expdp,而匯入時用的imp,所以匯出匯入格式不一樣。

 

3. 執行imp匯入提示“IMP-00003”

imp匯入提示,

IMP-00017: following statement failed with oracle error 2298:

"ALTER TABLE "A" ENABLE CONSTRAINT REFEREN" "REF_A""

IMP-00003: ORACLE error 2298 encountered

ORA-02298: cannot validate (REFERENCE_O) - parent keys not found

IMP-00017: following statement failed with ORACLE error 2298:

Import terminated successfully with warnings.

原因有可能是在匯出的時間某個表已經被匯出了,可是他外來鍵關聯有資料變化,導致不一致,所以報錯。

根本原因,exp不能保證事務的完整性,例如匯出主表,隨後在主表增加記錄,然後在子表增加記錄,提交,這是很可能的。

解決方案是在匯出指令中,加入引數consistent=y,預設為no,其目的就是保持一致的作用。例如,

$ exp system/oracle file=/home/oracle/exp.dmp owner=oracle consistent=y

如果沒用consistent=y,已經完成了匯入,存在違反約束的資料,此時就是需要建立約束,可以採用novalidate子句,或者找出不規則的資料,清除之後再重新建立約束,可以參考《Oracle違反約束資料的workaround》和《表中已存重複資料的情況,如何增加唯一性約束?》。

 

4. 執行imp匯入提示"IMP-00013"

執行imp匯入操作,提示,

IMP-00013: only a DBA can import a file exported by another DBA

IMP-00000: Import terminated unsuccessfully

原因就是exp匯出的時候,用的DBA角色的賬號,因此要求匯入的賬號,需要含有DBA角色。但一般很有可能,要匯入賬號是普通賬號,沒有DBA角色,也不可能臨時被授予,這就比較費勁。

可能的解決方案:

1. 匯出使用者,執行匯出前臨時revoke DBA角色,完成匯出後再授予DBA角色。

2. 授予匯入使用者DBA的角色。

3. 授予匯入使用者imp_full_database的角色。

 

每種方案,可能適用於不同的場景。比如方案1,可以算是臨時的方案,但看著就不是很專業,對於一些測試庫,要求不高,可以隨意一些。方案2,這就會讓匯入的使用者,有一些高級別的操作許可,僅僅為了匯入資料這麼做,實際上增加了一些風險。方案3,沒有授予DBA角色,但一些環境下,可能不會允許隨意授予角色,例如建榮曾舉了一個案例,《對IMP-00013問題的思考(r3筆記第71天)》。

因此可以說沒有最佳方案,只有最合適方案,針對不同的場景,選擇最適合的,這才是最重要的。