海量数据迁移之冲突数据筛查(r2 第1天)

对于数据迁移来说,无论准备工作准备的多么充分,在测试和正式生产环境中,心里还是会对冲突的数据有一些疑虑,心里感觉没底,因为生产的数据也是在不断变化的,要迁移的数据也在做相应的改动,在这样的环境中,其实数据抽取的工作还是顾虑比较少的,只要侧重考虑性能的提升,而在于数据加载的过程中,如果出现主键冲突的字段,不仅会严重拖慢加载的速度,关键对于这些数据的处理,让开发和dba都很头疼,开发需要dba来提供详尽的信息,dba则需要多个team之间进行协调。可能会有一些紧急的数据更改任务,数据的稽核等等。。 对于主键相关的数据排查,如果在数据迁移前能够发现,是最好的了,这样可以极大的减少dba的工作量。 个人就是在这种窘境中这样设想了一个方法,首先通过查询主键信息,得到主键索引相关的列,然后通过Intersect来查询那些主键字段的数据在生产和迁移库上有冲突,这个过程可以创建一个临时的用户来加载外部表,所以省去了创建额外的数据空间,而且可以考虑在备库上执行。排查的过程中因为走了索引扫描,所以查询比较的时候速度还是比较可观的。 基本思路就是通过如下的sql语句来找到冗余的数据。 select xxxxx,xxxxx,xxxx from source_schema.table_01 --加载外部表数据的schema intersect select xxxx,xxxx,xxxx from target_schema.table_01 --目标数据的schema 实现的脚本如下所示:

echo check duplicate data between  $1.$2 $3.$2_EXT2 >> intersect_result.log
sqlplus -s  n1/n1 <<EOF
set pages 0
set feedback off
set linesize 300
col intersect_sql format a1000
spool intersect_result.sql
SELECT 
'select '|| SUBSTR (MAX (SYS_CONNECT_BY_PATH (column_name, ',')), 2)||' from '||table_name||chr(10)||
' intersect '||chr(10)||
'select '|| SUBSTR (MAX (SYS_CONNECT_BY_PATH (column_name, ',')), 2)||' from $3.'||table_name||'_ext2;' intersect_sql
FROM (SELECT index_name, table_name,column_name, rn, LEAD (rn) OVER (PARTITION BY index_name ORDER BY rn) rn1
         FROM (SELECT index_name, table_name,column_name, ROW_NUMBER () OVER (ORDER BY column_position desc) rn
                   FROM all_ind_columns where table_name=upper('$2') and table_owner=upper('$1')))
START WITH rn1 IS NULL
CONNECT BY rn1 = PRIOR rn
GROUP BY index_name,table_name;
spool off;
spool intersect_result.log append
@intersect_result.sql
spool off;
EOF
exit

在此基础上更近一步,可以通过如下的脚本来生成动态的执行脚本,直接执行tmp_compare.sh就可以了。其中tab_parall.lst是一个配置文件。里面包含了需要比较的表 cat ../parfile/tab_parall.lst|awk -v source_schema=$1 -v ext_schema=$2 '{print "ksh compare.sh " source_schema " " $1 " " ext_schema}' > tmp_compare.sh tab_parall.lst的内容类似如下的格式: table01 table02 table03

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏idba

MySQL常见slave延迟原因以及解决方法

一 序言 在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警:

843
来自专栏韩伟的专栏

如何设计运维友好的服务器端系统

如果我们在开发的时候,就充分考虑到系统的运维需求,就算只进行了一些简单的约束,都能让运维工作有巨大的改进。我想这也是所谓DevOps流行起来的原因吧。

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

通过Oracle来辅助MySQL数据问题的恢复(r5笔记第31天)

今天琢磨一个问题,在平时的工作中如果碰到一些不规范的操作,drop,truncate,delete,恢复起来还是很困难的,drop操作在oracle中如果开启了...

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

Mycat分库分表的简单实践

MySQL的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错。 关于...

3616
来自专栏EAWorld

全网首发:逐一解读云原生应用开发“12-Factors”

作者自序: 12原则的提出已有五年之久,可惜业界一直缺乏一篇对其进行简明解读的指导性文章,所以我决定写这样一篇文章。在微服务模式的大背景下,力求对12原则的来龙...

3068
来自专栏程序员互动联盟

【专业技术】Hadoop介绍

Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下...

3606
来自专栏杂烩

hadoop、hive、sqoop安装备忘 原

实际项目中,很多地方需要把数据缓存起来,以加快数据访问速度。比如字典表,比如数据机房表等等,缓存的实现有很多方式,如果项目中有用到mybatis,可以使用二级缓...

813
来自专栏张戈的专栏

【 ES 私房菜 】系统运维数据分析平台架构

网管系统在日常运行过程中会产生各类日志数据,比如 WEB、DB 以及系统等。所以,我们急需一个可以集中收集、分析并输出表报的日志平台,毋庸置疑,ES 就是最佳“...

6431
来自专栏CSDN技术头条

五个解决方案让MongoDB拥有RDBMS的鲁棒性事务

【编者按】在分布式存储解决方案中谈事务一直是件很痛苦的事情,而事务也成了大部分NoSQL解决方案短板所在。近日,MongoDB公司的Antoine Girbal...

1835
来自专栏CSDN技术头条

如何优化让日志处理速达到 5万/s?

本文来自作者 jason 在 GitChat 上分享 「大数据项目性能优化实战分享」

975

扫码关注云+社区