海量数据迁移之冲突数据筛查

对于数据迁移来说,无论准备工作准备的多么充分,在测试和正式生产环境中,心里还是会对冲突的数据有一些疑虑,心里感觉没底,因为生产的数据也是在不断变化的,要迁移的数据也在做相应的改动,在这样的环境中,其实数据抽取的工作还是顾虑比较少的,只要侧重考虑性能的提升,而在于数据加载的过程中,如果出现主键冲突的字段,不仅会严重拖慢加载的速度,关键对于这些数据的处理,让开发和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
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

时间: 2024-07-30 10:58:38

海量数据迁移之冲突数据筛查的相关文章

大数据筛查发现马脚 私募业重拳治乱力促行业良性发展

私募业重拳治乱力促行业良性发展 近年来,私募行业蓬勃发展,私募基金数量呈爆发式增长,但同时问题和风险也在不断凸显.如何促进私募行业规范.自律.健康发展成为市场各方颇为关心的问题. 由于私募产品呈现出多样化.复杂化等特点,导致信息披露易存在瑕疵.业内人士表示,在这样的情况下,相关违法违规的主体常借助多个通道来隐匿自身的违法违规行为,这加剧了市场上的信息不对称,损害了投资者的知情权,破坏了以信息披露为核心的市场秩序和制度,也给监管机构造成了一些障碍. 在证监会稽查执法广度和深度不断提升的今天,证监会

海量数据迁移之一个误操作的问题总结

在生产环境中的数据迁移还是很惊心动魄的,毕竟生产的数据不容许有任何潜在的问题,很小的问题也可能导致业务的终端,这个时候dba的角色是很重要的,如果dba犯了一个很细小的问题,在海量数据迁移中可能会导致灾难性的结果,所以今天和大家讨论一下关于由vi误操作导致的问题及总结. 结合今天早上的例子来说明. 目前生产环境已经有大量的用户数据了,需要从老系统迁移一批用户数据过来,一切都在安装好计划进行准备和操作.我是采用了外部表的方式,把一个很大的表分为了几十上百个外部表,采用insert方式加载的. 数据

select-当子查询里面加上Chinese_PRC_CI_AS的排序规则后,某些数据却查不出来

问题描述 当子查询里面加上Chinese_PRC_CI_AS的排序规则后,某些数据却查不出来 代码如下: SELECT * from dbo.VW_msSyInfo_zy WHERE syh collate Chinese_PRC_CI_AS not in (select Syh from dbo.msSyInfo_zy) and indate >'2015-01-01' 当没加collate Chinese_PRC_CI_AS的时候会报错 无法解决 equal to 运算中 "Chine

专访放射科主任龚向阳:智能肺结节筛查系统在三甲医院的「生存之道」

与大多数影像科医生一样,浙江省人民医院放射科主任龚向阳教授会因为每天面对200多份胸部CT而抓狂,因为他要在8小时之内看完几万多副图像,并寻找是否有结节.做出患者有肺结节的判断是很容易的,只要发现有结节即可,但判断患者没有结节却很难,看完之后没有结节,心中不由得嘀咕:是不是我出神了没发现?真的是正常的吗? 与大多数不同的是,龚向阳还是一名AI医疗的"遛狗人","遛狗"是他的医生同仁对于智能肺结节筛查系统的戏称,言下之意是这套系统需要每天学习,会变得越来越聪明. 他认

Windows Server 2008 R2迁移IP配置数据指南

我们知道,将某些服务器角色迁移到 http://www.aliyun.com/zixun/aggregation/13975.html">Windows Server 2008 R2 时必需迁移 IP 配置数据,包括 DHCP 服务器.域名系统 (DNS) 服务器和 Active Directory域服务.本系列文章介绍如何迁移核心 IPv4 和 IPv6 配置设置和数据. 本文则着重阐述如何准备迁移 IP 配置设置和数据. 一.准备目标服务器 1.在目标服务器上安装 Windows Se

从预置数据中心迁移至IDC数据中心的七大关键因素

在数据中心多年的发展进程中,发展已经不可避免地来到拐点(转折点),是购买数据中心还是租赁数据中心?该如何选择呢?业界人士不得不审慎思考.分析利弊,考虑是自建数据中心,自己维护,还是将其外包. (备注:拐点(转折点),又称反曲点,在数学上指改变曲线向上或向下方向的点,直观地说拐点是使切线穿越曲线的点(即曲线的凹凸分界点).若该曲线图形的函数在拐点有二阶导数,则二阶导数在拐点处异号(由正变负或由负变正)或不存在.) 说到数据中心,要么是在自建数据中心,并维护,要么是从某IDC那里租用空间.IDC的优

android sqlite查询最近一个月的所有数据怎么查

问题描述 android sqlite查询最近一个月的所有数据怎么查 sqlite我想查最近一个月的数据怎么写?也就是查询今天2016.04.19到上个月2016.03.19的所有数据 表名:work 列名:int id varchar workName timestamp starttime timestamp endtime 怎么查?求大神. 解决方案 select * from work where 日期字段 between date('now', "-1 month") and

请教jsp的合并行的table 数据怎么查怎么遍历?

问题描述 请教jsp的合并行的table 数据怎么查怎么遍历? 解决方案 两个方法可以实现: 第一种可以查出分类为一个TABLE在左边,再查所有的记录 放一个TAABLE在右边然后两个对齐. 第二种就是算出来,以类别排序查出记录,然后foreach中的tr,当遍历到这个每一类的第 一个的时候td 给一个合并总数.

集合-struts2数据层查不出东西为什么

问题描述 struts2数据层查不出东西为什么 public ArrayList selectAllComment(){ Connection conn = DBUtil.getConnection(); try { PreparedStatement ps = conn.prepareStatement(""select * from hkcomment chkusers u where c.userid=u.userid""); ResultSet rs = p