oracle导入java包时出错,Oracle导入导出的常见错误
做數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,最常用的就是imp/exp和impdp/expdp,經(jīng)常會(huì)碰見(jiàn)各種錯(cuò)誤,之前總結(jié)過(guò)一些,《解決導(dǎo)入過(guò)程中出現(xiàn)的ORA-02289錯(cuò)誤》、《生產(chǎn)數(shù)據(jù)導(dǎo)入測(cè)試環(huán)境碰見(jiàn)的一些問(wèn)題》。
補(bǔ)充一些最近碰見(jiàn)的錯(cuò)誤。
1. exp導(dǎo)出提示"PLS-00302:必須說(shuō)明SET_NO_OUTLINES 組件"
如果客戶端是Oracle 11g,而服務(wù)器端是Oracle 9i,執(zhí)行exp就會(huì)有如下錯(cuò)誤:
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 錯(cuò)誤 6550
ORA-06550: 第 1 行, 第 41 列:
PLS-00302: 必須說(shuō)明 'SET_NO_OUTLINES' 組件
ORA-06550: 第 1 行, 第 15 列:
PL/SQL: Statement ignored
EXP-00000: 導(dǎo)出終止失敗
Oracle不同版本導(dǎo)入導(dǎo)出存在一些問(wèn)題,比如從Oracle 9i中exp出來(lái)的dmp文件(在安裝有oracle 9i的機(jī)器上使用exp命令),可以imp到Oracle 11g中去(裝有Oracle 11g的機(jī)器),但是反過(guò)來(lái)確實(shí)不行。
同時(shí),不能直接在客戶端(安裝有Oracle 11g)上使用exp命令向服務(wù)器端(Oracle 9i)上的數(shù)據(jù)庫(kù)發(fā)出請(qǐng)求導(dǎo)出數(shù)據(jù)到客戶端機(jī)器上,就會(huì)提示“PLS-00302”。
這就是所謂向下兼容。
2. imp導(dǎo)入dmp文件時(shí)報(bào)錯(cuò)"IMP-00038"
執(zhí)行imp導(dǎo)入操作,提示,
IMP-00038: Could not convert to environment character set’s handle
IMP-00000: Import terminated unsuccessfully
這是因?yàn)槲募?dǎo)出用的expdp,而導(dǎo)入時(shí)用的imp,所以導(dǎo)出導(dǎo)入格式不一樣。
3. 執(zhí)行imp導(dǎo)入提示“IMP-00003”
imp導(dǎo)入提示,
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.
原因有可能是在導(dǎo)出的時(shí)間某個(gè)表已經(jīng)被導(dǎo)出了,可是他外鍵關(guān)聯(lián)有數(shù)據(jù)變化,導(dǎo)致不一致,所以報(bào)錯(cuò)。
根本原因,exp不能保證事務(wù)的完整性,例如導(dǎo)出主表,隨后在主表增加記錄,然后在子表增加記錄,提交,這是很可能的。
解決方案是在導(dǎo)出指令中,加入?yún)?shù)consistent=y,默認(rèn)為no,其目的就是保持一致的作用。例如,
$ exp system/oracle file=/home/oracle/exp.dmp owner=oracle consistent=y
如果沒(méi)用consistent=y,已經(jīng)完成了導(dǎo)入,存在違反約束的數(shù)據(jù),此時(shí)就是需要?jiǎng)?chuàng)建約束,可以采用novalidate子句,或者找出不規(guī)則的數(shù)據(jù),清除之后再重新創(chuàng)建約束,可以參考《Oracle違反約束數(shù)據(jù)的workaround》和《表中已存重復(fù)數(shù)據(jù)的情況,如何增加唯一性約束?》。
4. 執(zhí)行imp導(dǎo)入提示"IMP-00013"
執(zhí)行imp導(dǎo)入操作,提示,
IMP-00013: only a DBA can import a file exported by another DBA
IMP-00000: Import terminated unsuccessfully
原因就是exp導(dǎo)出的時(shí)候,用的DBA角色的賬號(hào),因此要求導(dǎo)入的賬號(hào),需要含有DBA角色。但一般很有可能,要導(dǎo)入賬號(hào)是普通賬號(hào),沒(méi)有DBA角色,也不可能臨時(shí)被授予,這就比較費(fèi)勁。
可能的解決方案:
1. 導(dǎo)出用戶,執(zhí)行導(dǎo)出前臨時(shí)revoke DBA角色,完成導(dǎo)出后再授予DBA角色。
2. 授予導(dǎo)入用戶DBA的角色。
3. 授予導(dǎo)入用戶imp_full_database的角色。
每種方案,可能適用于不同的場(chǎng)景。比如方案1,可以算是臨時(shí)的方案,但看著就不是很專業(yè),對(duì)于一些測(cè)試庫(kù),要求不高,可以隨意一些。方案2,這就會(huì)讓導(dǎo)入的用戶,有一些高級(jí)別的操作許可,僅僅為了導(dǎo)入數(shù)據(jù)這么做,實(shí)際上增加了一些風(fēng)險(xiǎn)。方案3,沒(méi)有授予DBA角色,但一些環(huán)境下,可能不會(huì)允許隨意授予角色,例如建榮曾舉了一個(gè)案例,《對(duì)IMP-00013問(wèn)題的思考(r3筆記第71天)》。
因此可以說(shuō)沒(méi)有最佳方案,只有最合適方案,針對(duì)不同的場(chǎng)景,選擇最適合的,這才是最重要的。
如果朋友們碰見(jiàn)了一些其他和導(dǎo)入導(dǎo)出相關(guān)的錯(cuò)誤或者坑,可以文末回復(fù),提醒所有朋友,避免再次入坑,或者可以迅速跳出坑。
總結(jié)
以上是生活随笔為你收集整理的oracle导入java包时出错,Oracle导入导出的常见错误的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: lua 访问oracle,lua语言数据
- 下一篇: oracle12版本无scott解决,O