本发明涉及数据同步与备份技术领域,具体地说是一种sqlserver增量同步的实现方法。
背景技术:
随着现代信息科技的快速发展,人类社会步入互联网和大数据时代。信息正深刻改变着人们的思维、生产和生活方式,与各行各业深度融合,产生了巨大的社会和商业价值。人工智能技术突飞猛进、5g快速发展等,正是信息科技的长期发展的结果。作为信息的重要组成部分,数据也显得越来越重要。信息数据的复杂性、网络环境的不确定性、设备的不稳定性、人为误操作等都会给数据带来了不小的安全隐患,因此数据同步和备份显得极为重要。
技术实现要素:
本发明的技术任务是针对以上不足之处,提供一种sqlserver增量同步的实现方法,能够实现sqlserver数据库的增量数据的提取,有效避免生产数据库卡死崩溃,提高实时性,改善用户体验。
本发明解决其技术问题所采用的技术方案是:
一种sqlserver增量同步的实现方法,该方法迭代查询fn_dblog,每次迭代获取一部分增量数据,逐步前移,基于日志序列号lsn过滤筛选出增量信息,进而得到全部增量数据;
结合cmsp传输增量数据,实现sqlserver数据库增量数据实时同步。
本方法基于迭代查询fn_dblog获取sqlserver增量操作,结合cmsp传输,实现增量数据同步,sqlserver提供了事务日志函数解析日志功能,对数据库的增量操作都会被记录在日志中,通过查询调用事务日志函数解析日志,可以获取到对数据库的增量操作。
事务日志函数fn_dblog是sqlserver数据库提供的非公开的系统函数,通过其可以获取到增量数据信息;
cmsp是云和大数据时代的一种高性能消息中间件,以云服务和集群方式对外提供高性能和高可靠的消息队列服务,支撑大数据采集、传输、汇聚、交换,大数据实时处理和微服务处理架构;
基于迭代查询fn_dblog解析日志,逐步获取增量数据,再结合cmsp高效传输,实现sqlserver增量同步功能。
优选的,fn_dblog函数包括参数startinglsn和endinglsn,对所述startinglsn和endinglsn赋上初值,进行迭代查询。
fn_dblog函数形式为fn_dblog(@startinglsn,@endinglsn),其中该函数的两个参数分别表示起始的lsn和结束的lsn。默认情况下,可以使用空值,如果将@startinglsn设置为空,则表示从首日志记录开始查询,如果@endinglsn为空值,则表示一直查询到日志的尾记录为止。
进一步的,对于参数startinglsn的设定,首次迭代时,startinglsn的设定包括:
人工设定;
通过selecttop1[currentlsn]fromfn_dblog(null,null)获取;
查询系统表msdb..backupset获取;
后续迭代过程中,以上一次迭代的最大lsn作为本次迭代的开始lsn。
进一步的,对于参数endinglsn的设定,依据参数startinglsn设置,
lsn由fseqno、sectorno、slotno组成,则依据fseqno、sectorno、slotno设置迭代的步长。
lsn结构组成为fseqno:sectorno:slotno。其中fseqno是虚拟日志文件(vlf)的序列号,长度为4个字节;sectorno是vlf中扇区的序号,长度也为4个字节;slotno是日志所在扇区的序号,长度为2个字节。
如每次迭代跨多个虚拟日志文件,则在startinglsn的基础上,其fseqno加上若干整数。例如若startinglsn为000009c8:00015160:0001,跨越两个日志虚拟日志文件后,endinglsn可以设为000009ca:00015160:0001;也可以依据sectorno跨越多个扇区,甚至可以通过修改slotno获取;
设置的步长不同,则每次迭代查询的增量记录不同,通常步长越大,每次迭代查取的日志记录越多。
进一步的,迭代需要条件退出,否则会造成死循环,无法使用,迭代查询的退出条件为:
当该次迭代查询时,startinglsn与本次查询获取的最大[currentlsn]一致时,便增大步长,当步长达到设定的阈值仍满足startinglsn与最大的[currentlsn]一致条件时,查询退出。
如阈值为4,startinglsn为000009c8:00015160:0001,endinglsn为000009c9:00015160:0001,其最大[currentlsn]与startinglsn值一致;扩大步长,startinglsn不变,endinglsn修改为000009ca:00015160:0001,最大[currentlsn]仍与startinglsn值一致;再次扩大步长,startinglsn不变,endinglsn修改为000009cc:00015160:0001,最大[currentlsn]仍与startinglsn值一致。那么此时我们认为已获取到了日志最大的lsn,增量记录则相当于全部获取,不需要再查询增量,循环退出。
优选的,迭代查询增量时,查询语句为
selectmax([currentlsn])fromfn_dblog(@startinglsn,@endinglsn)。
优选的,跨越4个虚拟日志文件未找到更大的lsn,则认为已找到最大值。
优选的,通过fn_dblog查询sqlserver事务日志的活动部分时,若日志已经备份,无法获取增量,则通过调用fn_dump_dblog获取所述事务日志。
使用fn_dblog获取增量,数据库恢复模式必须为完整模式。
该采用cmsp传输的基于迭代查询fn_dblog的sqlserver数据库增量同步的方法,可以实现sqlserver数据库表增量数据的采集,借助于cmsp的高效性实现sqlserver数据库增量数据的同步。
本发明还要求保护一种sqlserver增量同步的实现装置,包括:至少一个存储器和至少一个处理器;
所述至少一个存储器,用于存储机器可读程序;
所述至少一个处理器,用于调用所述机器可读程序,执行上述的sqlserver增量同步的实现方法。
本发明还要求保护计算机可读介质,所述计算机可读介质上存储有计算机指令,所述计算机指令在被处理器执行时,使所述处理器执行上述的sqlserver增量同步的实现方法。
本发明的一种sqlserver增量同步的实现方法与现有技术相比,具有以下有益效果:
该方法通过迭代查询fn_dblog,减轻了数据库压力,提高了数据同步的实时性;借助于cmsp进行消息的高效传输,大大的提高了数据的传输效率;且借助于cmsp的传输,验证了系统的处理效率、处理的准确性等性能指标。
附图说明
图1是本发明实施例提供的sqlserver增量同步的实现方法的系统架构图;
图2是本发明实施例提供的sqlserver增量同步的实现方法的原理图。
其中,图2中:si表示每次迭代的起始lsn;ei表示每次迭代的结束lsn;*表示每次迭代查询到的最大[currentlsn]。
具体实施方式
下面结合附图和具体实施例对本发明作进一步说明。
本发明实施例提供一种sqlserver增量同步的实现方法,该方法迭代查询fn_dblog,每次迭代获取一部分增量数据,逐步前移,基于日志序列号lsn过滤筛选出增量信息,进而得到全部增量数据;
通过查询fn_dblog,可以获取sqlserver数据库的增量操作,将获取的增量操作在另一个数据库重复执行,这样就实现了数据库的增量同步。
如图1所示,源库为sqlserver,查询事务日志函数fn_dblog获取增量,组装成固定格式的协议,通过cmsp实时高效传输,解析协议入库到目的库中。目的库可以为oracle、sqlserver、mysql、达梦、postgres、highgo等各种类型的数据库。
但通过查询fn_dblog获取所有的增量信息时,有重大缺陷和隐患。fn_dblog是微软提供的一个未公开的事务日志函数,其查询较慢,且消耗大量资源,不可控。当日志较小、数据库增量操作少时,可以直接获取所有增量数据。但当日志较大、增量操作很多时,获取所有信息便不再可行,容易导致数据库挂起,甚至崩溃,进而影响业务。基于此,本实施例提出基于迭代查询fn_dblog的sqlserver增量同步的实现方法。基于迭代查询fn_dblog获取sqlserver增量操作,结合cmsp传输,实现增量数据同步。
sqlserver提供了事务日志函数解析日志功能,对数据库的增量操作都会被记录在日志中,通过查询调用事务日志函数解析日志,可以获取到对数据库的增量操作。sqlserver增量同步的难点在于如何获取增量数据,即如何从sqlserver数据库种获取增量操作。本实施例基于迭代查询fn_dblog解析日志,逐步获取增量数据,再结合cmsp高效传输,实现sqlserver增量同步功能。
fn_dblog函数形式为fn_dblog(@startinglsn,@endinglsn),其中该函数的两个参数分别表示起始的lsn和结束的lsn。默认情况下,可以使用空值。如果将@startinglsn设置为空,则表示从首日志记录开始查询,如果@endinglsn为空值,则表示一直查询到日志的尾记录为止。
对于参数endinglsn的设定,endinglsn可以依据startinglsn设置。
已知lsn由fseqno、sectorno、slotno组成,可以依据fseqno、sectorno、slotno设置迭代的步长。
如每次迭代跨多个虚拟日志文件,则在startinglsn的基础上,其fseqno加上若干整数,例如若startinglsn为000009c8:00015160:0001,跨越两个日志虚拟日志文件后,endinglsn可以设为000009ca:00015160:0001;也可以依据sectorno跨越多个扇区,甚至可以通过修改slotno获取。
设置的步长不同,则每次迭代查询的增量记录不同。通常步长越大,每次迭代查取的日志记录越多。
(2)迭代查询退出的条件
迭代需要条件退出,否则会造成死循环,无法使用。本方法中使用的是当该次迭代查询时,startinglsn与本次查询获取的最大[currentlsn]一致时,便增大步长,当步长达到设定的阈值仍满足startinglsn与最大的[currentlsn]一致条件时,查询退出。
如startinglsn为000009c8:00015160:0001,endinglsn为000009c9:00015160:0001,其最大[currentlsn]与startinglsn值一致;扩大步长,startinglsn不变,endinglsn修改为000009ca:00015160:0001,最大[currentlsn]仍与startinglsn值一致;再次扩大步长,startinglsn不变,endinglsn修改为000009cc:00015160:0001,最大[currentlsn]仍与startinglsn值一致。那么此时我们认为已获取到了日志最大的lsn,增量记录则相当于全部获取,不需要再查询增量,循环退出。
以下是验证迭代查询fn_dblog的可行性,示例如下:
初始startinglsn:00000049:0000003b:0001
步长step:1个虚拟日志文件,即fseqno每次加1
阈值:4
查询语句:
1、一次查询所有增量时,查询最大lsn语句为
selectmax([currentlsn])fromfn_dblog(null,null)where[currentlsn]>'00000049:0000003b:0001'
得到最大lsn:0000004b:000001f4:0009
2、迭代查询增量时:
查询语句为
selectmax([currentlsn])fromfn_dblog(@startinglsn,@endinglsn)
2.1)、第1次查询fn_dblogselectmax([currentlsn])fromfn_dblog('0x00000049:0000003b:0001','0x0000004a:0000003b:0001')
本次迭代最大的lsn:0000004a:00000029:00a1
2.2)、第2次查询fn_dblogselectmax([currentlsn])fromfn_dblog('0x0000004a:00000029:00a1','0x0000004b:00000029:00a1')
本次迭代最大的lsn:0000004b:00000025:0016
2.3)、第3次查询fn_dblogselectmax([currentlsn])fromfn_dblog('0x0000004b:00000025:0016','0x0000004c:00000025:0016')
本次迭代最大的lsn:0000004b:000001f4:0009
2.4)、第4次查询fn_dblogselectmax([currentlsn])fromfn_dblog('0x0000004b:000001f4:0009','0x0000004c:000001f4:0009')
2.5)、第5次查询fn_dblogselectmax([currentlsn])fromfn_dblog('0x0000004b:000001f4:0009','0x0000004d:000001f4:0009')
2.6)、第6次查询fn_dblogselectmax([currentlsn])fromfn_dblog('0x0000004b:000001f4:0009','0x0000004f:000001f4:0009')
2.7)、已跨越4个虚拟日志文件未找到更大的lsn,认为已找到最大值得到最大的lsn:0000004b:000001f4:0009
由上述1,2验证可知,通过迭代查询fn_dblog的方式,可以得到与“一次查询所有增量”方法一样的效果,即均可获取到最大的lsn。但相比单次查询所有增量,迭代查询有更大优势:
可以根据迭代的结果分批次处理增量数据,提高了数据同步的实时性;
用户体验较好。
查询系统事务日志函数fn_dblog,只有sysadmin固定服务器角色和db_owner固定数据库角色的成员才有此权限;fn_dblog查询sqlserver事务日志的活动部分,若日志已经备份,则无法获取增量,可通过调用fn_dump_dblog获取,与查询fn_dblog方法类似。使用fn_dblog获取增量,数据库恢复模式必须为完整模式。
该方法通过迭代查询fn_dblog实现sqlserver数据库增量数据采集,通过查询fn_dblog,并依据[currentlsn]过滤筛选出增量记录信息;
通过迭代查询fn_dblog,减轻了数据库压力,提高了数据同步的实时性;借助于cmsp进行消息的高效传输,大大的提高了数据的传输效率;
借助于cmsp的传输,验证了系统的处理效率、处理的准确性等性能指标。
本发明实施例还提供了一种sqlserver增量同步的实现装置,包括:至少一个存储器和至少一个处理器;
所述至少一个处理器,用于调用所述机器可读程序,执行本发明上述实施例中所述的一种sqlserver增量同步的实现方法。
本发明实施例还提供了一种计算机可读介质,所述计算机可读介质上存储有计算机指令,所述计算机指令在被处理器执行时,使所述处理器执行本发明上述实施例中所述的一种sqlserver增量同步的实现方法。具体地,可以提供配有存储介质的系统或者装置,在该存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机(或cpu或mpu)读出并执行存储在存储介质中的程序代码。
在这种情况下,从存储介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此程序代码和存储程序代码的存储介质构成了本发明的一部分。
用于提供程序代码的存储介质实施例包括软盘、硬盘、磁光盘、光盘(如cd-rom、cd-r、cd-rw、dvd-rom、dvd-ram、dvd-rw、dvd+rw)、磁带、非易失性存储卡和rom。可选择地,可以由通信网络从服务器计算机上下载程序代码。
此外,应该清楚的是,不仅可以通过执行计算机所读出的程序代码,而且可以通过基于程序代码的指令使计算机上操作的操作系统等来完成部分或者全部的实际操作,从而实现上述实施例中任意一项实施例的功能。
此外,可以理解的是,将由存储介质读出的程序代码写到插入计算机内的扩展板中所设置的存储器中或者写到与计算机相连接的扩展单元中设置的存储器中,随后基于程序代码的指令使安装在扩展板或者扩展单元上的cpu等来执行部分和全部实际操作,从而实现上述实施例中任一实施例的功能。
上文通过附图和优选实施例对本发明进行了详细展示和说明,然而本发明不限于这些已揭示的实施例,基与上述多个实施例本领域技术人员可以知晓,可以组合上述不同实施例中的代码审核手段得到本发明更多的实施例,这些实施例也在本发明的保护范围之内。