背景技术
Oracle GoldenGate软件是一种基于log(日志)的结构化数据复制软件,它通过解析源数据库在线log或归档log获得数据的增、删、改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步、双活。Oracle GoldenGate软件可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒级的实时复制。
Oracle GoldenGate是一种基于软件的数据复制方式,它从数据库的log解析数据的变化,将数据变化转化为自己的格式,直接通过TCP/IP网络传输,无需依赖于数据库自身的传递方式,而且可以通过高达9:1的压缩率对数据进行压缩,可以大大降低带宽需求。在目标端,Oracle GoldenGate可以通过交易重组,分批加载等技术手段大大加快数据投递的速度和效率,降低目标系统的资源占用,可以在亚秒级实现大量数据的复制,并且目标端数据库是活动的。从而可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾、数据库升级和移植、双业务中心等多个场景下应用。同时,OracleGoldenGate可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构。
Oracle GoldenGate技术解决了目前业界难以解决的在不同系统之间进行海量数据实时同步问题,并可以根据业务需求进行部分关键数据同步,操作灵活、方便,实现了对实时信息的实时访问,使得企业可以提高可用性、可靠性和跨企业系统的关键数据性能。采用GoldenGate的数据复制技术,可以实现数据实时备份,确保核心数据的安全,同时避免引入过多种类的软硬件产品,降低了运营维护的复杂度和投入,有利于灾备系统的恢复和切换。该技术可以广泛用于对数据库系统实时性要求高,需要建立容灾系统的大中型企业。
随着近几年来业务系统的不断高速发展,当前的数据库系统,随着客户的增加,业务的增长以及时间的累积,系统单位时间在线交易数以及每笔交易的复杂度均有大规模的提升,这样也导致了数据库系统上的数据变更更为频繁,数据变动量的增加,也必然导致生产系统向容灾系统同步数据以及切换容灾系统的压力变大。
然而Oracle GoldenGate毕竟是一种逻辑的数据同步手段,其搭建以及运维均涉及复杂的步骤,因此,准确而有效的数据一致性校验是必须的;其中针对系统迁移以及割接的项目,在割接前的数据一致性验证是很多客户,特别是新接触OracleGoldenGate软件的客户所要求的。
由于Oracle GoldenGate采用的是异步的同步方式,存在时间延迟(默认情况下约10秒左右),时间延迟内,两边的数据可能发生了多次的DML操作,如何在存在时间差的情况下准确校验数据一致性成为业界的难题。
目前情况下,业界针对Oracle GoldenGate的数据一致性验证方案一般有下述三种方式:
1、基于业务逻辑的数据一致性校验方法
这种方法需要业务系统的运维或者开发人员配置,根据业务逻辑,查询一到多个表生成静态的结果集,然后再比较静态结果集的数据一致性。
比较静态结果集的数据一致性则有如下方法:1)简单地通过聚合函数、记录数等确认;2)通过minus运算确认;3)通过表记录哈希值总和以及记录数确认;4)通过GoldenGate Veridata进行校验。
上述处理方法分两步,静态结果集的生成以及静态结果集的对比。静态结果集校验一般来说不会存在瓶颈,上文说的minus、哈希等方式均能准确地验证。
静态结果集生成则成为主要的瓶颈,此方式要求应用人员配合,这是校验的主要瓶颈项,主要体现在以下方面:1)仅能针对业务逻辑进行校验,所对比的静态结果没问题,不代表同步没有问题;2)通常情况仅部分核心表能根据业务逻辑梳理出静态结果集,其余表无法通过这种方式进行校验;3)需要应用人员进行配合,实际操作中容易出现责任不清晰等管理问题。
2、忽略时间延迟直接进行数据一致性校验方法
这种方法简单地确认Oracle GoldenGate运行状态正常以及不存在大的时间延迟后,直接进行数据一致性校验。由于这种方式比较粗略,因此一般仅通过下述方法校验:1)通过minus对比,然后分析差异记录;2)简单地通过聚合函数、记录数等确认。
上述处理方法同样分两步,即Oracle GoldenGate运行状态的检查确认以及数据一致性的校验。Oracle GoldenGate运行状态的检查后,可基本上确认同步延迟是否在可接受范围内(默认情况下10秒),此后即可直接发起校验。
如果后续校验采用count(*)以及聚合函数进行校验的话,存在如下瓶颈:1)仅能给出一个大致的校验结果,很可能由于同步时间延迟而造成结果不一致,但结果不一致并不等于数据的不一致;2)如果串行地对比多个表,则很容易由于查询语句运行时间不同而导致后续语句发起时间点的不一致,导致结果差异更大,而影响对结果准确性的判断。
如果后续采用校验采用minus方式,则瓶颈为如下:1)很容易出现由于时间延迟而导致的差异,差异记录需要进一步判断,以确定同步是否存在异常;2)需要进行两次minus操作校验,性能消耗较大,通常仅能用于校验数据量较小的表;3)要求创建数据库dblink,部分生产环境管理规范不允许。
3、基于Oracle GoldenGate Veridata的数据一致性校验方法
Oracle GoldenGate是Oracle官方的数据一致性校验工具,这种工具自动对初次校验记录不一致的表进行二次校验。直接利用Oracle GoldenGate Veridata进行校验则是Oracle官方的一种方法,这种方式的瓶颈在于:1)成本更高,需要另外购买OracleGoldenGate Veridata软件,有可能需要购买新的机器,并搭建数据库;2)对于初次对比后发现的不一致记录(通常是由于时间延迟而产生的),采用再次校验单条记录一致性的方法进行,如果单条记录在校验期间多次变更,则仅能识别为变化中的数据;3)校验的精度较细,但为此付出的为较大资源消耗以及时间;4)无主键或者唯一键的表校验效率低下,且消耗大量的临时表空间或者文件系统目录。
由上可见,现有Oracle数据库的几种处理方式均无法彻底地解决数据一致性的问题。因此,有必要继续对基于Oracle数据库的数据一致性校验方法进行改进。
发明内容
本发明所要解决的技术问题是提供一种基于Oracle数据库的数据一致性校验方法,能够顺利处理变更频繁的记录,不依赖任何业务逻辑与主键,且校验效率速度快,配置简单易用。
本发明为解决上述技术问题而采用的技术方案是提供一种基于Oracle数据库的数据一致性校验方法,包括如下步骤:a)暂停Oracle数据库复制进程,使得Oracle数据库提交所有事务;b)获取源端数据库的时间戳信息SCN;c)查询目标端数据库并获取当前时间戳信息SCN后,重启暂停的Oracle数据库复制进程,恢复Oracle数据库同步;d)在源端数据库与目标端数据库的时间戳信息SCN相一致的情况下,再对对应表做数据一致性校验。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述步骤a)检查到复制进程的队列文件序号seqno和复制位置rba值相一致,并确认复制进程处于停止状态后再获取源端数据库的时间戳信息SCN。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述步骤b)中源端数据库的时间戳信息SCN获取过程如下:根据复制进程的队列文件信息以及rba值,通过logdump工具获取。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述步骤b)中源端数据库的时间戳信息SCN获取过程如下:
在源端数据库创建校验指令表记录源端数据库的时间戳信息SCN;在目标端数据库创建相应的校验指令表获取来自源端数据库的时间戳信息SCN。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述源端数据库的校验指令表的操作过程如下:每次操作仅仅允许插入一条记录,并在插入后马上进行提交操作;所述源端数据库的校验指令表配置在抽取进程的末尾,以异构同步的方式仅供经过验证的脚本调用运行,并通过GoldenGate的GETENV函数获取主机名、数据库名和时间戳信息SCN。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述目标端数据库的校验指令表仅仅允许查询和清理操作;所述目标端数据库的校验指令表配置在复制进程的末尾,通过WHERE关键字过滤触发单个或者多个复制进程停止;或者通过EVENTACTIONS功能,触发复制进程做检查点,并停止复制进程。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述目标端数据库的校验指令表包括如下字段:源端主机名、源端数据库名、源端抽取进程名、源端提交时间戳、目标端复制进程名和目标端提交前时间戳;所述源端主机名、源端数据库名、源端抽取进程名和源端提交时间戳由源端抽取进程自动填充;所述目标端复制进程名和目标端提交前时间戳由复制进程自动填充。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述c)步骤通过调用SQL语句获取目标端数据库的当前时间戳信息SCN。
上述的基于Oracle数据库的数据一致性校验方法,其中,所述步骤d)中通过minus运算确认、表记录哈希值总和以及记录数确认或者GoldenGate Veridata进行对应表数据一致性校验。
上述的基于Oracle数据库的数据一致性校验方法,其中,如果源端数据库与目标端数据库的时间戳信息SCN不一致,选择时间戳信息在前的SCN号进行数据库还原。
本发明对比现有技术有如下的有益效果:本发明提供的基于Oracle数据库的数据一致性校验方法,通过先获取用于标识数据库某个确切提交版本的时间戳信息SCN,在获取匹配的时间戳信息之后再进行数据一致性校验,从而能够顺利处理变更频繁的记录,不依赖任何业务逻辑与主键,且校验效率速度快,配置简单易用。
具体实施方式
下面结合附图和实施例对本发明作进一步的描述。
图1为本发明基于Oracle数据库的数据一致性校验流程示意图。
请参见图1,本发明提供的基于Oracle数据库的数据一致性校验方法包括如下步骤:
步骤S1:暂停Oracle数据库复制进程,使得Oracle数据库提交所有事务;比如检查到复制进程的seqno和rba值相一致即可确认复制进程处于停止状态。
步骤S2:获取源端数据库的时间戳信息SCN;针对不同的数据库平台,时间戳信息将有所不同。对于本发明涉及的oracle database,可供校验使用的时间戳信息为SCN。所谓的SCN全称为System Change Number,是oracle database的一个内部时间戳,用于标识数据库某个确切提交的版本。在事务提交或者回滚时,它被赋予一个唯一的标识事务的SCN,用来保证数据的一致性。作为数据库内部的逻辑时钟,数据库事务依SCN而排序,SCN在数据库中是唯一的,并随时间而增加,除非重建数据库,SCN的值永远不会被重置为0。
oracle database的闪回版本查询功能(Flashback Version Query)可以支持基于SCN的查询,根据某个具体的SCN号,还原某个时间点数据库表的版本,查询语句例子如下:
SQL>select count(*)from CRABBIT.ORDERS as of scn 47572949274。
Oracle GoldenGate在复制数据库事务时是严格依照源端数据库的顺序进行的。因此,基于Oracle GoldenGate自身的原理,理论上是可以找出无数个对应的时间戳信息,根据这种对应的时间戳信息,即可判断某个特定的表在某个特定的时间戳信息数据是否一致。
步骤S3:查询目标端数据库并获取当前时间戳信息SCN后,重启暂停的Oracle数据库复制进程,恢复Oracle数据库同步。
步骤S4:在源端数据库与目标端数据库的时间戳信息SCN相一致的情况下,再对对应表做数据一致性校验。在获取匹配的时间戳信息之后,校验数据一致性的方法与校验静态数据的方法是一致的:
1)通过minus运算确认;
2)通过表记录哈希值总和以及记录数确认;
3)通过GoldenGate Veridata进行校验。
上述三种方法或者现有的其它方法均可以实现具体的数据一致性校验,在此不再一一赘述。如果源端数据库与目标端数据库的时间戳信息SCN不一致,选择时间戳信息在前的SCN号进行数据库还原。
基于性能以及效率的考虑,Oracle GoldenGate的目标端往往会配置GROUPTRANSOPS等参数进行优化,此参数会在目标端合并多个小事务并一次性提交,这是一种非常规的配置方法,因此选取配对时间戳信息时,必须考虑这个点。
Oracle GoldenGate停止的时候必然会进行事务提交,而且停止重启的代价非常低,因此停止Oracle GoldenGate进程并重启的巡检是一个比较好的机会获取时间戳信息。当Oracle GoldenGate进程停止后,此复制进程对应的表均处于静止状态,此时获取对应的数据库SCN即可。而在复制进程停止的状态下,也可以根据复制进程的队列文件信息以及rba号,通过logdump工具获取源端具体的SCN信息,但此步骤较麻烦,本发明则做了一个优化,直接通过Oracle GoldenGate侧的特殊配置,将SCN写到特殊的数据库表中,免却使用logdump工具的麻烦。
本发明源端目标端配置检查指令表及操作策略部署流程如图2所示,包括如下步骤:
1、在源端数据库创建GoldenGate校验指令表;2、在目标端数据库创建GoldenGate校验指令表;3、在源端数据库做GoldenGate校验指令表的特殊配置;4、在目标端数据库做GoldenGate校验指令表的特殊配置。
在源端数据库创建GoldenGate校验指令表要求如下:
此表为GoldenGate的校验以及检查专用,不允许其余应用占用;
操作此表必须经过已验证的脚本运行,不允许其余未经验证的手工操作(操作规范为,仅做insert操作,仅插入一条记录,插入后马上commit)
字段要求如下:
字段名 |
字段类型 |
字段说明 |
CMD |
varchar2(10) |
记录操作指令,为进程名或者“Stop”、“CHECK” |
OPER_DATE |
date |
记录插入的时间点,默认值为sysdate |
在源端数据库创建GoldenGate校验指令表要求如下:
1、此表为GoldenGate的校验以及检查专用,不允许其余应用占用
2、不允许清理、查询以外的操作
3、字段要求如下:
字段名 |
字段类型 |
字段说明 |
CMD |
varchar2(10) |
与源端一致 |
OPER_DATE |
date |
与源端一致 |
EXT_HOSTNAME |
varchar2(10) |
存储源端主机名,抽取进程自动填充 |
EXT_DBNAME |
varchar2(10) |
存储源端数据库名,抽取进程自动填充 |
EXT_PRONAME |
varchar2(10) |
存储源端抽取进程名,抽取进程自动填充 |
EXT_TIMESTAMP |
date |
存储源端提交时间戳,抽取进程自动填充 |
EXT_SCN |
number |
存储源端提交SCN,抽取进程自动填充 |
REP_NAME |
varchar2(10) |
存储目标端复制进程名,复制进程自动填充 |
REP_SCN |
number |
存储复制端提交前时间戳,复制进程自动填充 |
REP_DATE |
date |
存储复制端提交前SCN,复制进程自动填充 |
需要特别说明的是,REP_SCN以及REP_DATE为提交前的信息,并不严格与EXT_TIMESTAMP以及EXT_SCN相对应,复制进程将例外选择对应的SCN信息。
在源端数据库做GoldenGate校验指令表的特殊配置要求如下:
1、此策略加到抽取进程配置末尾位置,避免影响其余策略;
2、此策略忽略INSERT以外的各种操作,如TRUNCATE、DELETE、UPDATE;
3、此策略以异构同步的方式进行,通过GoldenGate的GETENV函数获取主机名、数据库名、日期格式存储的时间戳、数字类型存储的SCN等信息。
在目标端数据库做GoldenGate校验指令表的特殊配置要求如下:
1、此策略加到复制进程配置末尾位置,避免影响其余策略;
2、此策略自动填充复制进程名、复制进程;
3、通过WHERE关键字过滤,触发单个或者多个复制进程停止,或者仅作检查点;
4、通过SQLEXEC功能,调用数据库SQL语句,获取当前SCN以及sysdate;
5、通过EVENTACTIONS功能,触发进程做检查点,并停止复制进程。
图3为本发明采用检查指令表获取时间戳信息进行数据一致性校验流程示意图。
请继续参见图3,本发明采用检查指令表获取时间戳信息进行数据一致性校验步骤如下:
1、源端对GoldenGate校验指令表进行插入,触发CHECK操作;
2、目标端对GoldenGate校验指令表进行检查,确认各个复制进程均处于正常状态;
3、源端对GoldenGate校验指令表进行插入,触发停止个别或者全部复制进程;
4、目标端对GoldenGate校验指令表进行检查,确认对应复制进程已停止,并获取对应的源端SCN号;
5、目标端检查OGG进程状态,确认状态均为STOPPED且,相应的seqno和rba值一致;
6、查询目标数据库,获取当前SCN号;
7、恢复GoldenGate同步;
8、利用源端的SCN号以及目标端的SCN号,对对应表做数据一致性校验。
综上所述,本发明提供的基于Oracle数据库的数据一致性校验方法,采用自定义的Oracle GoldenGate指令表进行快速地停止GoldenGate进程并获取对应的SCN号,然后基于时间戳信息校验Oracle GoldenGate同步的源端以及目标端数据一致性,具体优点如下:
1)能顺利处理变更频繁的记录:传统的Oracle GoldenGate Veridata工具对比方法无法处理校验时间内多次变更数据的一致性,此方法没有这个问题;
2)不依赖于任何业务逻辑:与对比静态结果集的方式对比,此方法不需要应用方面配合;
3)不依赖主键:传统的Oracle GoldenGate Veridata工具对比方法需要指定逻辑主键,对于无主键或者唯一键的表,需要指定所有大对象以外的字段为逻辑主键,并根据逻辑主键逐条记录进行对比,效率较低;
4)不需要因排序而占用大量临时表空间或者文件系统目录:传统的OracleGoldenGate Veridata工具对比方法需要进行排序,除非使用哈希值校验的;
5)校验效率速度快:与传统的Oracle GoldenGate Veridata相比,校验消耗时间缩短5倍以上;
6)配置简单易用:批量生成后即可多次使用,绝大部分步骤均能精简为单条命令。
虽然本发明已以较佳实施例揭示如上,然其并非用以限定本发明,任何本领域技术人员,在不脱离本发明的精神和范围内,当可作些许的修改和完善,因此本发明的保护范围当以权利要求书所界定的为准。