数据紧急修复之启用错误日志 (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就没有问题了。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

使用 DBMS_PROFILER 定位 PL/SQL 瓶颈代码

      对于SQL的优化,可以借助于SQL tuning advisor实现自动SQL优化与调整。而对于PL/SQL代码而言,既有SQL代码,又有PL/SQ...

611
来自专栏杨建荣的学习笔记

关于dual表的破坏性测试(r3笔记第60天)

关于dual表的破坏性测试,既然是破坏性测试,就需要确定这个测试仅限于测试或者个人学习所用,可能有些sql看似极为简单,但是一旦运行就会导致整个业务系统崩溃。 ...

35613
来自专栏乐沙弥的世界

Oracle 参数文件

主要用来记录数据库的配置文件,在数据库启动时,Oracle读取参数文件,并根据参数文件中的参数设置来配置数据库。

621
来自专栏杨建荣的学习笔记

通过shell定制ash脚本(r3笔记第33天)

ash是在10g以来一个很有用的特性,能够作为awr的补充,对于排查一些历史的问题能够提供更加详细和针对性的数据。 当然个人在使用ash的时候感觉最慢的地方就是...

3014
来自专栏数据和云

Oracle数据库的初始化与跟踪学习方法

编辑说明:《Oracle性能优化与诊断案例精选》出版以来,收到很多读者的来信和评论,我们会通过连载的形式将书中内容公布出来,希望书中内容能够帮助到更多的读者朋友...

3439
来自专栏杨建荣的学习笔记

生产环境sqlldr加载性能问题及分析之一 (r2第17天)

在测试环境中进行了多轮测试,使用sqlldr批量加载数据,csv文件大概有120G左右,在一致的数据量的情况下,测试环境都在一个小时左右,但是在生产环境中竟然跑...

3276
来自专栏Jerry的SAP技术分享

C4C和CRM里获取当前登录用户分配的Organization Unit信息

在Employee的Organization Data区域内看到分配的组织名称,如下图红色下划线所示:

3569
来自专栏乐沙弥的世界

Oracle健康监控及健康检查(Health Monitor)

Oracle数据库包括一个名为Health Monitor的框架,用于运行诊断检查数据库的各种组件。Oracle健康监视器检查各种组件数据库,包括文件,内存,事...

610
来自专栏杨建荣的学习笔记

关于enq: TX - allocate ITL entry的问题分析(r3笔记第66天)

今天发现系统在下午1点左右的时候负载比较高,就抓取了一个最新的awr报告. Snap IdSnap TimeSessionsCursors/SessionB...

3136
来自专栏杨建荣的学习笔记

关于oracle中session跟踪的总结(56天)

数据库中的session在操作中可能会有各种各样的问题,比如一条sql语句执行失败,某一个应用在一些特定的场景下就会有一些性能问题等等,有时候在代码层去做一些d...

2773

扫码关注云+社区