数据紧急修复之启用错误日志 (r2第12天)

时间:2022-05-04
本文章向大家介绍数据紧急修复之启用错误日志 (r2第12天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

昨晚对测试环境进行了升级,同步了部分生产的数据。整个过程比较顺利,但是在最后一步启用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就没有问题了。