背景技术
数据库引擎是用于存储、处理和保护数据的核心服务,它提供了受控访问和快速事务处理,以满足企业内最苛刻的数据消费应用程序的要求。数据库引擎还提供了大量的支持以保持高可用性。
结构化查询语言(Structured Query Language,简称SQL)服务器是典型的数据库引擎之一,由微软公司提供。
事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性,只有这样才能成为一个事务。
原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如双向链表)都必须是正确的。
隔离:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使 出现系统故障也将一直保持。
例如:银行转帐业务,需要首先从A帐户里减去100元,然后再到B帐户里加上100元。如果不将这个过程定义为事务,则可能发生这样的情况:从A帐户里减去100元,操作成功;再在B帐户里加上100元,突然停电,操作不成功;恢复供电后会发现A帐户里少了100元,但B帐户里没有多出100元,业务就出错了。
如果将这个过程定义为事务,由于事务具有原子性,从B帐户里加钱失败后,前面的操作即从A帐户里减去100元也会被取消。最后结果是转帐不成功,但A帐户并没有损失。
数据库复制是在数据库之间对数据和数据库对象进行复制和分发,然后在数据库之间进行同步以保持一致性的一组技术。使用复制可以将数据通过局域网、广域网、拨号连接、无线连接和因特网(Internet)分发到不同位置以及分发给远程用户或移动用户。
例如:某网站在中国和美国都设有数据库服务器,中国的数据库服务器主要管理来自中国的数据,美国的数据库服务器主要管理来自美国的数据。由于是同一个网站,需要做到资源共享,往往可以选择使用数据库复制技术,以达到保持数据库一致性的目的。
数据库复制技术会涉及以下几种服务器:
发布服务器:数据库复制拓扑里数据的主要来源。在一个复制模型里,发布服务器只能有一台。
分发服务器:发布服务器将要发布的数据告诉分发服务器,由分发服务器负责将这些要发布的数据分发给各订阅服务器。在一个复制模型里,分发服务器只能有一台。
订阅服务器:数据库复制拓扑里数据传输的主要接收点。订阅服务器接受来自分发服务器的数据,以达到与发布服务器的数据保持同步的目的。在一个复制模型里,分发服务器可以有多台。
微软的SQL服务器提供了三种复制类型,分别为:快照复制、事务性复制和合并复制,每种复制类型都适合于不同应用程序的要求。
其中,事务性复制又分为:普通事务性复制、对等事务性复制和可更新订阅的事务性复制。可更新订阅的事务性复制中,订阅的更新方式有两种:立即更新和排队更新。本发明适用于使用排队更新模式的可更新订阅的事务性复制。
下面是可更新订阅的事务性复制的原理概述:
通常的数据库复制都是单向的,即只有发布服务器向订阅服务器传递数据库,订阅服务器不产生数据。然而实际应用环境中,往往需要参与服务器的多台数据库服务器都有更新,且可以互相同步数据库。使用可更新订阅的事务性复制可以满足上述需求。使用可更新订阅的事务性复制时,不仅发布服务器可以将数据修改以事务的形式传递给订阅服务器,订阅服务器也同样能够将自身数据的修改同步到发布服务器。
订阅服务器进行数据同步的过程如下:
订阅服务器上所做的数据更新以事务的形式由订阅服务器存放到订阅服务器上一个队列表里。
分发服务器上的队列读取器代理从订阅服务器的队列表中读取订阅服务器上的数据更新,然后使用复制存储过程将排队事务提交给发布服务器。存储过程是一种使用SQL语言写成的程序,通常用于对数据库的各个对象进行操作。
处理排队事务时,发布服务器在存在冲突的情况下根据创建发布时设置的冲突解决策略检测和解决冲突。
发布服务器在完成订阅服务器上数据更新的同步之后,会将这些数据更新发布给其他的订阅服务器,原理和发布自身的数据更新一致:先将这些更新转化成事务日志,委托分发服务器传递给各个订阅服务器,包括产生此数据更新的订阅服务器。事务目志是发布服务器上的数据更新记录。
目前的订阅服务器数据同步进行如下操作:
例如某网站的数据库里有一张数据表ONLINE_USER,用于记录当前时间登录该网站的用户的一些在线数据,如用户的上线时间、IP地址等。
当用户A登录该网站后,网站后台程序就往数据表ONLINE_USER添加一条记录,记录当前有用户A登录该网站,并记录上线时间和IP地址。
当用户A注销时,网站后台程序就会删除数据表ONLINE_USER中用户A的相关数据记录。
如果用户A登录时,ONLINE_USER表中已经存在用户A的记录,则更新上线时间为本次上线的时间。
用户在访问此网站的任何页面时,网站后台程序都要查询此数据表,以确定此用户没有离开,且没有使用其他的IP地址访问。如果用户访问此网站的某页面时,后台程序检测到ONLINE_USER表中已经没有此用户的相关数据记录了,说明这个用户已经下线,则会拒绝这个用户访问网站。
正常的数据同步过程如下:
1、用户A通过订阅服务器B登录网站,订阅服务器B的数据库中的数据表ONLINE_USER上添加此用户A的相关数据记录。
2、订阅服务器B上的数据更新通过队列读取器代理传递给了发布服务器C。
3、发布服务器C完成订阅服务器B发送的数据更新的同步后,会将此数据更新发布给所有的订阅服务器。
订阅服务器在接收到发布服务器C发来的数据更新时,会判断是否已经存在相应数据的记录,如果存在,就不添加,否则就添加。这样可以避免在订阅服务器上添加重复的记录。
下述的数据同步过程则会出现错误情况:
1、用户A登录网站。订阅服务器B的数据库中的数据表ONLINE_USER上会添加此用户A的相关数据记录。
2、订阅服务器B上的数据更新通过队列读取器代理传递给了发布服务器C。
3、发布服务器C完成订阅服务器发送的数据更新的同步后,需要将此数据更新发布给所有的订阅服务器。由于发布服务器C上还有许多之前其他的数据更新需要发布给订阅服务器,因此,发布服务器从订阅服务器B获取的数据更新会排队等待进行数据更新的分发。
4、此时用户A进行了注销操作,订阅服务器B上的ONLINE_USER表会删除用户A的相关数据记录:
5、经过一段时间的等待后,发布服务器C将“添加用户A的在线纪录”的这一数据更新发布到所有订阅服务器上:
由上述过程可以看出,第5步的数据更新出现了错误:用户A已经下线,却仍然在所有的订阅服务器上添加了A用户的在线记录,特别是在订阅服务器上B添加了已经不存在的数据。尽管在发布服务器收到订阅服务器B的删除用户A的操作之后,也会将这个更新再发布给所有的订阅服务器,最终发布服务器和订阅服务器上都没有用户A的相关数据记录,数据状态趋于正常;但是在此之前的这段时间内,数据状态一直是不正确的,特别是存在大量需要复制的数据时(例如:计费运营系统在用户集团上下线、系统管理员在界面上做批量操作等),会造成数据库复制性能降低,也就会扩大数据状态不正常的时间,这段时间通常可以达到5分钟以上,此时由于数据状态不正确而引发错误的业务逻辑的可能性就比较大。
上述错误情况往往会造成诸多业务问题,例如:
1、用户每天登录次数的统计可能会出错,例如上述例子中,订阅服务器B上用户A的上线记录被添加了两次。
2、如果用户再次登录该网站,后台程序会发现ONLINE_USER表中已经有了这条记录,则会更新用户的登录时间;然而随后,由于排队等待而延迟发布的“删除用户A的在线记录”的数据更新后会发布给所有的订阅服务器,订阅服务器会删除这条记录:
由于订阅服务器上已经没有用户A的在线用户记录,而A用户其实才刚刚登录过的,会引发许多业务问题,例如:当用户A访问任何页面时,由于后台程序已经找不到A用户的在线用户记录了,所以会拒绝用户A访问网站。
具体实施方式
本发明提供了一种数据库复制方法,图1给出了本发明一种数据库复制方法实施例一示意图,所述方法包括以下步骤:
步骤S1,将本节点删除的数据库中的删除数据记录的数据记录信息保存 在临时保存表中;
所述本节点可以为订阅服务器,在订阅服务器的数据库中可以添加一张或几张数据表,即临时保存表,订阅服务器删除本机数据库中的数据后,可以将删除的数据记录的相关信息存储在临时保存表中。
临时保存表的设计可以是多种多样的,只要能够存放唯一表示某条已经删除数据记录的数据记录信息即可,所述数据记录信息可以包括数据记录的原始表名和主键,也可以包括数据记录的部分表项,还可以包括数据记录的全部表项。原始表名就是数据记录所在数据库中数据表的表名,主键即主关键字(primary key),是被挑选出来,唯一标识数据表的一行的候选关键字。一个数据表只有一个主关键字。主键可以根据订阅服务器的IP地址生成,例如可以为订阅服务器的IP地址+订阅服务器的介质访问控制(Media AcceTControl,简称MAC)地址+记录生成时间+随机值;也可以为顺序编号,如1、2、3、4、......自增序列。
临时保存表的设计可以是整个应用程序的数据库共用一张表,也可以是对每一张数据库需要复制的表都生成一张对应的临时保存表。
步骤S2,接收分发节点发来的分发数据记录和相应数据库操作;所述数据库操作可以包括:数据添加操作和数据删除操作。所述分发节点可以为分发服务器。某个订阅服务器进行的数据添加操作和数据删除操作,以及相应的数据记录,会通过分发服务器同步到发布服务器,发布服务器会将所述数据添加操作和数据删除操作以及相应的数据记录,通过分发服务器复制到所有的订阅服务器,因此每个订阅服务器都会接收到分发服务器发来的分发数据记录和相应数据库操作。
步骤S3,根据临时保存表中的数据记录信息判断所述分发数据记录是否为本节点删除的删除数据记录,如果是则不执行所述数据库操作,否则执行所述数据库操作。
由于数据记录信息可以唯一表示某条已经删除的数据记录,因此在接收 到分发数据记录时,可以根据临时保存表中的数据记录信息判断所述分发数据记录是否为本节点删除的删除数据记录,只有在收到的分发数据记录不是本节点删除的删除数据记录时,才会去执行数据库操作,避免了产生数据库操作的源节点在收到分发节点发来的数据库操作时,重复地执行数据库操作,从而导致源节点数据库中的数据与实际数据不一致的问题。
图2给出了本发明一种数据库复制方法实施例二示意图,本实施例在方法实施例一的基础上进行了扩展,所述数据记录信息包括:删除数据记录的原始表名和主键;
所述步骤S3具体可以分为:
步骤S311,从分发数据记录中提取分发数据记录的原始表名和主键;
步骤S312,以所述分发数据记录的原始表名和主键为索引在临时保存表中查询,如果查询到则不执行所述数据库操作,否则执行所述数据库操作。
例如主键可以根据订阅服务器的IP地址生成,例如可以为订阅服务器的IP地址+订阅服务器的MAC地址+记录生成时间+随机值,这种情况下主键可以唯一表示某个数据表中已经删除的数据记录。
由于删除数据记录的原始表名和主键可以唯一表示某条已经删除的数据记录,因此在接收到分发数据记录时,可以根据分发数据记录的原始表名和主键查找临时保存表,如果查找到,则说明收到的分发数据记录是本节点删除的删除数据记录,此时不执行数据库操作,只有在没有查找到时,即收到的分发数据记录不是本节点删除的删除数据记录时,才会去执行数据库操作,避免了产生数据库操作的源节点在收到分发节点发来的数据库操作时,重复地执行数据库操作,从而导致源节点数据库中的数据与实际数据不一致的问题。
图3给出了本发明一种数据库复制方法实施例三示意图,本实施例在方法实施例一的基础上进行了扩展,所述数据记录信息包括:删除数据记录的原始表名、主键和创建时间;
所述步骤S3具体可以分为:
步骤S321,从分发数据记录中提取分发数据记录的原始表名、主键和创建时间;
步骤S322,以所述分发数据记录的原始表名、主键和创建时间为索引在临时保存表中查询,如果查询到则不执行所述数据库操作,否则执行所述数据库操作。
例如主键可以为顺序编号,如1、2、3、4、......自增序列,这种情况下一般来说数据删除后添加数据表项时会使用自增序列的后续值作为主键,但不排除一些系统会在添加数据表项时使用之前被删除数据的主键,此时主键可能不能唯一表示某个数据表中已经删除的数据记录,因此可以使用主键和创建时间共同唯一表示某个数据表中已经删除的数据记录。
由于删除数据记录的原始表名、主键和创建时间可以唯一表示某条已经删除的数据记录,因此在接收到分发数据记录时,可以根据分发数据记录的原始表名、主键和创建时间查找临时保存表,如果查找到,则说明收到的分发数据记录是本节点删除的删除数据记录,此时不执行数据库操作,只有在没有查找到时,即收到的分发数据记录不是本节点删除的删除数据记录时,才会去执行数据库操作,避免了产生数据库操作的源节点在收到分发节点发来的数据库操作时,重复地执行数据库操作,从而导致源节点数据库中的数据与实际数据不一致的问题。
图4给出了本发明一种数据库复制方法实施例四示意图,本实施例在方法实施例一的基础上进行了扩展,所述数据记录信息为删除数据记录的全部表项信息;
所述步骤S3具体可以为:
步骤S331,以分发数据记录的全部表项信息为索引在临时保存表中查询,如果查询到则不执行所述数据库操作,否则执行所述数据库操作。
由于删除数据记录的全部表项信息可以唯一表示某条已经删除的数据记 录,因此在接收到分发数据记录时,可以根据分发数据记录的全部表项信息查找临时保存表,如果查找到,则说明收到的分发数据记录是本节点删除的删除数据记录,此时不执行数据库操作,只有在没有查找到时,即收到的分发数据记录不是本节点删除的删除数据记录时,才会去执行数据库操作,避免了产生数据库操作的源节点在收到分发节点发来的数据库操作时,重复地执行数据库操作,从而导致源节点数据库中的数据与实际数据不一致的问题。
图5给出了本发明一种数据库复制方法实施例五示意图,本实施例在方法实施例一的基础上进行了扩展,所述数据记录信息包括所述删除数据记录的数据清除时间;
所述方法还包括步骤S4:根据所述数据清除时间来清除临时保存表中的数据记录信息。
通过在临时保存表中为删除数据记录设定数据清除时间,并根据数据清除时间来清除临时保存表的数据记录信息,使得临时保存表中的数据记录信息不会过多而占用存储空间,防止临时保存表过大影响系统正常工作。
本实施例除了可以在方法实施例一的基础上进行上述扩展外,还可以在方法实施例二、方法实施例三或方法实施例四的基础上进行上述扩展。
下面通过本发明一较优实施例对发明方案进行进一步的说明。
本发明可以按照如下步骤完成基于排队更新的可更新订阅事务复制功能:
1、数据库复制的配置按照标准的基于排队更新的可更新订阅事务复制的手册来配置。
2、在订阅服务器的数据库中可以添加一张或几张数据表,即临时保存表,订阅服务器删除数据本机数据库中的数据后,可以将删除的数据记录的相关信息存储在临时保存表中。
临时保存表的设计可以是多种多样的,只要能够存放唯一表示某条已经删除数据记录的数据记录信息即可,所述数据记录信息可以包括数据记录的 原始表名和主键,也可以包括数据记录的部分表项,还可以包括数据记录的全部表项。
临时保存表的设计可以是整个应用程序的数据库共用一张表,也可以是对每一张数据库需要复制的表都生成一张对应的临时保存表。
下面举例说明:
方法一,假定数据库复制表的记录里的主键是唯一的,则可以按照如下的方式设计临时保存表,为了便于描述将临时保存表命名为HAS_DELETED。
临时数据表HAS_DELETED里有两个关键的字段:原始表名TABLE_NAME和主键ROW_UUID,这两个字段可以唯一确定一条数据记录。
方法二,使用原始表名TABLE_NAME、主键ROW_UUID和创建时间CREATE_TIME唯一表示被删除的数据记录:
方法三,使用数据记录的全部表项信息表示被删除的数据记录:
3、订阅服务器在接收到分发服务器发来的数据库操作时,判断是否应 该将所述数据库操作应用到本订阅服务器。
例如订阅服务器产生的数据删除操作,会通过分发服务器传递给每一台订阅服务器,包括产生此数据删除操作的原始订阅服务器,这样就会产生背景技术中提到的问题。因此,只要订阅服务器仅接受其它节点产生的数据删除操作,但不重复应用本机产生而又被分发服务器分发回来的数据删除操作,就不会存在背景技术中的问题。
订阅服务器首先会收到分发服务器发来的数据记录和相应的数据删除操作,从中取出数据记录的原始表名和主键,然后在本订阅服务器上的临时保存表HAS_DELETED中以原始表名和主键为索引,查询是否存在相应的数据记录,如果存在,则说明这条数据记录是在此之前由本订阅服务器删除,它再次被分发服务器传回来,于是不将此数据库删除操作再次应用到本订阅服务器;如果不存在,说明此数据库删除操作不是本订阅服务器产生的,而是其它节点产生的,于是会将此数据库删除操作应用到本订阅服务器。
4、根据系统的需要,可以定期清除HAS_DELETED表中的数据,例如:可以在将删除的数据记录的相关信息保存到HAS_DELETED表时,设定该表项的数据清除时间DELETED_TIME为当前时间加上一周,通过数据库系统的定期检测删除,HAS_DELETED表中存放的数据在一周后将会自动删除。
本发明还提供了一种数据库复制装置,图6给出了本发明一种数据库复制装置实施例一示意图,所述装置包括:记录保存模块M1、临时保存表M2、数据接收模块M3和操作选择模块M4,
所述记录保存模块M1用于将本节点删除的数据库中的删除数据记录的数据记录信息保存在临时保存表中;
所述临时保存表M2与记录保存模块M1连接,用于存储本节点删除的数据库中的删除数据记录的数据记录信息;
所述数据接收模块M3用于接收分发节点发来的分发数据记录和相应数据库操作;
所述操作选择模块M4与临时保存表M2与数据接收模块M3连接,用于根据临时保存表中的数据记录信息判断所述分发数据记录是否为本节点删除的删除数据记录,如果是则不执行所述数据库操作,否则执行所述数据库操作。
操作选择模块的实现,包括但不限于下面的方法:
1、修改用于接收分发数据记录的订阅服务器上的复制存储过程。
2、使用报文拦截等方式,将分发数据记录的报文截获,并判断是否应该将所述分发数据记录的报文转发给订阅服务器的数据库。
所述操作选择模块具体可以用于以分发数据记录的全部表项信息为索引在临时保存表中查询,如果查询到则不执行所述数据库操作,否则执行所述数据库操作;此时所述数据记录信息为删除数据记录的全部表项信息。
所述数据库复制装置可以位于订阅服务器上。
图7为本发明一种数据库复制装置实施例二示意图,本实施例除了包括装置实施例一的结构特征外,所述操作选择模块M4具体包括信息提取单元M41和查询选择单元M42;
所述数据记录信息可以包括:删除数据记录的原始表名和主键;
所述信息提取单元M41用于从分发数据记录中提取分发数据记录的原始表名和主键;
所述查询选择单元M42与信息提取单元M41连接,用于以所述分发数据记录的原始表名和主键为索引在临时保存表中查询,如果查询到则不执行所述数据库操作,否则执行所述数据库操作。
所述数据记录信息也可以包括:删除数据记录的原始表名、主键和创建时间;
所述信息提取单元M41还可以用于从分发数据记录中提取分发数据记录的原始表名、主键和创建时间;
所述查询选择单元M42还可以用于以所述分发数据记录的原始表名、主键和创建时间为索引在临时保存表中查询,如果查询到则不执行所述数据库 操作,否则执行所述数据库操作;
图8为本发明一种数据库复制装置实施例三示意图,本实施例除了包括装置实施例一的结构特征外,所述数据库复制装置还包括数据清除模块M5;
所述数据记录信息包括所述删除数据记录的数据清除时间;
所述数据清除模块M5与临时保存表M2连接,用于根据所述数据清除时间来清除临时保存表中的数据记录信息。
本实施例除了可以在装置实施例一的基础上进行上述扩展外,还可以在装置实施例二的基础上进行上述扩展。
本发明通过根据临时保存表中的数据记录信息选择性地执行接收到的数据库操作,避免了产生数据库操作的源节点在收到分发节点发来的数据库操作时,重复地执行数据库操作,从而导致源节点数据库中的数据与实际数据不一致的问题。
本发明改进了现有的基于排队更新的可更新订阅事务性复制,解决了在订阅服务器上频繁添加删除数据时,可能引发的重大数据逻辑同步错误的问题,从而提高了可更新订阅的事务性复制方法的可用性,提高产品的客户满意度。
本发明不需要改变原数据库复制的总体架构,降低了解决问题的架构成本;本发明不需要改变原始应用程序的业务逻辑,降低了解决问题的开发成本。
本发明又提供了另一种数据库复制方法,图9给出了本发明一种数据库复制方法实施例六示意图,所述方法包括以下步骤:
步骤T1,获取需要分发的分发数据记录和相应数据库操作;
所述数据库操作可以是数据添加操作和数据删除操作。
步骤T2,选择需要进行分发的目的节点;
步骤T3,判断所述目的节点是否为产生所述分发数据记录和相应数据库操作的源节点,如果是则不分发所述分发数据记录和相应数据库操作,否则 分发所述分发数据记录和相应数据库操作。所述判断所述目的节点是否为产生所述分发数据记录和相应数据库操作的源节点具体可以为:根据节点标记判断所述目的节点是否为产生所述分发数据记录和相应数据库操作的源节点;所述节点标记用于唯一标记所述节点。即如果目的节点的节点标记与产生所述分发数据记录和相应数据库操作的源节点的节点标记相同,则判断所述目的节点为产生所述分发数据记录和相应数据库操作的源节点,否则判断为否。所述节点标记可以为节点的名称、节点的IP地址,或者其他能够唯一标记节点的属性等。
所述目的节点可以为订阅服务器,所述源节点可以为发布服务器或订阅服务器。例如可以由发布服务器对数据库中的数据记录进行操作,形成分发数据记录和相应数据库操作,再由发布服务器将分发数据记录和相应数据库操作发布到所有的订阅服务器上;也可以由某个源订阅服务器对数据库中的数据记录进行操作,形成分发数据记录和相应数据库操作,再通过发布服务器将分发数据记录和相应数据库操作发布到除所述源订阅服务器的其它订阅服务器上。
图10给出了本发明一种数据库复制方法实施例七示意图,本实施例除了包括方法实施例六的步骤外,还包括:
步骤T4,在所述分发数据记录和相应数据库操作中添加产生所述分发数据记录和相应数据库操作的源节点的节点标记。例如所述分发数据记录和相应数据库操作可以为:由发布服务器或订阅服务器对数据库中的数据表进行数据添加操作或数据删除操作,这些数据表需要在订阅服务器和发布服务器之间进行同步更新。可以在这些需要同步更新的数据表中添加产生数据添加操作和数据删除操作的源节点的节点标记,并在分发数据记录和相应数据库操作中携带所述节点标记。节点标记可以是节点的名称、节点的IP地址,或者其他能够唯一标记节点的属性等,如果数据库表项中已经包含所述节点标记,则可以不用添加节点标记。
图11给出了本发明一种数据库复制方法实施例八示意图,本实施例除了包括方法实施例六的步骤外,还包括:
步骤T5,判断是否存在需要分发的目的节点,如果是则执行步骤T2,否则结束操作。即判断是否仍有未被分发的目的节点,如果有,则继续执行数据更新分发的操作。
本实施例除了可以在方法实施例六的基础上进行上述扩展,也可以在方法实施例七的基础上进行上述扩展。
图12给出了本发明一种数据库复制方法实施例九示意图,本实施例为本发明的较优实施例。
数据库复制的配置按照标准的基于排队更新的可更新订阅事务性复制的手册来配置。
为数据库中每一个需要进行同步更新的数据表添加一个数据列,该列用于节点标记,表示对数据表的添加或删除操作是由某个节点产生的,例如是由发布服务器或者某台订阅服务器产生的。节点标记可以是节点的名称、节点的IP地址,或者其他能够唯一标记节点的属性等。本实施例以节点的IP地址作为节点标记为例进行描述。
具体步骤如下:
步骤101,从发布服务器上获取需要分发的分发数据记录和相应数据库操作;
步骤102,从数据表中获取产生所述分发数据记录和相应数据库操作的源节点的IP地址IP_A,即源订阅服务器的IP地址,或发布服务器的IP地址;
步骤103,选择需要进行分发的目的订阅服务器,并获取目的订阅服务器的IP地址IP_B;
步骤104,判断IP_A与IP_B是否相同,如果是则执行步骤106,否则执行步骤105;
步骤105,向所述目的订阅服务器分发所述分发数据记录和相应数据库操作;
步骤106,判断是否存在需要分发的目的订阅服务器,如果是则执行步骤103,否则执行步骤107;
步骤107,结束操作。
根据本发明的方法,发布服务器在根据来自源订阅服务器A的分发数据记录和相应数据库操作进行数据更新后,只将分发数据记录和相应数据库操作发布给除了源订阅服务器A的其它订阅服务器,而不是发给所有的订阅服务器。由于不会将来自源订阅服务器A的分发数据记录和相应数据库操作回传给A,源订阅服务器A上就不会出现背景技术所述的错误情况,例如在用户下线时错误地添加用户的上线记录,或者在用户在线时错误地删除用户的在线记录。
本发明还提供了一种数据库复制装置,图13给出了本发明一种数据库复制装置实施例四示意图,所述装置包括:分发数据获取模块N1和分发选择模块N2,
所述分发数据获取模块N1用于获取需要分发的分发数据记录和相应数据库操作,并发送给分发选择模块N2;
所述分发选择模块N2与分发数据获取模块N1连接,用于选择需要进行分发的目的节点,并判断所述目的节点是否为产生所述分发数据记录和相应数据库操作的源节点,如果是则不分发所述分发数据记录和相应数据库操作,否则分发所述分发数据记录和相应数据库操作。
例如,分发选择模块N2首先会从分发数据获取模块N1收到需要分发的分发数据记录和相应数据库操作,如从进行了数据添加或删除操作的数据表中获取相应的数据记录和相应的数据库操作,从数据表中取出产生此数据库操作的源节点的节点标记,如节点IP地址IP_A,所述源节点可以为源订阅服务器或发布服务器。在向每一台目的订阅服务器分发数据之前,判断所述 目的订阅服务器的IP地址IP_B是否与IP_A是否相同。如果相同,则不向所述目的订阅服务器分发所述分发数据记录和相应数据库操作;如果不相同,则向所述目的订阅服务器分发所述分发数据记录和相应数据库操作。
图14为本发明一种数据库复制装置实施例五示意图,本实施例除了包括装置实施例四的结构特征外,还包括:节点标记添加模块N3,与分发选择模块N2连接,用于在所述分发数据记录和相应数据库操作中添加产生所述分发数据记录和相应数据库操作的源节点的节点标记,并将所述节点标记告知分发选择模块N2。
图15为本发明一种数据库复制装置实施例六示意图,本实施例除了包括装置实施例四的结构特征外,还包括:节点判断模块N4,与分发选择模块N2连接,用于判断是否存在需要分发的目的节点,如果是则调用分发选择模块N2,否则结束操作。
本实施例除了可以在装置实施例四的基础上进行上述扩展外,也可以在装置实施例五的基础上进行上述扩展。
所述分发选择模块N2可以位于发布服务器上。当发布服务器需要发布分发数据记录和相应数据库操作时,先由分发选择模块进行检测,判断这些需要发布的分发数据记录和相应数据库操作的来源:如果来源是发布服务器,则分发给所有的订阅服务器;如果来源是订阅服务器A,则仅分发给除了订阅服务器A之外的其他订阅服务器。这样就避免了产生数据库操作的源订阅服务器重复地执行数据库操作,从而导致源订阅服务器上的数据与实际数据不一致的问题。
所述分发选择模块N2也可以位于订阅服务器上。当订阅服务器收到发布服务器分发的分发数据记录和相应数据库操作后,先由分发选择模块进行检测,判断这些需要发布的分发数据记录和相应数据库操作的来源:如果来源不是本订阅服务器,则会将所述分发数据记录和相应数据库操作发送给本订阅服务器以完成数据同步;如果来源是本订阅服务器,则会拒绝将所述分发 数据记录和相应数据库操作发送给本订阅服务器。因此可以避免产生数据库操作的源订阅服务器重复地执行数据库操作,从而导致源订阅服务器上的数据与实际数据不一致的问题。
实际的分发选择模块的实现,包括但不限于下面的方法:
1、修改用于分发所述分发数据记录和相应数据库操作的发布服务器上的复制存储过程,即分发选择模块部署在发布服务器上。
2、修改用于接受分发数据记录和相应数据库操作的订阅服务器上的复制存储过程,即分发选择模块部署在订阅服务器上。
例如,要订阅的某个表结构为:
数据表USER用于存储用户信息,其中USER_ID表示用户的标识符,USER_NAME表示用户名。
按照本发明的方法,需要在数据表增加一个表项CREATE_HOST,用于标记分发数据记录和相应数据库操作是由哪个节点产生的,例如由发布服务器或某台订阅服务器产生,所述数据库操作可以为数据添加操作和数据删除操作等。例如表项CREATE_HOST中用于存储节点的IP地址。上述数据表USER的结构如下:
当配置好订阅服务器后,订阅服务器上会对每一个要订阅的数据表生成一个存储过程。这个存储过程是由SQL服务器的复制配置功能自动生成的。这里存储过程的功能是:当订阅服务器接收到发布服务器发布的在数据表USER上新增数据行时,如果本订阅服务器上已经有了相同的数据行,则不去添加;如果本订阅服务器上没有相同的数据行,则进行 添加,以便能和发布服务器保持同步。
上述操作在正常情况下没有问题,但是在订阅服务器上添加某行数据,随后快速删除此行数据时,就有可能出现产生数据库操作的源订阅服务器重复地同步数据库操作,从而导致源订阅服务器上的数据与实际数据不一致的问题。这种问题通常会带来业务上错误。
例如,数据表USER本来有9999条记录,也就是9999个用户。如果管理员在本订阅服务器的此表上添加了一个用户test,随后很快将此用户删除。
于是添加test用户的操作和删除test用户的操作先后同步到发布服务器上,发布服务器上添加了test用户,然后将这一操作发布给所有的订阅服务器。产生数据库操作的源订阅服务器此时已经没有test用户的相关数据了,但在收到发布服务器发布的分发数据记录和相应数据库操作后,根据上述存储过程的逻辑判断,会再次将test用户添加到数据表USER中,由于实际上只存在9999个用户,而源订阅服务器上却显示有10000个用户,因此影响了数据统计的正确性。
如果管理员没有注意到这个问题,为所有用户充值10元,则用户账务数目也不正确。
这里只给出了一些简单的业务逻辑问题,如果将数据表USER与其他数据表进行关联,则会产生更多的逻辑问题。
本发明可以将上述存储过程增加以下操作:
如果产生数据库操作的源节点的IP地址就是本订阅服务器的IP地址,则不会在本订阅服务器上进行相应的数据库操作。
上述存储过程的功能是,当订阅服务器接收到发布服务器发布的在数据表USER上新增数据行时,如果本订阅服务器上已经有了相同的数据行,则不去添加;如果本订阅服务器上没有相同的数据行,判断产生该行数据的源节点的IP地址是否为本订阅服务器的IP地址,如果是则不 去添加;如果不是,说明此行数据是由发布服务器或者其他订阅服务器产生的,需要在本订阅服务器上进行添加,以便同步数据。
本发明通过判断需要进行分发的目的节点是否为产生数据库操作的源节点,避免了产生数据库操作的源节点重复地执行数据库操作,从而导致源节点上的数据与实际数据不一致的问题。
本发明改进了现有的基于排队更新的可更新订阅事务性复制,解决了在订阅服务器上频繁添加删除数据时,可能引发的重大数据逻辑同步错误的问题,从而提高了可更新订阅的事务性复制方法的可用性,提高产品的客户满意度。
本发明不需要改变原数据库复制的总体架构,降低了解决问题的架构成本;本发明不需要改变原始应用程序的业务逻辑,降低了解决问题的开发成本。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。