一种数据备份方法及装置转让专利

申请号 : CN201210291403.7

文献号 : CN103593257B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘辉翟卫祥

申请人 : 阿里巴巴集团控股有限公司

摘要 :

本申请公开了一种数据备份方法及装置,用以解决现有技术中备库备份数据的速度较低,处理事务的准确性较低的问题。该方法备库针对relay日志中记录的待处理事务,确定待处理事务中包含的各操作记录对应的数据的数据标识,并判断当前正在处理的各事务中,是否存在与待处理事务冲突的事务,当不存在时,选择一个空闲的线程处理待处理事务中包含的各操作记录,其中,与待处理事务冲突的事务为:包含的操作记录对应的数据的数据标识与确定的至少一个数据标识相同的事务。上述方法通过多个线程并行的处理互不冲突的多个事务,并且一个线程处理一个事务中的所有操作记录,因此可以有效的提高备库备份数据的速度,并提高备库处理事务的准确性。

权利要求 :

1.一种数据备份方法,其特征在于,包括:

备库针对relay日志中记录的待处理事务,确定所述待处理事务中包含的每个操作记录对应的数据标识;并根据确定的每个数据标识,判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,其中,与所述待处理事务冲突的事务为:包含的操作记录对应的数据标识与所述待处理事务中包含的多条操作记录中的至少一个操作记录对应的数据标识相同的事务;

若是,则在设定时间间隔之后,继续判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,并根据判断结果进行相应处理;

否则,在预先创建的线程中,选择一个空闲的线程处理所述待处理事务中包含的各操作记录。

2.如权利要求1所述的方法,其特征在于,确定所述待处理事务中包含的每个操作记录对应的数据标识,具体包括:针对所述待处理事务中包含的每个操作记录,将该操作记录解析为执行语句并执行;

当所述备库在执行所述执行语句的过程中提取出数据标识时,停止执行所述执行语句,并将提取出的数据标识确定为该操作记录对应的数据标识。

3.如权利要求1所述的方法,其特征在于,根据确定的每个数据标识,判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,具体包括:根据确定的每个数据标识,确定每个数据标识的哈希hash值;

判断事务记录表中当前是否记录了至少一个确定的hash值,其中,所述事务记录表中记录了当前正在处理的事务中包含的操作记录对应的数据标识的hash值;

若是,则确定当前正在处理的各事务中,存在与所述待处理事务冲突的事务;

否则,确定当前正在处理的各事务中,不存在与所述待处理事务冲突的事务。

4.如权利要求3所述的方法,其特征在于,当确定当前正在处理的各事务中,不存在与所述待处理事务冲突的事务时,所述方法还包括:将确定的所述待处理事务中包含的每个操作记录对应的数据标识的hash值记录在所述事务记录表中。

5.如权利要求4所述的方法,其特征在于,所述方法还包括:

通过选择的线程处理所述待处理事务中包含的所有操作记录之后,删除所述事务记录表中记录的所述待处理事务中包含的每个操作记录对应的数据标识的hash值。

6.一种数据备份装置,其特征在于,包括:

确定模块,用于针对relay日志中记录的待处理事务,确定所述待处理事务中包含的每个操作记录对应的数据标识;

判断模块,用于根据确定的每个数据标识,判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,其中,与所述待处理事务冲突的事务为:包含的操作记录对应的数据标识与所述待处理事务中包含的多条操作记录中的至少一个操作记录对应的数据标识相同的事务;当判断结果为是时,在设定时间间隔之后,继续判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务;

处理模块,用于当所述判断模块的判断结果为否时,在预先创建的线程中,选择一个空闲的线程处理所述待处理事务中包含的各操作记录。

7.如权利要求6所述的装置,其特征在于,所述确定模块具体用于,针对所述待处理事务中包含的每个操作记录,将该操作记录解析为执行语句并执行,当在执行所述执行语句的过程中提取出数据标识时,停止执行所述执行语句,并将提取出的数据标识确定为该操作记录对应的数据标识。

8.如权利要求6所述的装置,其特征在于,所述判断模块具体用于,根据确定的每个数据标识,确定每个数据标识的哈希hash值;判断事务记录表中当前是否记录了至少一个确定的hash值,其中,所述事务记录表中记录了当前正在处理的事务中包含的操作记录对应的数据标识的hash值;若是,则确定当前正在处理的各事务中,存在与所述待处理事务冲突的事务;否则,确定当前正在处理的各事务中,不存在与所述待处理事务冲突的事务。

9.如权利要求8所述的装置,其特征在于,所述处理模块还用于,当所述判断模块的判断结果为否时,将确定的所述待处理事务中包含的每个操作记录对应的数据标识的hash值记录在所述事务记录表中。

10.如权利要求9所述的装置,其特征在于,所述处理模块还用于,通过选择的线程处理所述待处理事务中包含的所有操作记录之后,删除所述事务记录表中记录的所述待处理事务中包含的每个操作记录对应的数据标识的hash值。

说明书 :

一种数据备份方法及装置

技术领域

[0001] 本申请涉及通信技术领域,尤其涉及一种数据备份方法及装置。

背景技术

[0002] MySQL是一种小型关系型数据库管理系统。一般的,MySQL包括主库和备库,主库用于提供数据管理和数据查询等功能,备库用于备份主库中的数据,用以在主库发生故障时代替主库提供相应的功能。
[0003] 图1为现有技术中MySQL中的主库将自身的数据备份到备库的过程,具体包括以下步骤:
[0004] S101:主库在对自身的数据进行操作时,生成对应的操作记录并记录在二进制日志(binlog)中。
[0005] 其中,主库对自身的数据的操作包括:更新操作、插入操作、删除操作。
[0006] 例如,主库将自身的数据A更新为数据B时,生成将该数据A更新为数据B的操作记录,并记录在binlog日志中。
[0007] S102:备库创建一个I/O线程,通过该I/O线程读取主库保存的binlog日志。
[0008] S103:备库将读取到的binlog日志转换成中继日志(relay)。
[0009] 其中,主库保存的binlog日志中记录的操作记录,与备库转换的relay日志中记录的操作记录相同,只是binlog日志与relay日志的格式不同。
[0010] 继续沿用上例,由于主库的binlog日志中记录有将数据A更新为数据B的操作记录,因此备库转换的relay日志中也包含将数据A更新为数据B的操作记录。
[0011] S104:备库创建一个SQL线程,通过创建的SQL线程依次读取relay日志中记录的每个操作记录。
[0012] 继续沿用上例,备库读取到的操作记录即为将数据A更新为数据B的操作记录。
[0013] S105:备库根据读取到的操作记录,将该操作记录对应的数据读取到内存中,并根据该操作记录对内存中的该数据进行相应操作。
[0014] 继续沿用上例,由于读取到的操作记录为将数据A更新为数据B的操作记录,因此该操作记录对应的数据即为备库中保存的数据A。备库则将该数据A读取到内存中,再将该操作记录(将数据A更新为数据B的操作记录)解析为相应的执行语句并执行,用以将内存中的该数据A更新为数据B,完成对主库数据的备份。
[0015] 由上述图1所示的过程可以看出,备库在备份主库中的数据时,是通过创建的一个SQL线程依次读取relay日志中的操作记录进行操作的,也即备库是通过一个SQL线程串行的执行relay日志中各操作记录对应的执行语句,实现数据的备份的。而在实际应用中,主库通常是通过多个线程并行的对保存的各数据进行操作的,例如主库可以同时通过几十个线程并行的对相应数量的数据进行操作,而备库在备份这些数据时,只能通过一个线程串行的备份这些数据,这就会导致备库对主库数据的备份速度远远落后于主库对自身保存的数据进行操作的速度。
[0016] 为了提高备库对主库数据进行备份的速度,现有技术中主要有以下三种方法。
[0017] 第一种,对于relay日志中任意两个事务,如果一个事务中包含的操作记录对应的数据在主库中所属的分库,不同于另一个事务中包含的操作记录对应的数据在主库中所属的分库,则备库分别通过两个空闲的线程并行的对这两个事务中包含的操作记录进行处理,以备份主库中这两个事务中包含的操作记录对应的数据。如果一个事务中包含的操作记录对应的数据在主库中所属的分库,与另一个事务中包含的操作记录对应的数据在主库中所属的分库相同,则备库仍然通过一个线程串行的对这两个事务中包含的操作记录进行处理,以备份主库中这些操作记录对应的数据。
[0018] 其中,binlog日志和relay日志均是以事务的形式对操作记录进行记录的,一个事务中包含若干个操作记录,这若干个操作记录一般是用户在进行一个业务操作时,数据库根据这个业务操作对自身保存的数据所要做出的若干个操作所对应的若干个操作记录。并且,在binlog日志和relay日志中,每个事务均具有一个事务开始标记和事务结束标记。
[0019] 例如,某用户有四个账号,分别为账号A、账号B、账号C、账号D,这四个账号中均有10000元,现该用户从账号A向账号B转入1000元,再从账号C向账号D转入1000元,那么主库中的binlog日志和备库中的relay日志则均会记录有两个事务。
[0020] 第一个事务是从账号A向账号B转入1000元的事务,该第一个事务中包含的操作记录即为:将账号A的余额由10000元更新为9000元的操作记录,以及,将账号B的余额由10000元更新为11000元的操作记录,共2个操作记录。第二个事务是从账号C向账号D转入1000元的事务,该第二个事务中包含的操作记录即为:将账号C的余额由10000元更新为9000元的操作记录,以及,将账号D的余额由10000元更新为11000元的操作记录,也是2个操作记录。这两个事务在binlog日志和relay日志中分别具有各自的事务起始标记和事务结束标记,以区分不同事务中包含的操作记录。
[0021] 如果上例中账号A的余额数据和账号B的余额数据属于主库中的分库1,账号C的余额数据和账号D的余额数据属于主库中的分库2,则备库在备份这4个数据时,在预先创建的线程中,选择两个空闲的SQL线程,一个线程用于根据第一个事务中包含的2个操作记录备份账号A的余额数据和账号B的余额数据,另一个线程用于根据第二个事务中包含的2个操作记录备份账号C的余额数据和账号D的余额数据。相反的,如果上例中账号A的余额数据和账号B的余额数据属于主库中的分库1,账号C的余额数据和账号D的余额数据也属于主库中的分库1,则备库仍然通过一个SQL线程串行的对这两个事务中包含的操作记录进行处理,以备份这4个数据。
[0022] 但是,采用第一种方法时,由于主库中的分库的数量往往较少,一般只有2~3个,而第一种方法备库可以采用的并行线程的数量最多就是主库中的分库的数量,因此第一种方法并不能有效的提高备库对主库数据进行备份的速度。
[0023] 第二种,对于relay日志中的任意两个操作记录,如果这两个操作记录对应的数据在主库中所属的数据表不同,则备库分别通过两个空闲的线程并行的对这两个操作记录进行处理。如果这两个操作记录对应的数据在主库中所属的数据表相同,则备库仍然通过一个线程串行的对这两个操作记录进行处理。
[0024] 其中,主库中包含若干个数据表,每个数据表中包含若干个数据。
[0025] 第三种,对于relay日志中任意两个操作记录,如果这两个操作记录对应的数据不同,则备库分别通过两个空闲的线程并行的对这两个操作记录进行处理。如果这两个操作记录对应的数据相同,则备库仍然通过一个线程串行的对这两个操作记录进行处理。
[0026] 可见,第二种方法和第三种方法并不是一个线程处理一个事务中包含的所有操作记录,而是可能通过两个或多个线程分别处理一个事务中包含的操作记录。
[0027] 例如,某用户有三个账号,分别为账号A、账号B、账号C,这三个账号中均有10000元,现该用户从账号A向账号B转入1000元,再从账号A向账号C转入1000元,那么主库中的binlog日志和备库中的relay日志则均会记录有两个事务。
[0028] 第一个事务是从账号A向账号B转入1000元的事务,该第一个事务中包含的操作记录即为:将账号A的余额由10000元更新为9000元的操作记录,以及,将账号B的余额由10000元更新为11000元的操作记录,共2个操作记录。第二个事务是从账号A向账号C转入1000元的事务,该第二个事务中包含的操作记录即为:将账号A的余额由9000元更新为8000元的操作记录,以及,将账号C的余额由10000元更新为11000元的操作记录,也是2个操作记录。
[0029] 按照第二种方法,假设账号A的余额数据、账号B的余额数据、账号C的余额数据在主库中所属的数据表各不相同,则备库在预先创建的线程中,选择三个空闲的SQL线程,一个线程用于串行的处理第一个事务中账号A的余额由10000元更新为9000元的操作记录,以及第二个事务中账号A的余额由9000元更新为8000元的操作记录,另外两个线程分别用于处理第一个事务中账号B的余额由10000元更新为11000元的操作记录,以及,第二个事务中账号C的余额由10000元更新为11000元的操作记录。并且,这三个线程是并行处理各自的操作记录的。
[0030] 按照第三种方法,由于账号A的余额数据、账号B的余额数据、账号C的余额数据各不相同,因此备库在预先创建的线程中,选择三个空闲的SQL线程,一个线程用于串行的处理第一个事务中账号A的余额由10000元更新为9000元的操作记录,以及第二个事务中账号A的余额由9000元更新为8000元的操作记录,另外两个线程分别用于处理第一个事务中账号B的余额由10000元更新为11000元的操作记录,以及,第二个事务中账号C的余额由10000元更新为11000元的操作记录。并且,这三个线程是并行处理各自的操作记录的。
[0031] 然而,采用第二种或第三种方法时,由于备库的一个线程并不处理一个事务中包含的所有操作记录,因此当某个线程出现故障时,备库不能保证对同一事务中包含的所有操作记录进行处理的一致性。
[0032] 如:在上例中,用于备份账号B的余额数据的线程如果出现故障,则会导致处理第一个事务中的操作记录时,将账号A的余额由10000元更新为9000元,但是账号B的余额并未由10000元更新为11000元。显然,对于第一个事务中包含的两个操作记录而言,一个被成功的处理,而另一个未被成功的处理,导致了备库对该第一个事务中包含的两个操作记录处理缺乏一致性,直观的来讲,由账号A转入账号B的1000元丢失了。由于保证对同一事务中包含的所有操作记录处理的一致性是保证数据库正确处理事务的基本要素之一,因此采用第二种方法和第三种方法时,无法保证备库处理事务的准确性。

发明内容

[0033] 本申请实施例提供一种数据备份方法及装置,用以解决现有技术中备库进行数据备份的速度较低,处理事务的准确性较低的问题。
[0034] 本申请实施例提供的一种数据备份方法,包括:
[0035] 备库针对relay日志中记录的待处理事务,确定所述待处理事务中包含的每个操作记录对应的数据的数据标识;并
[0036] 根据确定的每个数据标识,判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,其中,与所述待处理事务冲突的事务为:包含的操作记录对应的数据的数据标识与确定的至少一个数据标识相同的事务;
[0037] 若是,则在设定时间间隔之后,继续判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,并根据判断结果进行相应处理;
[0038] 否则,在预先创建的线程中,选择一个空闲的线程处理所述待处理事务中包含的各操作记录。
[0039] 本申请实施例提供的一种数据备份装置,包括:
[0040] 确定模块,用于针对relay日志中记录的待处理事务,确定所述待处理事务中包含的每个操作记录对应的数据的数据标识;
[0041] 判断模块,用于根据确定的每个数据标识,判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,其中,与所述待处理事务冲突的事务为:包含的操作记录对应的数据的数据标识与确定的至少一个数据标识相同的事务;当判断结果为是时,在设定时间间隔之后,继续判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务;
[0042] 处理模块,用于当所述判断模块的判断结果为否时,在预先创建的线程中,选择一个空闲的线程处理所述待处理事务中包含的各操作记录。
[0043] 本申请实施例提供一种数据备份方法及装置,该方法备库针对relay日志中记录的待处理事务,确定该待处理事务中包含的每个操作记录对应的数据的数据标识,并判断当前正在处理的各事务中,是否存在与该待处理事务冲突的事务,当不存在时,选择一个空闲的线程处理该待处理事务中包含的各操作记录,其中,与该待处理事务冲突的事务为:包含的操作记录对应的数据的数据标识与确定的至少一个数据标识相同的事务。由于上述方法是通过多个线程并行的处理互不冲突的多个事务中包含的操作记录,因此可以有效的提高备库对主库数据进行备份的速度,并且,由于上述方法一个线程处理一个事务中包含的所有操作记录,因此可以保证对同一事务中包含的所有操作记录处理的一致性,从而提高了备库处理事务的准确性。

附图说明

[0044] 图1为现有技术中MySQL中的主库将自身的数据备份到备库的过程;
[0045] 图2为本申请实施例提供的数据备份的过程;
[0046] 图3为本申请实施例提供的数据备份的详细过程;
[0047] 图4为本申请实施例提供的数据备份装置结构示意图。

具体实施方式

[0048] 本申请实施例为了提高备库对主库数据进行备份的速度,采用多个线程并行的处理relay日志中的多个事务中包含的操作记录,并且,为了保证对同一事务中包含的所有操作记录处理的一致性,一个事务中包含的所有操作记录只由一个线程进行处理,使备库在提高备份速度的同时,保证处理事务的准确性。
[0049] 下面结合说明书附图,对本申请实施例进行详细描述。
[0050] 图2为本申请实施例提供的数据备份的过程,具体包括以下步骤:
[0051] S201:备库针对relay日志中记录的待处理事务,确定该待处理事务中包含的每个操作记录对应的数据的数据标识。
[0052] 其中,主库和备库中保存的每个数据都具有一个唯一的数据标识。例如,当一个数据是某个用户的账号余额数据时,则该数据的数据标识可以是该账号、该用户的用户名、该用户的地址、该用户的联系方式等信息中的一种或几种的组合,只要保证该数据的数据标识是唯一的数据标识即可。
[0053] 在本申请实施例中,备库读取主库保存的binlog日志,并转换成relay日志后,将relay日志中记录的当前尚未处理的事务作为待处理事务,针对待处理事务,备库先确定该待处理事务中包含的每个操作记录对应的数据的数据标识。
[0054] S202:根据确定的每个数据的数据标识,判断当前正在处理的各事务中,是否存在与该待处理事务冲突的事务,若是,则执行步骤S203,否则执行步骤S204。
[0055] 其中,与该待处理事务冲突的事务为:包含的操作记录对应的数据的数据标识与该待处理事务中包含的至少一个操作记录对应的数据的数据标识相同的事务。
[0056] 例如,备库当前正在处理事务A和事务B,relay日志中的待处理事务为事务C,则分别通过下述两种情况进行详细描述。
[0057] 情况一、事务A中包含操作记录a1和操作记录a2,操作记录a1对应的数据为数据d1,操作记录a2对应的数据为数据d2;事务B中包含操作记录b1,操作记录b1对应的数据为数据d3;事务C中包含操作记录c1和操作记录c2,操作记录c1对应的数据为数据d1,操作记录c2对应的数据为数据d4。
[0058] 在情况一中,由于待处理事务(事务C)中包含的操作记录c1对应的数据d1,与当前正在处理的事务A中包含的操作记录a1对应的数据d1相同,因此事务C中包含的操作记录c1对应的数据d1的数据标识,与事务A中包含的操作记录a1对应的数据d1的数据标识也相同,从而,备库确定当前正在处理的事务中存在与该待处理事务冲突的事务,与该待处理事务(事务C)冲突的事务即为事务A。
[0059] 情况二、事务A中包含操作记录a1和操作记录a2,操作记录a1对应的数据为数据d1,操作记录a2对应的数据为数据d2;事务B中包含操作记录b1,操作记录b1对应的数据为数据d3;事务C中包含操作记录c1和操作记录c2,操作记录c1对应的数据为数据d5,操作记录c2对应的数据为数据d4。
[0060] 在情况二中,由于备库当前正在处理的事务中包含的操作记录对应的数据(数据d1、数据d2、数据d3)与该待处理事务(事务C)中包含的操作记录对应的数据(数据d5、数据d4)各不相同,因此备库当前正在处理的事务中包含的操作记录对应的数据的数据标识,与事务C中包含的操作记录对应的数据的数据标识也各不相同,从而,备库确定当前正在处理的事务中不存在与该待处理事务冲突的事务。
[0061] S203:等待设定时间间隔之后,返回步骤S202。
[0062] 也即,当备库确定当前正在处理的各事务中存在与待处理事务冲突的事务时,则在等待设定时间间隔之后,继续判断当前正在处理的各事务中是否存在与该待处理事务冲突的事务,并根据判断结果进行相应处理。其中,该设定时间间隔可以根据需要进行设定,例如设定为2秒。
[0063] 以上述情况一为例进行说明,由于备库判断当前正在处理的事务A与待处理事务(事务C)冲突,因此先暂时不处理事务C,等待设定时间间隔之后,再次判断当前正在处理的事务中是否存在与事务C冲突的事务,并根据判断结果进行相应处理。
[0064] S204:在预先创建的线程中,选择一个空闲的线程处理该待处理事务中包含的各操作记录。
[0065] 其中,备库预先创建了若干个线程。当备库确定当前正在处理的各事务中不存在与待处理事务冲突的事务时,则在预先创建的若干个SQL线程中,选择一个空闲的SQL线程,并通过选择的SQL该线程处理该待处理事务中包含的所有操作记录,实现对主库中相应数据的备份。
[0066] 以上述情况二为例进行说明,由于备库判断当前正在处理的各事务中,不存在与待处理事务(事务C)冲突的事务,因此在预先创建的线程中,选择一个空闲的SQL线程处理事务C中包含的所有操作记录(操作记录c1和操作记录c2),也即备库采用三个SQL线程并行的处理事务A、事务B和事务C中包含的操作记录,并且,一个事务中包含的所有操作记录只由一个线程进行处理。
[0067] 由图2所示的过程可见,在本申请实施例中,对于互不冲突的多个事务,备库则分别采用多个线程多个事务进行并行处理,由于relay日志中通常存在数量较多的互不冲突的事务,因此,相比于现有技术的第一种方法(仅对属于不同分库的多个事务进行并行处理的方法),如图2所示的并行处理多个互不冲突的事务的方法,可以有效提高备库进行数据备份的速度。
[0068] 并且,在本申请实施例中。一个事务中包含的所有操作记录只由一个线程进行处理,也可以保证对同一个事务中包含的所有操作记录处理的一致性。也即,对于同一个事务中包含的所有操作记录来讲,或者所有的操作记录全部处理成功,或者所有的操作记录全部处理失败,而不存在一部分操作记录处理成功,另一部分操作记录处理失败的情况。从而,相比于现有技术中第二种方法和第三种方法(将对应的数据不同的多个操作记录进行并行处理的方法),如图2所示的方法保证了备库处理事务的准确性。
[0069] 继续以上例中的情况二为例进行说明,对于事务C中包含的操作记录c1和操作记录c2来讲,备库只通过一个SQL线程处理操作记录c1和操作记录c2,因此可以保证操作记录c1和操作记录c2或者全部处理成功,或者全部处理失败,而不会存在其中一个处理成功,而另一个处理失败的情况,从而保证了备库处理事务C中包含的操作记录的一致性,进而保证了备库处理事务C的准确性。另外,对于冲突的多个事务,则仍然采用串行处理的方法进行处理。
[0070] 在图2所示的步骤S201中,备库确定待处理事务中包含的每个操作记录对应的数据的数据标识的方法具体可以为:针对该待处理事务中包含的每个操作记录,将该操作记录解析为执行语句并执行,当备库在执行该执行语句的过程中提取出数据标识时,停止执行该执行语句,并将提取出的数据标识确定为该操作记录对应的数据的数据标识。
[0071] 也即,备库在确定待处理事务中包含的某个操作记录对应的数据的数据标识时,先将该操作记录解析成执行语句,并通过假执行的方式执行该执行语句,其中,通过假执行的方式执行该执行语句时,只要在执行该执行语句的过程中提取出数据标识,就停止执行该执行语句,此时提取出的数据标识就是该操作记录对应的数据的数据标识。具体的,可以在将该操作记录解析成执行语句之后,将该执行语句中的fake标志位设置为1,当执行该执行语句时,备库识别出该执行语句中的fake标识位为1,则会通过假执行的方式执行该执行语句。
[0072] 在图2所示的步骤S202中,为了提高备库判断当前正在处理的各事务中是否存在与待处理事务冲突的事务的速度,以进一步提高备库进行数据备份的速度,可以通过哈希(hash)查表的方式进行判断。具体的,备库根据确定的待处理事务中包含的每个操作记录对应的数据的数据标识,确定每个数据标识的hash值,判断事务记录表中当前是否记录了确定的至少一个hash值,若是,则确定当前正在处理的各事务中存在与该待处理事务冲突的事务,否则,确定当前正在处理的各事务中不存在与该待处理事务冲突的事务。其中,备库需要预先维护一个事务记录表,该事务记录表中记录了当前正在处理的事务中包含的操作记录对应的数据的数据标识的hash值。
[0073] 也即,如果备库确定事务记录表中当前记录了待处理事务中包含的至少一个操作记录对应的数据的数据标识的hash值,则确定当前正在处理的各事务中存在与该待处理事务冲突的事务,否则,确定当前正在处理的各事务中不存在与该待处理事务冲突的事务。
[0074] 进一步的,当备库采用上述方法判断当前正在处理的各事务中是否存在与待处理事务冲突的事务时,如果确定当前正在处理的各事务中不存在与该待处理事务冲突的事务,则通过选择的空闲SQL线程处理该待处理事务中的所有操作记录的同时,还要将确定的该待处理事务中包含的每个操作记录对应的数据的数据标识的hash值记录在该事务记录表中。
[0075] 相应的,当备库通过选择的线程处理该待处理事务中包含的所有操作记录之后,也要删除事务记录表中记录的该待处理事务中包含的每个操作记录对应的数据的数据标识的hash值。
[0076] 图3为本申请实施例提供的数据备份的详细过程,具体包括以下步骤:
[0077] S301:备库针对relay日志中记录的待处理事务,确定待处理事务中包含的每个操作记录对应的数据的数据标识。
[0078] S302:根据确定的每个数据标识,确定每个数据标识的hash值。
[0079] S303:判断事务记录表中当前是否记录了至少一个确定的hash值,若是,则执行步骤S304,否则执行步骤S305。
[0080] 其中,事务记录表中记录了当前正在处理的事务中包含的操作记录对应的数据的数据标识的hash值。
[0081] S304:在等待设定时间间隔之后,返回步骤S303。
[0082] S305:在预先创建的线程中,选择一个空闲的线程处理该待处理事务中包含的所有操作记录,将确定的该待处理事务中包含的每个操作记录对应的数据的数据标识的hash值记录在事务记录表中。
[0083] S306:通过选择的线程处理该待处理事务中包含的所有操作记录之后,删除事务记录表中记录的该待处理事务中包含的每个操作记录对应的数据的数据标识的hash值。
[0084] 另外,在本申请实施例中,当备库确定当前正在处理的各事务中存在与待处理事务冲突的事务时,也可以进一步确定出当前正在处理的、且与该待处理事务冲突的事务,并在处理与该待处理事务冲突的事务完毕之后,通过一个空闲的线程处理该待处理事务。通过该方法,当备库确定当前正在处理的各事务中存在与待处理事务冲突的事务时,则无需按照设定时间间隔进行重复的多次判断,只需在与待处理事务冲突的事务被处理完毕之后,再通过一个空闲线程处理该待处理事务即可,可以尽量节省处理资源。
[0085] 图4为本申请实施例提供的数据备份装置结构示意图,具体包括:
[0086] 确定模块401,用于针对relay日志中记录的待处理事务,确定所述待处理事务中包含的每个操作记录对应的数据的数据标识;
[0087] 判断模块402,用于根据确定的每个数据标识,判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务,其中,与所述待处理事务冲突的事务为:包含的操作记录对应的数据的数据标识与确定的至少一个数据标识相同的事务;当判断结果为是时,在设定时间间隔之后,继续判断当前正在处理的各事务中,是否存在与所述待处理事务冲突的事务;
[0088] 处理模块403,用于当所述判断模块402的判断结果为否时,在预先创建的线程中,选择一个空闲的线程处理所述待处理事务中包含的各操作记录。
[0089] 所述确定模块401具体用于,针对所述待处理事务中包含的每个操作记录,将该操作记录解析为执行语句并执行,当在执行所述执行语句的过程中提取出数据标识时,停止执行所述执行语句,并将提取出的数据标识确定为该操作记录对应的数据的数据标识。
[0090] 所述判断模块402具体用于,根据确定的每个数据标识,确定每个数据标识的哈希hash值;判断事务记录表中当前是否记录了至少一个确定的hash值,其中,所述事务记录表中记录了当前正在处理的事务中包含的操作记录对应的数据的数据标识的hash值;若是,则确定当前正在处理的各事务中,存在与所述待处理事务冲突的事务;否则,确定当前正在处理的各事务中,不存在与所述待处理事务冲突的事务。
[0091] 所述处理模块403还用于,当所述判断模块402的判断结果为否时,将确定的所述待处理事务中包含的每个操作记录对应的数据的数据标识的hash值记录在所述事务记录表中。
[0092] 所述处理模块403还用于,通过选择的线程处理所述待处理事务中包含的所有操作记录之后,删除所述事务记录表中记录的所述待处理事务中包含的每个操作记录对应的数据的数据标识的hash值。
[0093] 本申请实施例提供一种数据备份方法及装置,该方法备库针对relay日志中记录的待处理事务,确定该待处理事务中包含的每个操作记录对应的数据的数据标识,并判断当前正在处理的各事务中,是否存在与该待处理事务冲突的事务,当不存在时,选择一个空闲的线程处理该待处理事务中包含的各操作记录,其中,与该待处理事务冲突的事务为:包含的操作记录对应的数据的数据标识与确定的至少一个数据标识相同的事务。由于上述方法是通过多个线程并行的处理互不冲突的多个事务中包含的操作记录,因此可以有效的提高备库对主库数据进行备份的速度,并且,由于上述方法一个线程处理一个事务中包含的所有操作记录,因此可以保证对同一事务中包含的所有操作记录处理的一致性,从而提高了备库处理事务的准确性。
[0094] 显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。