CN110209521B - 数据校验方法、装置、计算机可读存储介质和计算机设备 - Google Patents
数据校验方法、装置、计算机可读存储介质和计算机设备 Download PDFInfo
- Publication number
- CN110209521B CN110209521B CN201910134147.2A CN201910134147A CN110209521B CN 110209521 B CN110209521 B CN 110209521B CN 201910134147 A CN201910134147 A CN 201910134147A CN 110209521 B CN110209521 B CN 110209521B
- Authority
- CN
- China
- Prior art keywords
- data
- database
- verification
- check
- checking
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/08—Error detection or correction by redundancy in data representation, e.g. by using checking codes
- G06F11/10—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's
- G06F11/1004—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's to protect a block of data words, e.g. CRC or checksum
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及一种数据校验方法、装置、计算机可读存储介质和计算机设备,所述方法包括:对主数据库中的第一数据表进行校验并将校验结果写入第一校验表;执行钩子程序,根据所述主数据库的二进制日志对从数据库中对应所述第一数据表的第二数据表进行校验,并将校验结果写入第二校验表;比对所述第一校验表与所述第二校验表。本申请提供的方案应用范围广。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种数据校验方法、装置、计算机可读存储介质和计算机设备。
背景技术
随着计算机技术的发展与数据量的飞速增长,数据库的使用越来越普遍。用户在使用数据库的过程中,时常会遇到需要比较主从数据库一致性的场景,比如在修复了主从同步问题之后需要确认数据是否一致,或者在数据迁移之后校验迁移数据是否正确等。
然而,目前的数据校验方式通常是在主从数据库上执行完全相同的数据库操作语句,然后对比主从数据库上各自得到的运行结果,以校验主从数据库一致性。这种方式受限于主从库需要执行完全相同的操作语句的原理,导致该数据校验方式应用范围窄的问题。
发明内容
基于此,有必要针对目前的数据校验方式应用范围窄的技术问题,提供一种数据校验方法、装置、计算机可读存储介质和计算机设备。
一种数据校验方法,包括:
对主数据库中的第一数据表进行校验并将校验结果写入第一校验表;
执行钩子程序,根据所述主数据库的二进制日志对从数据库中对应所述第一数据表的第二数据表进行校验,并将校验结果写入第二校验表;
比对所述第一校验表与所述第二校验表。
一种数据校验装置,包括:
第一校验模块,用于对主数据库中的第一数据表进行校验并将校验结果写入第一校验表;
第二校验模块,用于执行钩子程序,根据所述主数据库的二进制日志对从数据库中对应所述第一数据表的第二数据表进行校验,并将校验结果写入第二校验表;
对比模块,用于比对所述第一校验表与所述第二校验表。
一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行上述数据校验方法的步骤。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行上述数据校验方法的步骤。
上述数据校验方法、装置、计算机可读存储介质和计算机设备,自动对主数据库中的第一数据表进行校验,并将校验结果写入第一检验表。其中,主数据库的二进制日志记录了主数据库在进行数据表校验时的相关信息,这样,钩子程序即可根据主数据库的二进制日志对从数据库中对应主数据库的第一数据表的第二数据表进行校验,并将校验结果写入第二校验表,从而对比第一检验表与第二检验表即可得到主库数据一致性的校验结果,极大地扩宽了应用范围。
附图说明
图1为一个实施例中数据校验方法的应用环境图;
图2为一个实施例中数据校验方法的流程示意图;
图3为一个实施例中数据一致性校验的原理示意图;
图4为一个实施例中在实时同步过程中进行数据一致性校验的原理图;
图5为一个实施例中主从数据库中相应数据块的示意图;
图6为一个实施例中数据校验装置的结构框图;
图7为另一个实施例中数据校验装置的结构框图;
图8为一个实施例中计算机设备的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
图1为一个实施例中数据校验方法的应用环境图。参照图1,该数据校验方法应用于数据校验***。该数据校验***包括主数据库所在服务器110、从数据库所在服务器120和校验服务器130。主数据库所在服务器110、从数据库所在服务器120和校验服务器120通过网络连接。其中,服务器可以用独立的服务器或者是多个服务器组成的服务器集群来实现。需要说明的是,主数据库所在服务器110与从数据库所在服务器120可以是同一个服务器,也可以是相互独立的服务器;校验服务器130可以是主数据库所在服务器110或者从数据库所在服务器120的其中一个,也可以是独立于主数据库所在服务器110和从数据库所在服务器120的其他服务器。校验服务器130用于执行该数据校验方法。
具体地,校验服务器130可运行有数据校验工具,校验服务器130则可通过该数据校验工具执行该数据校验方法。其中,数据校验工具具体可以通过计算程序实现,该计算机程序被执行时即可执行该数据校验方法。
如图2所示,在一个实施例中,提供了一种数据校验方法。本实施例主要以该方法应用于上述图1中的校验服务器130来举例说明。参照图2,该数据校验方法具体包括如下步骤:
S202,对主数据库中的第一数据表进行校验并将校验结果写入第一校验表。
可以理解,这里的主数据库和后文中的从数据库,是存在数据迁移关系或者数据同步关系的两个相互独立的数据库。通常情况下,是由主数据库将数据迁移或者同步至从数据库中。数据库是存储数据的仓库,其本质是一个文件***,将数据按照特定的格式将存储起来。用户可以对数据库中的数据进行增加、修改、删除及查询等操作。数据库中以表为组织单位存储数据,即数据表。校验表也是数据表,用于对数据的校验结果进行记录。
在一个具体的实施例中,主数据库和从数据库均为关系型数据库。
具体地,校验服务器可先确定待在主数据库与从数据库之间进行数据一致性校验的数据表。这里的数据一致性校验,是指校验主数据库与从数据库中相应的两个数据表之间数据的一致性。
可以理解,在修复了主从同步问题或者进行数据迁移之后,通常需要校验主从数据库中的数据一致性,以保证主从间正常同步或者数据迁移成功等。那么,这里待在主数据库与从数据库之间进行数据一致性校验的数据表,可以是主从同步的数据表,也可以是数据迁移后的数据表。待在主数据库与从数据库之间进行数据一致性校验的数据表的数量可以为一个或者多个。
进一步地,校验服务器可对主数据库中待进行数据一致性校验的数据表,以下称作第一数据表,进行校验,并将得到的校验结果写入第一校验表。这里对第一数据表进行的校验,异于前述的数据一致性校验,是指按照预设的校验方式对数据表中的数据进行校验。这里的校验方式有多种,比如循环冗余校验(Cyclic Redundancy Check,CRC)或者异或校验(Block Check Character,BCC)等。
举例说明,比如,主数据库将数据表1、2和3迁移至从数据库后,数据表1、2和3可以为待在主数据库与从数据库之间进行数据校验的数据表,主数据库中的数据表1、2和3即为第一数据表。再比如,主数据库与从数据库之间的数据表4、5和6存在同步关系,数据表4、5和6可以为待在主数据库与从数据库之间进行数据校验的数据表,主数据库中的数据表4、5和6即第一数据表。
当然,待在主数据库与从数据库之间进行数据一致性校验的数据表可以是全部迁移的数据表,也可以是部分迁移的数据表;待在主数据库与从数据库之间进行数据一致性校验的数据表可以是全部主从同步的数据表,也可以是部分主从同步的数据库,用户可以自定义选择。
需要说明的是,在本申请实施例中,在进行主从数据库间数据一致性校验的过程中不对主从数据库中的数据表进行锁定。也就是说,在进行主从数据库间数据一致性校验的过程,主从数据库之间可实时存在数据同步,用户也可对主数据库进行读写操作。
在另外的实施例中,校验服务器也可以指示主数据库所在的服务器来进行校验操作,由主数据库所在的服务器对第一数据表进行校验,并将得到的校验结果写入第一校验表。
S204,执行钩子程序,根据主数据库的二进制日志对从数据库中对应第一数据表的第二数据表进行校验,并将校验结果写入第二校验表。
其中,钩子程序是处理事件的程序段。每当触发钩子程序所钩挂的特定事件时,钩子程序便被启动来执行相应的操作。在本实施例中,钩子程序所挂钩的特定事件,是在从数据库中重放主数据库二进制日志中与第一数据表校验操作相关的日志记录。钩子程序被启动后则根据主数据库的二进制日志的日志记录生成相应的校验指令,并根据该校验指令对从数据库中对应第一数据表的第二数据表进行校验,并将校验结果写入第二校验表。
可以理解,主从数据库之间进行数据同步也就是主从复制的过程。简单来说,就是保证主数据库(Master)和从数据库(Slave)的数据是一致的。Master发生数据改变后,Slave会自动从Master把改变的数据同步过来(可能会有一定的延迟),以通过这种方式来保证数据的一致性,这就是主从复制。
主从复制的方式有多种,其中一种为基于二进制日志的方式。具体地,Master将数据改变记录到二进制日志中,Slave通过I/O线程读取Master的二进制日志,将二进制日志中记录的数据改变逐一在本地执行,完成本地数据的改变,从而实现将主数据库的数据改变反映到从数据库中,也就是二进制日志重放。
其中,主数据库的二进制日志,用于记录会对主数据库产生修改的操作的相关信息。通俗地说,类似于Select或者Show等不会修改数据库的操作,二进制日志则不会记录该操作的相关信息;类似于Insert或者delete等会修改数据库的操作,二进制日志则记录该操作的相关信息。由于,在进行主从数据库间数据一致性校验的过程,主从数据库之间可实时存在数据同步,用户也可对主数据库进行读写操作。那么,主数据库的二进制日志中不仅包括与第一数据表校验操作相关的日志记录,还包括对主数据库中数据表进行其他操作的日志记录。那么在从数据库中重放主数据库的二进制日志时,只有与第一数据表校验操作相关的这一部分日志记录在重放时,钩子程序才会被启动。
主数据库的二进制日志可以有多种不同的模式,不同模式下的二进制日志对修改数据库的操作的记录方式不同。比如,二进制日志中具体可记录对数据库进行修改的数据库操作语句(SQL,Structured Query Language)以及上下文信息,也可记录执行SQL语句完后得到的修改结果。这里的修改结果可以理解为数据的修改记录,比如哪个数据被修改了,修改成怎样的数据等。
其中,基于STATEMENT模式(基于SQL语句的复制,Statement-Based Replication,SBR)的二进制日志,记录的是对数据进行修改的操作语句,即SQL语句和上下文信息。比如,对数据库执行了操作:update A set test=‘test’,如果使用STATEMENT模式,那么这条update语句将会记录到二进制日志中。基于ROW模式(基于行的复制,Row-BasedReplication,RBR)的二进制日志,记录的则是对数据库做出修改的语句所影响的数据行以及这些行的修改,也就是数据修改结果。比如,比如,对数据库执行了操作:update Asettest=‘test’,如果使用ROW模式,那么这条update语句所影响的数据行以及这些行的修改将会记录到二进制日志中。
需要说明的是,现有的通过二进制日志重放来进行数据一致性校验中,只有在主数据库的二进制日志对修改数据库的操作的记录方式,是直接记录SQL语句以及上下文信息(比如基于STATEMENT模式的二进制日志)时,才能顺利地进行数据一致性校验。其原理是在主数据库对数据表(块)执行SQL语句,来生成主数据库中数据表(块)的校验结果,将执行的SQL语句直接记录入基于STATEMENT模式的二进制日志,再通过二进制日志重放把相同的SQL语句传递到从数据库执行,并在从数据库上计算相应数据表(块)的校验结果,最后比较主从数据库上相应数据块的校验结果,由此判断主从数据库中校验的数据表(块)的数据是否一致。但是,这对于主数据库的二进制日志对修改数据库的操作的记录方式,不是直接记录数据库操作语句以及上下文信息(比如基于ROW模式的二进制日志)的主从同步来说是一个限制。如果主数据库的二进制日志对修改数据库的操作的记录方式,不是直接记录数据库操作语句以及上下文信息(比如基于ROW模式的二进制日志),二进制日志中虽然没有完整的SQL语句,但也相应记录了与这些SQL语句的相关信息,可以通过执行钩子程序根据二进制日志中记录的这些相关信息,对从数据库中相相的数据表(块)用相同的校验方式来进行校验,并将校验结果写到校验表中。
具体地,校验服务器可将主数据库的二进制日志在从数据库中重放,当重放到与第一数据表校验操作相关的日志记录时,启动钩子程序,通过该钩子程序根据重放的日志记录,确定从数据库中与当前重放的日志记录源自的数据表相应的数据表,并确定主数据库对当前重放的日志记录源自的数据表进行校验所通过的校验方式,在对确定的数据表按确定的校验方式进行校验,并将校验结果写入第二校验数据表中。其中,钩子程序可以是预先编译好的代码段。该钩子程序可以根据主数据库的二进制日志中的日志记录,确定从数据库中与该日志记录源自的数据表相应的数据表,并确定主数据库对该日志记录源自的数据表进行校验所通过的校验方式,再对确定的数据表按确定的校验方式进行校验。
举例说明,假设对于主数据库的二进制日志中的日志记录1,该日志记录1记录的是主数据库中数据表1的修改操作的相关信息,那么钩子程序即可根据日志记录1确定从数据库中与数据表1相应的数据表1’,确定主数据库对数据表1进行校验所通过的校验方式A,再对数据表1’按校验方式A进行校验。
S206,比对所述第一校验表与所述第二校验表。
其中,第一校验表和第二校验表都是校验表,是用于记录校验结果的数据表。具体地,第一校验表具体可以是主数据库中的校验表,用于记录对主数据库中数据表进行校验的校验结果;第二校验表具体可以是从数据库中的校验表,用于记录对从数据库中数据表进行校验的校验结果。这样,对比第一校验表与第二校验表即可得到对主数据库与从数据库进行数据一致性校验的结果。
具体地,校验服务器可对比第一校验表和第二校验表中记录的校验结果,输出有哪些数据表的校验结果是不一致的。如果所有数据表的校验结果一致,说明主从数据是一致的。
在一个实施例中,第一校验表和第二校验表可以是同一个校验表,也就是说,该校验表既可以记录对主数据库中数据表进行校验的校验结果,也可以记录对从数据库中数据表进行校验的校验结果。当然,第一校验表和第二校验表是不同的校验表时,两个数据表也可既记录对主数据库中数据表进行校验的校验结果,又记录对从数据库中数据表进行校验的校验结果。这样,对比任一校验表中的两部分校验结果(如两列,一列为主数据库校验结果,另一列为从数据库校验结果),即可得到对主数据库与从数据库数据一致性校验的结果。
上述数据校验方法,自动对主数据库中的第一数据表进行校验,并将校验结果写入第一检验表。其中,主数据库的二进制日志记录了主数据库在进行数据表校验时的相关信息,这样,钩子程序即可根据主数据库的二进制日志对从数据库中对应主数据库的第一数据表的第二数据表进行校验,并将校验结果写入第二校验表,从而对比第一检验表与第二检验表即可得到主库数据一致性的校验结果,极大地扩宽了应用范围。
在一个实施例中,该数据校验方法还包括:在主数据库中执行建表语句创建第一校验表;将建表语句记录至主数据库的二进制日志中;在从数据库中重放二进制日志中的建表语句创建第二校验表。
可以理解,SQL语句包括DML(Data Manipulation Language,数据库操作语句)和DDL(Data Definition Language,数据库定义语句)。这两类语句都是会对数据库进行修改的语句,当数据库执行这些语句时,二进制日志中会记录这些语句的相关信息。其中,DML语句比如INSERT语句、UPDATE语句或者DELETE语句等。DDL语句比如CREATE语句等。
基于不同模式的二进制日志在记录DML语句的相关信息时,记录方式可能不同。比如基于STATEMENT模式的二进制日志与基于ROW模式的二进制日志记录的DML语句的相关信息不同。但是,基于不同模式的二进制日志在记录DDL语句的相关信息时,记录方式相同,即均直接记录该DDL语句。
具体地,主数据库在执行建表语句创建第一校验表后,由于该建表语句属于DDL语句,那么无论主数据库的二进制日志是怎样的格式,建表语句均直接写入二进制日志。这样,该建表语句在从数据库中重放,即直接将该建表语句传递至从数据库执行,在从数据库中建立与第一校验表相同的第二校验表。
举例说明,校验服务器在连接到主数据库后,可采用主数据库原生支持的Replication协议接管主数据库的二进制日志(即Binlog),再在主数据库上执行建表语句创建存储数据对比临时数据(即对数据表进行校验得到的校验结果)的校验表cdb.checksums;再将建表语句通过Binlog在从数据库上重放,从数据库即执行该建表语句从而在从数据库上也创建了校验表cdb.checksums。
图3示出了一个实施例中数据一致性校验的原理示意图。参考图3,在本实施例中,先在主数据库中执行建表语句,建立校验表cdb.checksums,然后通过Binlog将该建表语句在从数据库中重放,建立相同的cdb.checksums。
可以理解,主数据库中建立第一校验表的建表操作,发生在从数据库中建立第二校验表的建表操作之前。主数据库对第一数据表的校验操作,发生在从数据库对与第一数据表相应的第二数据表的校验操作之前。但,从数据库中建立第二校验表的建表操作与主数据库对第一数据表的校验操作没有明确的顺序关系。
在本实施例中,在主数据库上通过建表语句创建校验表后,即在从数据库中重放该建表语句,以在从数据库上创建与主数据库相同的校验表。这样,后续在对数据进行校验得到校验结果时,即可将校验结果记载在校验表中,这样便可通过对比校验表来进行数据一致性校验。
在一个实施例中,在进行主数据库与从数据库的数据一致性校验时,还允许存在主数据库与从数据库之间的实时同步操作,以及对主数据库的读写操作。那么,主数据库中的二进制日志中,不仅存在与第一数据表校验操作相关的日志记录,还存在与实时同步操作和/或读写操作相关的日志记录。而且这两种日志记录可以是交错排序的。也就是说,会存在进行了几次实时同步操作,然后进行几次第一数据表校验操作,再进行了几次读写操作的场景。
具体地,校验服务器在从数据库中重放主数据库的二进制日志时,当重放日志记录为实时同步操作和/或读写操作相关的日志记录时,则对从数据库中的数据表执行同步操作;当重放日志记录为与第一数据表校验操作相关的日志记录时,则通过钩子程序来执行校验操作。
比如,二进制日志中记录的日志记录为:将表A第3行的数据修改为XXX。那么,在从数据库中重放该日志记录时,即将从库中表A第3行的数据修改为XXX,从而实现将主数据库的数据改变同步到从数据库中。
再比如,二进制日志中记录的日志记录为:在校验表中加入了数据,该数据为表A的校验结果;那么,在从数据库中重放该日志记录时,即也在从库的校验表中加入数据,且加入的数据为从库中表A的校验结果,从而实现将主数据库的数据改变同步到从数据库中。
图4示出了一个实施例中在实时同步过程中进行数据一致性校验的原理图。参考图4,主数据库中包括数据表A1、A2、A3…,从数据库中包括数据表B1、B2、B3…,A1与B1为相应的数据表,A2与B2为相应的数据表。在本实施例中,数据一致性校验过程即为校验A1与B1的数据一致性以及A2与B2的数据一致性。假设在某一时间点对数据表A1中的数据块ai进行校验,得到第一校验结果Ji记录到主数据库的校验表中,同时主数据库的二进制日志中产生一条相应的日志记录Ck。在对数据表A1中的数据块ai+1进行校验前,通过其他用户的操作,对数据表A2进行了一次操作,同时主数据库的二进制日志中产生相应的日志记录Ck+1,对数据表A1中的数据块ai+1进行校验,在主数据库的二进制日志中产生一条相应的日志记录Ck+2。在从数据库中重放主数据库的二进制日志的日志记录时,当重放至日志记录Ck,根据日志记录Ck对数据表B1的数据块bi进行校验,bi与ai为对应的数块;当继续重放至日志记录Ck+1,根据日志记录Ck+1对数据表B2进行同步;当继续重放至日志记录Ck+2,根据日志记录Ck+2对数据表B1的数据块bi+1进行校验,bi+1与ai+1为对应的数块,并继续重放日志记录。
在本实施例中,可以在线地比较有主从关系的两个数据库之间的数据差异,即使主从之间仍存在实时数据同步,或者存在对主数据库的读写操作。
在一个实施例中,S202包括:将主数据库中的第一数据表划分为多个第一数据块;依次对各所述第一数据块进行校验,并将校验结果写入第一校验表。S204包括:执行钩子程序,根据所述主数据库的二进制日志的日志记录顺序,依次对从数据库中与各所述第一数据块分别对应的第二数据块进行校验,并将校验结果写入第二校验表。
可以理解,通常情况下,数据库中一张数据表的数据量较大。一次对数据量较大的整个数据表进行校验时,计算耗时通常较长。在本实施例中,通过对数据表进行数据块划分,将一张数据表划分成多个数据块,再分别对不同的数据块进行校验,这样可以减少在计算上的耗时,提高校验效率。
具体地,校验服务器可将主数据库中的第一数据表划分为多个第一数据块,再依次对各第一数据块进行校验,并将校验结果写入第一校验表。这样,主数据库的二进制日志中的按时序记录的日志记录,则能够反映主数据库中多个第一数据块的校验顺序。在从数据库执行钩子程序,则根据主数据库的二进制日志的日志记录顺序,依次对从数据库中与各第一数据块分别对应的第二数据块进行校验,并将校验结果写入第二校验表。比如,主数据库中的第一数据块N在这多个第一数据块中的校验排序为M,那么,从数据库中与第一数据块N对应的第二数据块N’,在与各第一数据块对应的第二数据块中的校验排序也为M。
举例说明,图5示出了一个实施例中主从数据库中相应数据块的示意图。参考图5,在本实施例中,主数据库中的数据表A1与从数据库中的数据表B1是相应的数据表(即A1与B1是同步的数据表),数据表A1中的数据块an与数据表B1的数据块bn是相应的数据块。当校验服务器或者主数据库所在服务器对an进行校验得到第一校验结果并写入主数据库的校验表时,主数据库的数据库日志中会相应产生一条日志记录m,当日志记录m在从数据库重放时,校验服务器或者从数据库所在服务器先确定日志记录m源自的数据块为an,从数据库中与an相应的数据块为bn,再对bn进行校验得到第二校验结果写入从数据库的校验表中。
可以理解,主数据库中数据块的校验是依次进行,有时间顺序;那么主数据库的数据库日志中的日志记录也是依次产生的,有时间顺序。在从数据库重放主数据库的数据库日志中的日志记录也是按序重放的。这样对校验表进行操作的操作结果在从数据库重放的时候,也是依次对重放的操作结果进行处理。
在一个具体的实施例中,校验表的字段可包括数据库名(db)、数据表名(tbl)、数据块名(chunk)、数据块左边界(lower_boundary)、数据块右边界(upper_boundary)、主数据库中数据块的校验结果(master_crc)、主数据库中校验的数据块的行数(master_count)、从数据库中数据块的校验结果(this_crc)和从数据库中校验的数据块的行数(this_count)等。这样,在重放日志记录时,校验服务器或者从数据库所在服务器,即可快速根据日志记录中记录的写入表中的数据确定日志记录源自的数据块。
继续参考图3,校验服务器或者主数据库所在服务器对数据表A的第一个chunk进行校验时,可确定该chuck的左边界,记为X(比如1-1000数据块的左边界为1),并判断是否存在下一个chunk的左边界。当存在下一个chunk的左边界时,说明当前的chunk非数据表A的最后一个chunk,对当前chunk进行循环冗余校验得到当前chunk的master_crc,和当前chunk的行数master_count。当不存在下一个chunk的左边界时,说明当前的chunk是数据表A的最后一个chunk,将当前chunk的最大值最为当前chunk的右边界Y,并对当前chunk进行循环冗余校验得到当前chunk的master_crc,和当前chunk的行数master_count。
上述实施例中,将待校验的数据表划分为数据块,以数据块为单位进行计算,避免了对数据表的整体加锁,减少了对主数据库正常读写业务的影响。而且,主数据库中与各第一数据块对应的第二数据块校验顺序,与各第一数据块的校验顺序一致,保证了主数据库与从数据库相应的数据块按相同的顺序校验,避免了校验过程受其他数据库操作影响导致校验出错的问题。
在一个实施例中,依次对各第一数据块进行校验,并将校验结果写入第一校验表,包括:依次将划分得到的每个第一数据块作为当前数据块;对当前数据块的所有列进行校验并进行行数统计;将校验结果和行数写入第一校验表,并将下一个第一数据块作为当前数据块进行校验和行数统计至最后一个第一数据块。
其中,第一数据块可以包括多行数据。具体地,校验服务器可依次将划分得到的每个第一数据块作为当前数据块,对当前数据块的所有列进行校验,并对当前数据块进行行数统计,将得到的校验结果和行数写入第一校验表,然后将下个第一数据块作为当前数据块,对当前数据块执行前述操作直至最后一个第一数据块。
在一个实施例中,各第一数据块与对应的第二数据块的行数相同。执行钩子程序,根据主数据库的二进制日志的日志记录顺序,依次对从数据库中与各第一数据块分别对应的第二数据块进行校验,并将校验结果写入第二校验表,包括:执行钩子程序,根据主数据库的二进制日志的日志记录顺序,依次确定从数据库中与各第一数据块分别对应的第二数据块;对依次确定的各第二数据块的所有列进行校验并进行行数统计;将校验结果和行数写入第二校验表。
可以理解,校验服务器在从数据库中执行钩子程序,确定的与第一数据块对应的第二数据块,是与该第一数据块的行数相同的。如果行数不相同,那就说明主从数据库的数据存在差异。而现有的数据一致性校验方式中,在行数一致的情况下,对从数据库中的数据块进行校验时,仅对该数据块中与主数据库相应数据块的相应列的数据进行校验。那么,在主从数据库中相应数据表的数据列不一致时,现有的数据一致性校验方式会产生错误对比结果的问题。在本实施例中,通过钩子程序对从数据库中的数据块进行校验时,则对该数据块中所有列的数据均进行校验,有效地避免了该错误的发生。
需要说明的是,依次对数据块进行校验的过程可以是连续的,也就是说在对当前数据块处理完后,则立即对下一个数据块进行处理。当主数据库或者从数据库的压力较大时,不同的数据块处理间可以存在时间间隔,比如每处理完一个数据块就等待100ms再处理下一个数据块等。
另外,当数据表的校验中断需要重新进行校验时,或者对当前处理的数据块重新处理时,主数据库可删除第一校验表中相应的历史校验结果。而且删除操作会经二进制日志同步到从数据库,从数据库上也会删除第二校验表中相应数据块的历史校验结果。
在上述实施例中,在对主库中的数据块进行校验时,是对该数据块所有数据列的数据进行校验;而且在根据钩子程序来对从库中相应的数据块进行校验时,也是对从库中该相应的数据块的所有数据列的数据都进行校验,有效地避免了在主从库中相应数据库中列不同时会出现校验错误的问题。
在一个实施例中,将主数据库中的第一数据表划分为多个第一数据块,包括:获取主数据库的第一数据表的唯一索引;根据唯一索引所包括的键值,将第一数据表按行划分为多个第一数据块。
其中,一张数据表的唯一索引是该数据表中各行的键值的集合。唯一索引所包括的键值各不相同。通常情况下数据库中的数据表均可存在一个唯一索引。
具体地,校验服务器在明确需要进行数据校验的数据表后,可获取该数据表的唯一索引,根据唯一索引所包括的键值,对数据表中包括的多行数据进行排序,将主数据库的数据表按键值划分为多个数据块,也就是按行划分为多个数据块,每个数据块包括多行数据。
举例说明,对于待进行数据校验的数据表的其中一张表t1,找到这个表的唯一索引,按照唯一索引所包括的键值将该表的数据划分成一个个的小数据块(chuck),比如第1-1000,1001-1999,...条数据等等。
可以理解,一个数据块中包括的多行数据可以是相邻的数据行,也可以是不相邻的数据行。这是由于行数据在数据表中的行号与行数据的键值在唯一索引中的序号不一定相同。比如,数据表A中的第三行数据,在数据表A中的行排序为3,但是该行数据的键值在唯一索引中的排序不是3。而由于可能存在对数据表的增删操作,所以行号不能唯一标识一行数据,而是通过行数据的键值来唯一标识该行数据。
当校验服务器未查找到该数据表的唯一索引时,可触发提示消息的展示。该提示消息的内容包括询问用户是否为该数据表添加唯一索引,以及不添加唯一索引的风险,以为用户提供自主选择的途径。这里不添加唯一索引,会增加数据校验的耗时,很难保证对主从同步没有影响,但不会影响结果的正确性。
再参考图3,在本实施例中,待进行数据校验的数据表包括数据表A,那么则获取数据表A的唯一索引,根据唯一索引所包括的键值,将数据表A按行划分为多个数据块(chunk)。
在本实施例中,根据唯一索引将待对比的表按行切分为块,以块为单位计算,避免对数据表的整体加锁,可以较少耗时;而且能够降低校验过程中,对主数据库和从数据库中异于该校验操作的其他读写操作的影响。
在一个实施例中,依次对各第一数据块进行校验,并将校验结果写入第一校验表,包括:依次将划分得到的每个第一数据块作为当前数据块;在对当前数据块进行校验时,启动事务操作,通过事务操作按照预设的校验方式对当前数据块进行运算得到相应的第一校验结果;在通过事务操作将第一校验结果写入第一校验表后,结束事务操作并将下一个第一数据块作为当前数据块进行校验直至最后一个第一数据块。
需要说明的是,对数据库的操作包括普通操作和事务操作等不同类型的操作。普通操作包括对数据库的增加、删除、查找或者修改等单次操作,事务操作是对数据库批量的增加、删除、查找、修改等操作。在事务下为原子操作,只包括成功或失败两种结果,不会出现中间结果。
具体地,校验服务器或者主数据库所在服务器可依次将划分得到的每个数据块作为当前数据块,在对当前数据块进行校验时,启动事务操作,通过事务操作按照预设的校验方式对当前数据块进行运算得到相应的第一校验结果,并继续通过事务操作将当前数据块的第一校验结果记录至第一校验表,再结束该事务操作,然后将下一个数据块作为当前数据块,执行上述对当前数据块进行的操作,直至最后一个数据块为止。可以理解,对于每一个数据块,均通过一次事务操作进行该数据块的校验和校验结果记录。
在一个实施例中,校验服务器或者主数据库所在服务器在确定待进行数据校验的数据表时,可检测主数据库中这些数据表所对应的引擎是否支持事务操作。当主数据库中这些数据表所对应的引擎均支持事务操作时,校验服务器或者主数据库所在服务器则继续执行后续的步骤;当主数据库中这些数据表中存在数据表所对应的引擎均不支持事务操作时,校验服务器或者主数据库所在服务器则继续执行后续的步骤可触发提醒消息。该提醒消息用于提醒用户修改该不支持事务操作的数据表所对应的引擎,在用户更新不支持事务操作的数据表所对应的引擎至支持事务操作后,继续执行后续的步骤。其中,支持事务操作的引擎比如MySQL支持的InnoDB引擎或者TokuDB引擎等。
在一个实施例中,事务操作被启动时,主数据库的隔离级别为重复读级别。启动事务操作,通过事务操作按照预设的校验方式对当前数据块进行运算得到相应的第一校验结果,包括:启动事务操作;基于并发控制生成事务操作被启动时的数据库快照;通过事务操作,按照预设的校验方式对数据库快照中的当前数据块进行运算得到相应的第一校验结果。
可以理解,当校验主数据库与从数据库之间的数据表,主数据库同时支持其他用户的读写操作时,如果其他用户的读写操作以及校验操作针对同一张数据表,会影响校验结果,导致校验出错。
本申请实施例中的主数据库支持MVCC(Multi-Version Concurrency Control,多版本并发控制)。需要说明的是,通常情况下,如果有用户从数据库中读数据的同时,有另外的用户写入数据,有可能读数据的用户会看到“半写”或者不一致的数据。为了解决这个问题,最简单的方法是通过对数据库加锁,让所有的读数据的用户等待写数据的用户工作完成,但是这样效率会很差。MVCC则使用了一种不同的手段,每个连接到数据库的读数据的用户,在某个瞬间看到的是数据库的一个快照,写数据的用户的写操作造成的变化在写操作完成之前(或者数据库事务提交之前)对于其他读数据的用户来说是不可见的。
通常情况下,MVCC只在REPEATABLE READ(重复读级别)和READ COMMITED(只读已提交的数据)两个隔离级别下工作。在本实施例中,当通过一个事务操作对数据库进行校验时,主数据库的隔离级别为重复读级别,在此隔离级别下,该事务操作中任意次的重复读操作得到的数据都是一样,无论此时读取的数据表是否有更新操作,保证了校验结果的正确性。
在本实施例中,通过并发控制与数据库隔离级别的设置,使得在进行数据库校验的事务操作中任意次的重复读操作得到的数据都是一样,无论此时读取的数据表是否有更新操作,保证了校验结果的正确性。
继续参考图3,校验服务器或者主数据库所在服务器对当前数据块进行校验时,在一个事务操作中,计算当前chunk的循环冗余校验结果master_crc和行数master_count,写入主数据库的checksums表中。该操作的操作结果可记录至主数据库的数据库日志中,当在从数据库中重放数据库日志的操作结果时,启动钩子函数,通过钩子函数计算当前chunk相应chunk的循环冗余校验结果this_crc和行数this_count,写入从数据库的checksums表中。主数据库可获取从数据库得到的this_crc和this_count,写入主数据库的checksums表中;从数据库也可获取主数据库得到的master_crc和master_count,写入从数据库的checksums表中。校验服务器或者主数据库所在服务器再获取下一个chunk,循环执行对当前chunk执行的操作。直至当前chunk为待校验的最后一个chunk时,chunk为(—∞,X)或者(Y,+∞),此时对数据表A的校验结束,可以根据主数据库的校验表或者从数据库的校验表,得到校验结果。
可以理解,在对数据表A进行校验时,还可能对该数据表A进行增加行的操作,因此,对于数据表A的唯一索引的范围设置为(—∞,+∞)。
上述实施例中,通过一次事务操作完成一个数据块的数据校验与校验结果的记录,保证了校验结果的正确性。
总的来说,现有的数据一致性校验要求主数据库的数据库日志必须是基于STATEMENT模式的二进制日志,而对于其他模式的二进制日志(比如基于ROW模式二进制日志)则受到限制。而且目前业界的主从同步,由于STATEMENT模式有较多的已知问题,比如可能会严重导致主从数据的不一致,所以基本不会采用STATEMENT模式的二进制日志进行主从同步。对于非STATEMENT模式的二进制日志的主从同步,需要先将数据库连接session的二进制日志模式修改为STATEMENT,该修改需要用户提供SUPER权限的账号。一般来说,用户对于提供高权限的数据库账号比较敏感。而且,在某些特殊场景下,现有的数据一致性校验并不能对比出主从数据库的数据差异。比如主数据库中的数据表和从数据库中相应的数据表前面几个字段的定义是一模一样的,但从数据库的数据表比主数据库的数据表多一个或多个字段的情况,也就是说,两张数据表除了最后一列或多列,表中的其他数据是一模一样的。在这种情况下,现有的数据一致性校验对比两个表会得到错误的结论,从而可能引发灾难性的后果。
结合前述的实施例,可以理解的是,本申请实施例不需要SUPER权限强制将数据库日志的模式修改为STATEMENT模式。而且,本申请实施例中基于待校验的数据表的唯一索引以及重放日志记录时执行的钩子程序(也称钩子操作),使得在数据一致性校验过程中不依赖于重放基于STATEMENT模式的二进制日志中记录的SQL语句来完成数据一致性校验任务。同时,本申请实施例中执行钩子程序会将从数据库上与主数据相应的数据块的所有数据均参与CRC校验,这样可以避免在从数据库的数据表多一列或多列时可能产生误判的情况。
而且,在主从同步正常的数据库之间,如果在主从数据库相同快照时间点,任意数据块的数据都是一致的,那么主从数据库的数据肯定是一致的。由于主数据库的二进制日志是严格在时间维度上线性有序的,当从数据库准备执行钩子程序时,从数据库的数据快照时间点与主数据库执行相应数据块校验时是一致的。这个推论很容易通过反证法证明,因为主从同步正常的数据库之间,在主从数据库相同快照时间点任意数据块的数据都是一致的,如果主从数据库的数据不一致,那么之前在对比时,主从数据不可能在相同快照点是一致的。
应该理解的是,虽然上述各实施例的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,上述各实施例中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
如图6所示,在一个实施例中,提供了一种数据校验装置600。参照图6,该数据校验装置600包括:第一校验模块601、第二校验模块602和对比模块603。
第一校验模块601,用于对主数据库中的第一数据表进行校验并将校验结果写入第一校验表。
第二校验模块602,用于执行钩子程序,根据主数据库的二进制日志对从数据库中对应第一数据表的第二数据表进行校验,并将校验结果写入第二校验表。
对比模块603,用于比对第一校验表与第二校验表。
上述数据校验装置600,自动对主数据库中的第一数据表进行校验,并将校验结果写入第一检验表。其中,主数据库的二进制日志记录了主数据库在进行数据表校验时的相关信息,这样,钩子程序即可根据主数据库的二进制日志对从数据库中对应主数据库的第一数据表的第二数据表进行校验,并将校验结果写入第二校验表,从而对比第一检验表与第二检验表即可得到主库数据一致性的校验结果,极大地扩宽了应用范围。
在一个实施例中,第一校验模块601还用于将主数据库中的第一数据表划分为多个第一数据块;依次对各第一数据块进行校验,并将校验结果写入第一校验表。第二校验模块602还用于执行钩子程序,根据主数据库的二进制日志的日志记录顺序,依次对从数据库中与各第一数据块分别对应的第二数据块进行校验,并将校验结果写入第二校验表。
在一个实施例中,第一校验模块601还用于依次将划分得到的每个第一数据块作为当前数据块;对当前数据块的所有列进行校验并进行行数统计;将校验结果和行数写入第一校验表,并将下一个第一数据块作为当前数据块进行校验和行数统计直至最后一个第一数据块。
在一个实施例中,各第一数据块与对应的第二数据块的行数相同。第二校验模块602还用于执行钩子程序,根据主数据库的二进制日志的日志记录顺序,依次确定从数据库中与各第一数据块分别对应的第二数据块;对依次确定的各第二数据块的所有列进行校验并进行行数统计;将校验结果和行数写入第二校验表。
在一个实施例中,第一校验模块601还用于获取主数据库的第一数据表的唯一索引;根据唯一索引所包括的键值,将第一数据表按行划分为多个第一数据块。
在一个实施例中,第一校验模块601还用于依次将划分得到的每个第一数据块作为当前数据块;在对当前数据块进行校验时,启动事务操作,通过事务操作按照预设的校验方式对当前数据块进行运算得到相应的第一校验结果;在通过事务操作将第一校验结果写入第一校验表后,结束事务操作并将下一个第一数据块作为当前数据块进行校验直至最后一个第一数据块。
在一个实施例中,事务操作被启动时,主数据库的隔离级别为重复读级别。第一校验模块601还用于启动事务操作;基于并发控制生成事务操作被启动时的数据库快照;通过事务操作,按照预设的校验方式对数据库快照中的当前数据块进行运算得到相应的第一校验结果。
如图7所示,在一个实施例中,数据校验装置600还包括:第一建表模块604和第二建表模块605。
第一建表模块604,用于在主数据库中执行建表语句创建第一校验表;将所述建表语句记录至所述主数据库的二进制日志中。
第二建表模块605,用于在从数据库中重放所述二进制日志中的所述建表语句创建第二校验表。
在一个实施例中,属于主数据库的二进制日志为基于行复制模式的二进制日志。
图8示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的校验服务器130。如图8所示,该计算机设备包括该计算机设备包括通过***总线连接的处理器、存储器和网络接口。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作***,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现数据校验方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行数据校验方法。本领域技术人员可以理解,图8中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,本申请提供的数据校验装置可以实现为一种计算机程序的形式,计算机程序可在如图8所示的计算机设备上运行。计算机设备的存储器中可存储组成该数据校验装置的各个程序模块,比如,图6所示的第一校验模块601、第二校验模块602和对比模块603。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的数据校验方法中的步骤。
例如,图8所示的计算机设备可以通过如图6所示的数据校验装置600中的第一校验模块601对主数据库中的第一数据表进行校验并将校验结果写入第一校验表。通过第二校验模块602执行钩子程序,根据主数据库的二进制日志对从数据库中对应第一数据表的第二数据表进行校验,并将校验结果写入第二校验表。通过对比模块603比对第一校验表与第二校验表。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述数据校验方法的步骤。此处数据校验方法的步骤可以是上述各个实施例的数据校验方法中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述数据校验方法的步骤。此处数据校验方法的步骤可以是上述各个实施例的数据校验方法中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (18)
1.一种数据校验方法,其特征在于,所述方法包括:
当产生对主数据库中数据表的修改操作时,则基于ROW模式的二进制日志,记录执行所述修改操作的相关信息;
确定所述主数据库中待进行数据一致性校验的第一数据表;
对主数据库中的所述第一数据表,采用预设校验方式对所述第一数据表中的数据进行数据表校验并将校验结果写入第一校验表;
在从数据库中重放所述主数据库的二进制日志;
当重放到与所述第一数据表的校验操作相关的日志记录时,执行钩子程序,通过所述钩子程序根据所述主数据库的二进制日志中与所述第一数据表的校验操作相关的日志记录,确定所述从数据库中与当前重放的日志记录源自的所述第一数据表相应的第二数据表,确定所述主数据库对所述第一数据表进行数据表校验所采用的预设校验方式,按所述预设校验方式对所述从数据库中的所述第二数据表中数据进行数据表校验,并将校验结果写入第二校验表;
比对所述第一校验表与所述第二校验表。
2.根据权利要求1所述的方法,其特征在于,所述对主数据库中的所述第一数据表,采用预设校验方式对所述第一数据表中的数据进行数据表校验并将校验结果写入第一校验表,包括:
将所述主数据库中的所述第一数据表划分为多个第一数据块;
依次对各所述第一数据块进行校验,并将校验结果写入所述第一校验表;
所述按所述预设校验方式对所述从数据库中的所述第二数据表中数据进行数据表校验,并将校验结果写入第二校验表,包括:
根据所述主数据库的所述二进制日志的日志记录顺序,依次对所述从数据库中与各所述第一数据块分别对应的第二数据块进行校验,并将校验结果写入所述第二校验表。
3.根据权利要求2所述的方法,其特征在于,所述依次对各所述第一数据块进行校验,并将校验结果写入所述第一校验表,包括:
依次将划分得到的每个所述第一数据块作为当前数据块;
对所述当前数据块的所有列进行校验并进行行数统计;
将校验结果和行数写入所述第一校验表,并将下一个第一数据块作为当前数据块进行校验和行数统计直至最后一个第一数据块。
4.根据权利要求2所述的方法,其特征在于,各所述第一数据块与对应的第二数据块的行数相同;所述根据所述主数据库的所述二进制日志的日志记录顺序,依次对所述从数据库中与各所述第一数据块分别对应的第二数据块进行校验,并将校验结果写入所述第二校验表,包括:
根据所述主数据库的所述二进制日志的日志记录顺序,依次确定所述从数据库中与各所述第一数据块分别对应的第二数据块;
对依次确定的各所述第二数据块的所有列进行校验并进行行数统计;
将校验结果和行数写入所述第二校验表。
5.根据权利要求2所述的方法,其特征在于,所述将所述主数据库中的所述第一数据表划分为多个第一数据块,包括:
获取所述主数据库的所述第一数据表的唯一索引;
根据所述唯一索引所包括的键值,将所述第一数据表按行划分为多个第一数据块。
6.根据权利要求2所述的方法,其特征在于,所述依次对各所述第一数据块进行校验,并将校验结果写入所述第一校验表,包括:
依次将划分得到的每个所述第一数据块作为当前数据块;
在对所述当前数据块进行校验时,启动事务操作,通过所述事务操作按照预设的校验方式对所述当前数据块进行运算得到相应的第一校验结果;
在通过所述事务操作将所述第一校验结果写入所述第一校验表后,结束所述事务操作,并将下一个第一数据块作为当前数据块进行校验直至最后一个第一数据块。
7.根据权利要求6所述的方法,其特征在于,所述事务操作被启动时,所述主数据库的隔离级别为重复读级别;所述启动事务操作,通过所述事务操作按照预设的校验方式对所述当前数据块进行运算得到相应的第一校验结果,包括:
启动所述事务操作;
基于并发控制生成所述事务操作被启动时的数据库快照;
通过所述事务操作,按照预设的校验方式对所述数据库快照中的所述当前数据块进行运算得到相应的第一校验结果。
8.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述主数据库中执行建表语句创建所述第一校验表;
将所述建表语句记录至所述主数据库的所述二进制日志中;
在所述从数据库中重放所述二进制日志中的所述建表语句,创建所述第二校验表。
9.一种数据校验装置,其特征在于,所述装置包括:
日志记录模块,用于当产生对主数据库中数据表的修改操作时,则基于ROW模式的二进制日志,记录执行所述修改操作的相关信息;
第一校验模块,用于确定所述主数据库中待进行数据一致性校验的第一数据表;对所述主数据库中的所述第一数据表,采用预设校验方式对所述第一数据表中的数据进行数据表校验并将校验结果写入第一校验表;
第二校验模块,用于在从数据库中重放所述主数据库的二进制日志;当重放到与所述第一数据表的校验操作相关的日志记录时,执行钩子程序,通过所述钩子程序根据所述主数据库的二进制日志中与所述第一数据表的校验操作相关的日志记录,确定所述从数据库中与当前重放的日志记录源自的所述第一数据表相应的第二数据表,确定所述主数据库对所述第一数据表进行数据表校验所采用的预设校验方式,按所述预设校验方式对所述从数据库中的所述第二数据表中数据进行数据表校验,并将校验结果写入第二校验表;
对比模块,用于比对所述第一校验表与所述第二校验表。
10.根据权利要求9所述的装置,其特征在于,所述第一校验模块还用于将所述主数据库中的所述第一数据表划分为多个第一数据块;依次对各所述第一数据块进行校验,并将校验结果写入所述第一校验表;
所述第二校验模块还用于根据所述主数据库的所述二进制日志的日志记录顺序,依次对所述从数据库中与各所述第一数据块分别对应的第二数据块进行校验,并将校验结果写入所述第二校验表。
11.根据权利要求10所述的装置,其特征在于,所述第一校验模块还用于依次将划分得到的每个所述第一数据块作为当前数据块;对所述当前数据块的所有列进行校验并进行行数统计;将校验结果和行数写入所述第一校验表,并将下一个第一数据块作为当前数据块进行校验和行数统计直至最后一个第一数据块。
12.根据权利要求10所述的装置,其特征在于,各所述第一数据块与对应的第二数据块的行数相同;所述第二校验模块还用于根据所述主数据库的所述二进制日志的日志记录顺序,依次确定所述从数据库中与各所述第一数据块分别对应的第二数据块;对依次确定的各所述第二数据块的所有列进行校验并进行行数统计;将校验结果和行数写入所述第二校验表。
13.根据权利要求10所述的装置,其特征在于,所述第一校验模块还用于获取所述主数据库的所述第一数据表的唯一索引;根据所述唯一索引所包括的键值,将所述第一数据表按行划分为多个第一数据块。
14.根据权利要求10所述的装置,其特征在于,所述第一校验模块还用于依次将划分得到的每个所述第一数据块作为当前数据块;在对所述当前数据块进行校验时,启动事务操作,通过所述事务操作按照预设的校验方式对所述当前数据块进行运算得到相应的第一校验结果;在通过所述事务操作将所述第一校验结果写入所述第一校验表后,结束所述事务操作,并将下一个第一数据块作为当前数据块进行校验直至最后一个第一数据块。
15.根据权利要求14所述的装置,其特征在于,所述事务操作被启动时,所述主数据库的隔离级别为重复读级别;所述第一校验模块还用于启动所述事务操作;基于并发控制生成所述事务操作被启动时的数据库快照;通过所述事务操作,按照预设的校验方式对所述数据库快照中的所述当前数据块进行运算得到相应的第一校验结果。
16.根据权利要求9所述的装置,其特征在于,所述装置还包括:
第一建表模块,用于在所述主数据库中执行建表语句创建所述第一校验表;将所述建表语句记录至所述主数据库的所述二进制日志中;
第二建表模块,用于在所述从数据库中重放所述二进制日志中的所述建表语句创建所述第二校验表。
17.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如权利要求1至8中任一项所述方法的步骤。
18.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如权利要求1至8中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910134147.2A CN110209521B (zh) | 2019-02-22 | 2019-02-22 | 数据校验方法、装置、计算机可读存储介质和计算机设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910134147.2A CN110209521B (zh) | 2019-02-22 | 2019-02-22 | 数据校验方法、装置、计算机可读存储介质和计算机设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110209521A CN110209521A (zh) | 2019-09-06 |
CN110209521B true CN110209521B (zh) | 2022-03-18 |
Family
ID=67784997
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910134147.2A Active CN110209521B (zh) | 2019-02-22 | 2019-02-22 | 数据校验方法、装置、计算机可读存储介质和计算机设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110209521B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111190884A (zh) * | 2019-12-17 | 2020-05-22 | 腾讯科技(深圳)有限公司 | 数据校验方法、装置和计算机可读存储介质 |
CN111125063B (zh) * | 2019-12-20 | 2023-09-26 | 无线生活(杭州)信息科技有限公司 | 一种快速校验集群间的数据迁移的方法及装置 |
CN113032477B (zh) * | 2019-12-24 | 2023-07-21 | 中移在线服务有限公司 | 基于gtid的长距离数据同步方法、装置及计算设备 |
CN113051265A (zh) * | 2019-12-27 | 2021-06-29 | 中信百信银行股份有限公司 | 一种降低关系型数据库表结构变更所带来损耗的方法、装置、计算机设备、和可读存储介质 |
CN111301695B (zh) * | 2020-03-10 | 2022-03-22 | 中国商用飞机有限责任公司 | 飞机驾驶舱中使用的操作指引*** |
CN111966699A (zh) * | 2020-07-09 | 2020-11-20 | 微民保险代理有限公司 | 校验数据的方法、装置、计算机设备和存储介质 |
CN111930850A (zh) * | 2020-09-24 | 2020-11-13 | 腾讯科技(深圳)有限公司 | 数据校验方法、装置、计算机设备和存储介质 |
CN113420036A (zh) * | 2021-06-22 | 2021-09-21 | 南方电网数字电网研究院有限公司 | 一种电网监控***内存库关系库一致性校验方法 |
CN113391956B (zh) * | 2021-06-23 | 2024-02-27 | 中国工商银行股份有限公司 | 一种双园区的数据校验方法及装置 |
CN113625629B (zh) * | 2021-08-06 | 2023-03-07 | 中国电子科技集团公司第五十八研究所 | 一种应用于n_flash型fpga的配置控制电路 |
CN113704359B (zh) * | 2021-09-03 | 2024-04-26 | 优刻得科技股份有限公司 | 一种时序数据库多数据副本的同步方法、***以及服务器 |
CN114840543A (zh) * | 2022-05-05 | 2022-08-02 | 北京达佳互联信息技术有限公司 | 数据处理方法、装置、电子设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104657382A (zh) * | 2013-11-21 | 2015-05-27 | 阿里巴巴集团控股有限公司 | 用于MySQL主从服务器数据一致性检测的方法和装置 |
CN105989044A (zh) * | 2015-02-04 | 2016-10-05 | 阿里巴巴集团控股有限公司 | 一种数据库校验方法及*** |
CN107807982A (zh) * | 2017-10-27 | 2018-03-16 | 中国农业银行股份有限公司 | 一种异构数据库的一致性校验方法及装置 |
CN108874882A (zh) * | 2018-05-04 | 2018-11-23 | 广州四九游网络科技有限公司 | 一种thinkphp框架的数据处理方法 |
CN108874644A (zh) * | 2018-06-06 | 2018-11-23 | 平安科技(深圳)有限公司 | 数据监控方法、装置、计算机设备及存储介质 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104252481B (zh) * | 2013-06-27 | 2018-10-19 | 阿里巴巴集团控股有限公司 | 主从数据库一致性的动态校验方法和装置 |
CN107798007B (zh) * | 2016-08-31 | 2024-03-19 | 金篆信科有限责任公司 | 一种分布式数据库数据校验的方法、装置及相关装置 |
CN107506379A (zh) * | 2017-07-20 | 2017-12-22 | 北京影合众新媒体技术服务有限公司 | 基于数据库row模式构建流式实时电影生态模型的方法 |
CN108563532B (zh) * | 2018-02-28 | 2021-01-19 | 深圳和而泰家居在线网络科技有限公司 | 数据处理方法及相关装置 |
-
2019
- 2019-02-22 CN CN201910134147.2A patent/CN110209521B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104657382A (zh) * | 2013-11-21 | 2015-05-27 | 阿里巴巴集团控股有限公司 | 用于MySQL主从服务器数据一致性检测的方法和装置 |
CN105989044A (zh) * | 2015-02-04 | 2016-10-05 | 阿里巴巴集团控股有限公司 | 一种数据库校验方法及*** |
CN107807982A (zh) * | 2017-10-27 | 2018-03-16 | 中国农业银行股份有限公司 | 一种异构数据库的一致性校验方法及装置 |
CN108874882A (zh) * | 2018-05-04 | 2018-11-23 | 广州四九游网络科技有限公司 | 一种thinkphp框架的数据处理方法 |
CN108874644A (zh) * | 2018-06-06 | 2018-11-23 | 平安科技(深圳)有限公司 | 数据监控方法、装置、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110209521A (zh) | 2019-09-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110209521B (zh) | 数据校验方法、装置、计算机可读存储介质和计算机设备 | |
US11429641B2 (en) | Copying data changes to a target database | |
US10275507B2 (en) | Replication of a relational database | |
CN110209735B (zh) | 数据库备份方法、数据库备份装置、计算设备和存储介质 | |
US8296269B2 (en) | Apparatus and method for read consistency in a log mining system | |
US20130246358A1 (en) | Online verification of a standby database in log shipping physical replication environments | |
US20110145201A1 (en) | Database mirroring | |
CN111930850A (zh) | 数据校验方法、装置、计算机设备和存储介质 | |
EP4170509A1 (en) | Method for playing back log on data node, data node, and system | |
US8935207B2 (en) | Inspecting replicated data | |
CN110543446A (zh) | 一种基于快照的区块链直接归档方法 | |
CN111176885A (zh) | 一种分布式存储***的数据校验方法及相关装置 | |
CN113312205B (zh) | 数据校验方法、装置、存储介质和计算机设备 | |
CN110287183B (zh) | 数据库表水位的处理方法、装置、计算机设备及存储介质 | |
US8862550B1 (en) | Reliable in-place bootstrap metadata transformation in a shared data store | |
CN110543485B (zh) | 一种基于快照的区块链预约归档方法 | |
CA3191210A1 (en) | Data syncronization method and device, computer equipment and storage medium | |
US11372838B2 (en) | Parallel processing of changes in a distributed system | |
CN114996240A (zh) | 数据表校验方法、装置、设备、存储介质及程序 | |
CN114756408A (zh) | 元数据备份恢复方法、装置、电子设备及存储介质 | |
Spall et al. | Forward build systems, formally | |
CN112835909A (zh) | 数据核对方法、装置、计算机设备和存储介质 | |
WO2018218814A1 (zh) | 脱机交易记录保存方法、计算机设备和存储介质 | |
CN116257531B (zh) | 一种数据库空间回收方法 | |
US12008017B2 (en) | Replicating data across databases by utilizing validation functions for data completeness and sequencing |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20230913 Address after: 100089 Beijing Haidian District Zhichun Road 49 No. 3 West 309 Patentee after: TENCENT CLOUD COMPUTING (BEIJING) Co.,Ltd. Address before: 518000 Tencent Building, No. 1 High-tech Zone, Nanshan District, Shenzhen City, Guangdong Province, 35 Floors Patentee before: TENCENT TECHNOLOGY (SHENZHEN) Co.,Ltd. |
|
TR01 | Transfer of patent right |