本发明涉及一种数据库数据内容高速比对方法,属于数据库数据复制技术领域。
背景技术:
随着信息技术的深入发展,应用系统的不断升级,系统之间的集成贯通越来越多的需要数据交互,数据复制已经逐步成为了信息系统融合的关键部分。然而,所有针对数据复制与交互都包含着一个基本的要求——源端与目标端数据复制一致,数据库数据内容比对技术正是在这种要求下产生的。国内外关系型数据库数据比对技术主要采用串行数据比较的方法实现两端数据比对,此类比对方法在面对海量数据时,不能较好的解决数据库数据比对效率问题,严重影响用户体验。
技术实现要素:
为了解决上述技术问题,本发明提供了一种数据库数据内容高速比对方法。
为了达到上述目的,本发明所采用的技术方案是:
一种数据库数据内容高速比对方法,包括以下步骤,
获取数据库源表和目标表,分别对源表和目标表中的数据排序;
获取源表中最小主键字段a和最大主键字段b,获取目标表中最小主键字段c和最大主键字段d;
根据a、b、c、d的大小,定义若干个区间,根据各条数据主键字段的大小,对源表和目标表中的数据进行区间划分;
比较同一区间内源表和目标表中的数据。
区间的划分如下,
当a≤c、b≤d,则定义的区间为[a,c]、[c,b]、[b,d];根据各条数据主键字段的大小,源表中的数据被划分成[a,c]和[c,b]两个区间,目标表中的数据被划分成[b,d]和[c,b]两个区间;
当a≤c、b≥d,则定义的区间为[a,c]、[c,d]、[d,b];根据各条数据主键字段的大小,源表中的数据被划分成[a,c]、[c,d]和[d,b]三个区间,目标表中的数据被划分成[c,d]一个区间;
当a≥c、b≤d,则定义的区间为[c,a]、[a,b]、[b,d];根据各条数据主键字段的大小,源表中的数据被划分成[a,b]一个区间,目标表中的数据被划分成[c,a]、[a,b]和[b,d]三个区间;
当a≥c、b≥d,则定义的区间为[c,a]、[a,d]、[d,b];根据各条数据主键字段的大小,源表中的数据被划分成[a,d]和[d,b]二个区间,目标表中的数据被划分成[c,a]和[a,d]二个区间。
比较同一区间内源表和目标表中数据的过程为,
s41,分别获取源表和目标表中的一条数据;
s42,判断两条数据是否全部为空,如果是,则结束;如果不是则转至s43;
s43,判断两条数据是否全部不为空,如果是,则依次进行主键字段比较和非主键字段比较,如果从源表获取的数据为空,则判定目标表数据大于源表数据,分别获取源表和目标表中的下一条数据,转至步骤s42,如果从目标表获取的数据为空,则判定源表数据大于目标表数据,分别获取源表和目标表中的下一条数据,转至步骤s42。
主键字段比较的过程为,
比较两条数据的主键字段类型,如果类型不相同,则判定两条数据不相等,如果是相同类型,则进行主键字段内容比较,具体日下:
当源表数据主键字段内容大于目标表数据主键字段内容,判定源表数据大于目标表数据,分别获取源表和目标表中的下一条数据进行比较;
当源表数据主键字段内容小于目标表数据主键字段内容,判定源表数据小于目标表数据,分别获取源表和目标表中的下一条数据进行比较;
当源表数据主键字段内容等于目标表数据主键字段内容,进行非主键字段比较。
非主键字段比较的过程为,
比较两条数据的非主键字段类型,如果类型不相同,则判定两条数据不相等,如果是相同类型,则进行非主键字段内容比较,具体日下:
当源表数据非主键字段内容大于目标表数据主键字段内容,判定源表数据大于目标表数据,分别获取源表和目标表中的下一条数据进行比较;
当源表数据非主键字段内容小于目标表数据主键字段内容,判定源表数据小于目标表数据,分别获取源表和目标表中的下一条数据进行比较;
当源表数据非主键字段内容等于目标表数据非主键字段内容,判定两条数据相等,分别获取源表和目标表中的下一条数据进行比较。
比较过程可在预先定义的比较器内进行,比较器的大小根据实际计算资源、存储资源配置情况动态调整。
本发明所达到的有益效果:本发明通过对源端与目标端数据的批量提取并对数据分区批量比对,从而较快速的完成数据库两端数据比对;通过该方法可以快速高效的比对两端数据差异,强化数据一致性检查手段,可以对数据复制过程中产生的不一致及时做出调整,对确保数据库的安全稳定的运行,具有重要的实际意义。
附图说明
图1为本发明的流程图;
图2为数据对比的流程图;
图3为数据对比的架构图。
具体实施方式
下面结合附图对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
如图1所示,一种数据库数据内容高速比对方法,包括以下步骤:
步骤1,获取数据库源表和目标表,分别对源表和目标表中的数据排序。
具体过程为:
s11,检查数据库源表与目标表是否有主键,如果没有则通过添加附加日志的方式增加主键;
s12,采用jdbc或者odbc等方式获取数据库源表与目标表;
s13,采用执行sql排序或者自定义排序的方式对数据排序。
步骤2,获取源表中最小主键字段a和最大主键字段b,获取目标表中最小主键字段c和最大主键字段d。
步骤3,根据a、b、c、d的大小,定义若干个区间,根据各条数据主键字段的大小,对源表和目标表中的数据进行区间划分。
具体如下:
当a≤c、b≤d,则定义的区间为[a,c]、[c,b]、[b,d];源表中的数据被划分成[a,c]和[c,b]两个区间,目标表中的数据被划分成[b,d]和[c,b]两个区间;
当a≤c、b≥d,则定义的区间为[a,c]、[c,d]、[d,b];源表中的数据被划分成[a,c]、[c,d]和[d,b]三个区间,目标表中的数据被划分成[c,d]一个区间;
当a≥c、b≤d,则定义的区间为[c,a]、[a,b]、[b,d];源表中的数据被划分成[a,b]一个区间,目标表中的数据被划分成[c,a]、[a,b]和[b,d]三个区间;
当a≥c、b≥d,则定义的区间为[c,a]、[a,d]、[d,b];源表中的数据被划分成[a,d]和[d,b]二个区间,目标表中的数据被划分成[c,a]和[a,d]二个区间。
步骤4,比较同一区间内源表和目标表中的数据,位于不同区间的则认为数据不同。
根据上述划分,当a≤c、b≤d时,比较[c,b]区间内源表和目标表中的数据;当a≤c、b≥d时,比较[c,d]区间内源表和目标表中的数据;当a≥c、b≤d时,比较[a,b]区间内源表和目标表中的数据;当a≥c、b≥d时,比较[a,d]区间内源表和目标表中的数据。
如图2所示,比较过程如下:
s41,分别获取源表和目标表中的一条数据(图中rowsource为源表数据,rowtarget为目标表数据);
s42,判断两条数据是否全部为空,如果是,则结束;如果不是则转至s43;
s43,判断两条数据是否全部不为空,如果是,则依次进行主键字段比较和非主键字段比较,如果从源表获取的数据为空,则判定目标表数据大于源表数据,分别获取源表和目标表中的下一条数据,转至步骤s42,如果从目标表获取的数据为空,则判定源表数据大于目标表数据,分别获取源表和目标表中的下一条数据,转至步骤s42。
其中,主键字段比较的过程为:
比较两条数据的主键字段类型,如果类型不相同,则判定两条数据不相等,如果是相同类型,则进行主键字段内容比较,具体日下:
当源表数据主键字段内容大于目标表数据主键字段内容,判定源表数据大于目标表数据,返回1,分别获取源表和目标表中的下一条数据进行比较;
当源表数据主键字段内容小于目标表数据主键字段内容,判定源表数据小于目标表数据,返回-1,分别获取源表和目标表中的下一条数据进行比较;
当源表数据主键字段内容等于目标表数据主键字段内容,返回0,进行非主键字段比较。
非主键字段比较的过程为:
比较两条数据的非主键字段类型,如果类型不相同,则判定两条数据不相等,如果是相同类型,则进行非主键字段内容比较,具体日下:
当源表数据非主键字段内容大于目标表数据主键字段内容,判定源表数据大于目标表数据,返回1,分别获取源表和目标表中的下一条数据进行比较;
当源表数据非主键字段内容小于目标表数据主键字段内容,判定源表数据小于目标表数据,返回-1,分别获取源表和目标表中的下一条数据进行比较;
当源表数据非主键字段内容等于目标表数据非主键字段内容,判定两条数据相等,返回-0,分别获取源表和目标表中的下一条数据进行比较。
上述的比较过程可在预先定义的比较器内进行,对数据进行比较,比较器的大小根据实际计算资源、存储资源配置情况动态调整;比较器可采用java、c/c++等编程语言自带的比较函数,也可以采用重写比较方法实现数据比对。
上述方法的原理如图3所示,通过对源端与目标端数据的提取,对数据分区比对,从而较快速的完成数据库两端数据比对;通过该方法可以快速高效的比对两端数据差异,强化数据一致性检查手段,可以对数据复制过程中产生的不一致及时做出调整,对确保数据库的安全稳定的运行,具有重要的实际意义。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。