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

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

目录
相关文章
|
5天前
|
SQL 数据采集 消息中间件
DataWork数据处理问题之新数据任务结束如何解决
DataWork数据处理是指使用DataWorks平台进行数据开发、数据处理和数据治理的活动;本合集将涵盖DataWork数据处理的工作流程、工具使用和问题排查,帮助用户提高数据处理的效率和质量。
40 1
|
8月前
|
人工智能 监控 算法
数据可用性是数据成为资产和发挥价值的重要基础
数据可用性是数据成为资产和发挥价值的重要基础
|
5天前
|
存储 机器学习/深度学习 数据采集
大规模数据处理:释放数据潜能的关键路径
在信息时代,大规模数据处理已经成为企业和组织中不可或缺的一环。如何高效地处理海量数据,释放出宝贵的数据潜能,已成为技术界和业界共同面临的挑战。本文将深入探讨大规模数据处理的重要性、挑战以及相关技术的突破,以期为读者揭示大规模数据处理的关键路径。
|
12月前
|
存储 文件存储 数据安全/隐私保护
为部署的系统做出正确的数据存储决策
为部署的系统做出正确的数据存储决策
|
存储 安全 数据管理
OushuDB 小课堂丨孤立数据迫在眉睫的威胁:废弃文件如何毁掉您的业务
OushuDB 小课堂丨孤立数据迫在眉睫的威胁:废弃文件如何毁掉您的业务
61 0
|
SQL 存储 消息中间件
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
工程师误删了公司生产数据库,如何看待数据安全架构的脆弱性?
|
存储 算法 关系型数据库
分库分表如何做到不迁移数据?避免热点数据?(上)
分库分表如何做到不迁移数据?避免热点数据?
189 0
分库分表如何做到不迁移数据?避免热点数据?(上)
|
存储 缓存 Java
分库分表如何做到不迁移数据?避免热点数据?(下)
分库分表如何做到不迁移数据?避免热点数据?
155 0
分库分表如何做到不迁移数据?避免热点数据?(下)
|
人工智能 Devops 机器人
数字化转型过程中需要厘清的几个关系:存量与增量
在底层数字基础设施之上,越来越多的企业开始更关注上层业务的转型,其中以营销数字化为代表。笔者认为,数字化转型,应建立在企业的业态、规模、规划以及现状的基础之上,还应围绕企业的核心价值进行开展,受益者应当具备开放的特征,覆盖内外部的且足够多的伙伴。
274 0
|
存储 人工智能 分布式计算
五项措施,让阿里云存储更安全
数字经济时代,数据正在成为重要的资源,甚至是资产,而云则是存储、管理、利用、保护这些资产的重要基础设施。如何保障数据的安全性,进而保障业务的连续性成为云所要解决的关键问题之一。
1068 0