oracle数据库使用impdp导入数据时遇到ORA-39325错误
开发人员今天让我把昨天搭建的用户系统数据库的读库(erpdb),迁移到另一套测试数据库上(uatdb),也就是写库还用我昨天搭建的测试库的写库(userdb),读库使用他们之前使用的读库(uatdb),这套用户系统使用OGG做同步。
因为他们之前使用的测试数据库(uatdb)和我昨天搭建的测试数据库(erpdb)的数据是不一致的,这样就需要把读库的数据从我昨天搭建的测试数据库(erpdb)迁移到他们之前使用的测试数据库(uatdb),而且OGG的目标端也需要迁移到这个读库(uatdb)上。
注:本文档一共涉及3套数据库,为了方便理解,我用OGG来做区分,OGG的源端是userdb数据库,原OGG的目标端是erpdb,更改后OGG的目标端是uatdb,为了方便下面都使用这三个数据库的名称来说明具体指的是哪个数据库。
迁移方案还是使用数据泵的方式,需要迁移的表一共18张,都是需要用OGG同步的。我的大体操作步骤是先停掉userdb数据库OGG的pump进程,然后从erpdb使用expdp导出需要的18张表,这些都没有遇到问题,不再介绍,再之后使用expdp为uatdb的这十八张表做备份,这时有8张表遇到了ORA-39166和ORA-31655错误。
ORA-39166: Object MEDA_CENTER. ZT_USR_KEY was not found. ORA-31655: no data or metadata objects selected for job
问了开发人员,他们也不知道他们的测试环境为啥会缺少这8张表,但是他们的程序可以正常运行并没有问题,既然这些表不存在,那就跳过吧,反正一会迁移过来的数据有这8张表。
接下来在数据库中删除另外10张表,然后使用impdp将从erpdb导出的数据迁移到uatdb中,这时遇到了ORA-39325错误。
ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."ZT_USR_KEY". ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."ZT_USR_M". ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."APP_SIGN_HISTORY". ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."IF_USER_POINT". ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."IF_USER_TICKETS". ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."ZT_USR_UPDATE_TMP". ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."ZT_USR_REGIS". ORA-39325: TABLE_EXISTS_ACTION cannot be applied to "MEDA_CENTER"."ZT_USR_IDCARD".
ORA-39325错误是由于对象已经存在,而不能把数据追加到这个对象中导致的,可是这些表并不存在啊,即使存在也不会报ORA-39325错误呀,数据会直接追加到表里除非遇到唯一约束冲突,这样也是遇到ORA-00001错误而不是ORA-39325错误,难道是有同名并且非表的对象?通过查询发现,这8个对象在uatdb中竟然是视图,而在erpdb中是表,所以在uatdb数据库导入数据时就遇到了ORA-39325错误。
(uatdb)SQL> col OBJECT_NAME for a15 (uatdb)SQL> select object_name,object_type from user_objects where object_name='ZT_USR_KEY'; OBJECT_NAME OBJECT_TYPE --------------- ------------------- ZT_USR_KEY VIEW (erpdb)SQL> col OBJECT_NAME for a15 (erpdb)SQL> select object_name,object_type from dba_objects where object_name='ZT_USR_KEY' and owner='MEDA_CENTER'; OBJECT_NAME OBJECT_TYPE --------------- ------------------- ZT_USR_KEY TABLE
再uatdb中删除这8个视图,再次导入这8张表,成功完成。然后将userdb端的OGG的PUMP进程修改到uatdb,把erpdb上安装的OGG迁移到uatdb就可以了。