数据紧急修复之启用错误日志

昨晚对测试环境进行了升级,同步了部分生产的数据。整个过程比较顺利,但是在最后一步启用foreign key constraint的时候报了错误。
ora-02298:cannot validate(xxxx.xxxx_fk) -parent keys not found
很明显是一部分数据没有同步到,有一部分数据丢失了。和开发做了确认,从生产中根据条件导出了一个dump,关联的表有100多个,每个表里都是根据筛选条件过滤后的部分数据,可能有一部分数据和现有环境的数据有重复。开发说在主键对应的数据重复的情况下,如果发生主键冲突,reject的数据可以忽略。只要插入没有冲突的数据即可

这个需求也很特别,首先想到的就是直接用Imp来导入,如果发生主键重复,会抛出错误,然后查看下一条记录,直到没有冲突的数据都插入 。

为了保险起见创建了一个临时用户,把数据导入到了这个临时用户中。
. . importing table                    "TEST_DATA"    2810237 rows imported
. . importing table            "TEST_NAME_LINK"       8281 rows imported

然后尝试使用如下的方式查看是否有数据冲突,最后rollback,可以看到确实有冲突数据。
insert into              xxxx.TEST_DATA select *from               app_tmp. TEST_DATA ;
insert into                    xxxx.TEST_NAME_LINK select *from                     app_tmp. TEST_NAME_LINK ;

ORA-00001: unique constraint (XXXX. TEST_DATA_PK) violated 
ORA-00001: unique constraint (XXXX. TEST_NAME_LINK_PK) violated 

做了备份之后,然后尝试使用Imp来插入数据,果然有很多表多抛出很多的冲突数据错误。这是期望中的,但是在TEST_DATA这个表的时候,冲突数据实在太多。每一秒钟大概能够输出3条错误记录,错误如下:
IMP-00019: row rejected due to ORACLE error 1
IMP-00003: ORACLE error 1 encountered
ORA-00001: unique constraint (xxxx.TEST_DATA_PK) violated
Column 1 10000101
Column 2 22-SEP-2012:02:49:52
Column 3
Column 4 105
Column 5 TEST0042
Column 6 TEST911
Column 7 0
....
每一秒钟大概3条记录的样子,结果执行了有快半个小时,还是那不停的输出日志,日志都400M左右了,大小堪比dump文件的大小了。
最后果断取消,因为在这种情况下有一部分数据已经插入了,一部分被reject了,得保证没有冲突的数据都插入。
最后使用错误日志。
EXEC DBMS_ERRLOG.create_error_log(dml_table_name => 'NAME_DATA',SKIP_UNSUPPORTED=>true,ERR_LOG_TABLE_NAME=>'NAME_DATA_ERROR');                 
然后使用如下的语句插入,大概等了有5分钟左右的时间,就提示插入了2万多条记录,是2百多万条记录中的1%的比例。
SQL> insert into name_data select *from app_tmp.name_data LOG ERRORS INTO NAME_DATA_ERROR('duplicate data') REJECT LIMIT UNLIMITED;
28388 rows created.
SQL> commit;

查看错误日志
select count(*)from name_data_error;里面就是被reject的数据。
做了基本确认后,再次尝试enable foregin key constraint就没有问题了。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1192887/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-1192887/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值