今天现场工作人员报告在IMP一个dmp文件时报超出最大游标数的错误,ORA-01000: maximum open cursors exceeded。
询问了一下基本情况,上metalink查了一下,IMP中根本就没有提及任何有关ORA-01000的错误,这就有些纳闷了。这时候,通过邮件收完了dmp文件,自己模拟测试了一下,发现其实错误的原因根本不是ORA-01000,而是IMP-00093,只是由于太多的IMP-00093错误消耗了大量的cursor,导致一个session中的cursor数超过了定义的300,所以在最后就开始报ORA-01000错误了。
IMP-00093: Inconsistency between dumpfile constraint definition for table ACCOUNT with columns ("ACCTID" , "CURRENCYID")
首先查错误文档,基本上没有什么有意义的提示。
IMP-00093 Inconsistency between dumpfile constraint definition for table string with columns (string)
Cause: Import failed to locate a base table for a constraint that was defined in the dump file and statistics were not imported.
Action: Check to see if the table and constraint exist. If the table and constraint exist, then report this to Oracle Support Services as an Import internal error.
再次查metalink,果然,又是一个bug。
Bug 2834541 - IMP-93 on import when using the TOUSER parameter
这个bug在9.2.0.6和10.1.0.3中被修复,起因是在导入的过程中要导入系统生成的约束,类似SYS_C0027639, 但是metalink上只提到了这个原因,但是以前很多次的imp应该都是有这样系统生成的约束名,并没有报错过,所以应该还是有另外的因素参杂其中的,比如统计信息的生成。没有继续研究。
解决方法:在IMP时使用indexes=no或者statistics=none参数,当然后者比较好一些。
问题是解决了,但是多说一点,在设计schema时,最好手动指定所有约束的名字,这是一个好的习惯。