一种SQLServer增量同步的实现方法与流程

本发明涉及数据同步与备份技术领域,具体地说是一种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等来执行部分和全部实际操作,从而实现上述实施例中任一实施例的功能。

上文通过附图和优选实施例对本发明进行了详细展示和说明,然而本发明不限于这些已揭示的实施例,基与上述多个实施例本领域技术人员可以知晓,可以组合上述不同实施例中的代码审核手段得到本发明更多的实施例,这些实施例也在本发明的保护范围之内。

THE END
1.什么是数据增量同步?增量同步有哪些应用嘲?在数据库迁移过程中,全量迁移结合增量同步功能可以平滑迁移数据库,完成数据对象异构迁移与数据迁移,并持续跟踪采集源库变更,进行增量的数据同步,有效缩短停机窗口,降低迁移风险。 异构数据库同步 增量同步可以实现异构关系数据库之间的实时单向数据同步、双向数据同步、数据共享等,满足在不同应用程序之间分布和整合数据的需求https://www.fanruan.com/bw/doc/178516
2.深度解析在大数据领域,数据同步是一项至关重要的任务,它关乎到数据的一致性、实时性和完整性。 在数据同步的场景中,全量同步每次都会复制整个数据集,这在大规模数据迁移和实时性要求较高的场景下显得尤为低效。 数据增量同步是一种高效的数据同步策略,它只传输自上次同步以来数据库中发生变更的数据。这种同步方式能够显著减少数https://blog.csdn.net/2301_77993839/article/details/143877902
3.基于Spark的数据库增量准实时同步AET摘要:为了实现将传统关系型数据库中的增量数据快速导入同构或者异构目的库,在使用已有的增量提取方法的基础上,提出了通过增加并行度和流式计算的方法加快同步速度。此方法不仅支持插入、更新和删除的增量数据同步,而且可以抽取出数据库表结构信息动态支持表结构变更。与传统单点抽取方式相比,大大提高了目的库数据的新鲜度http://www.chinaaet.com/article/3000055765
4.实时同步任务任务创建《数据传输用户手册数据传输-实时同步任务:“引用参数组”配置项选取需引用的参数组。1)如参数组的使用场景是:任务常用的高级配置-自定义参数配置为参数组,可实现不同任务间的自定义参数复用,则“引用参数组”配置项选取需引用的参数组即可。2)如参数组的使用场景是:任务导入导出时对库名、Topic名等进行替换,除“引用参数组”配置https://study.sf.163.com/documents/read/easytransfer/easytransfer_realtime_sync_task.md
5.数据同步:Canal数据库增量订阅是阿里巴巴开源的一个数据同步工具,用于实时抓取数据库的增量日志,解析后推送到 MQ、Kafka、Storm 等消息队列中。Canal 主要用于数据库数据的增量订阅,实时获取数据库变更,将变更数据同步到目标数据存储中。 的优势 可以解决传统数据库数据同步的一些痛点,如实时性、准确性等,具有以下优势: https://www.jianshu.com/p/ca4c302e3bc1
6.数据库实时同步工具Syncnavigator详细使用教程注册机使用:https://jingyan.baidu.com/article/f71d6037cc7e301ab741d143.htmlSyncNavigator是一款高效的数据库同步工具,支持sqlserver数据库和mysql数据库,采用增量同步的方式实时保存数据库数据。SyncNavigator的基本功能:自动同步数据/定时同步数据无论是实时同步/24小时不间断同步。因为是增量同步,记录每次同步时间戳https://jingyan.baidu.com/article/fb48e8bec406986e632e146c.html
7.整库实时同步MySQL到StarRocks整库实时同步方案为您先进行全量数据迁移,然后再实时同步增量数据至目标端。本文为您介绍如何创建整库实时同步MySQL到StarRocks的任务。 前提条件 已完成数据源配置。您需要在数据集成同步任务配置前,配置好您需要同步的源端和目标端数据库,以便在同步任务配置过程中,可通过选择数据源名称来控制同步任务的读取和写入数据http://help.ceden.cn/?zh/dataworks/user-guide/configure-and-manage-real-time-synchronization-tasks
8.企业级数据迁移服务OMS数据库工具OceanBase 数据迁移工具(OceanBase Migration Service,OMS)是 OceanBase 数据库一站式数据传输和同步的产品。它支持多种关系型数据库、消息队列与 OceanBase 数据库之间的数据复制,是集数据迁移、实时数据同步和增量数据订阅于一体的数据传输服务,OMS 帮助您低风险、低成本、高效率的实现 OceanBase 的数据流通,助力构建安全https://www.oceanbase.com/product/oms
9.集成开源调度系统,支持分布式增量同步数据实时查看运行DataX集成可视化页面,选择数据源即可一键生成数据同步任务,支持批量创建RDBMS数据同步任务,集成开源调度系统,支持分布式、增量同步数据、实时查看运行日志、监控执行器资源、KILL运行进程、数据源信息加密等。https://gitee.com/WeiYe-Jing/datax-web
10.数据集成整库任务配置概览操作指南文档中心整库迁移支持来源端的数据及结构监控,可将源端所有库表下的全量或增量数据实时同步至目标端,同时支持目标端自动建表、字段变更同步等特性。支持 MySQL、Doris、DLC、Kafka 等数据源。 前提条件 1.已配置好来源及目标端的数据源以备后续任务使用。详情请参见数据源管理与配置方式。 https://cloud.tencent.com/document/product/1580/85931
11.消息队列RocketMQ顺序消息消息队列RocketMQ功能特性用户购买商品生成订单为例,此时若以普通消息发送,则下游订单系统可能消息消费顺序混乱,例如订单出库先执行,后生成订单,从而系统数据不正确。顺序消息就能解决此问题,上游系统发送顺序消息,下游订单系统在同一消费组,会依次按顺序消费,执行相应的逻辑。 典型场景二: 数据实时增量同步 https://ecloud.10086.cn/op-help-center/doc/article/67007
12.将Oracle同步到GaussDB(forMySQL)数据复制服务DRS数据库账号权限要求 在使用DRS进行同步时,连接源库和目标库的数据库账号需要满足以下权限要求,才能启动实时同步任务。不同类型的同步任务,需要的账号权限也不同,详细可参考表2进行赋权。DRS会在“预检查”阶段对数据库账号权限进行自动检查,并给出处理建议。 https://support.huaweicloud.com/intl/zh-cn/realtimesyn-drs/drs_04_0110.html
13.Dinky在Doris实时整库同步和模式演变的探索实践对于上述架构存在的问题,Flink CDC 的出现为数据入仓入湖架构提供了一些新思路。借助 Flink CDC 技术的全增量一体化实时同步能力,结合 Doris 提供的更新能力,整个架构变得非常简洁。我们可以直接使用 Flink CDC 读取 MySQL 的全量和增量数据,并直接写入和更新到 Doris 中。 https://blog.51cto.com/zhangxueliang/12910802
14.深入浅出阿里数据同步神器:Canal原理+配置+实战全网最全解析canal翻译为管道,主要用途是基于 MySQL 数据库的增量日志 Binlog 解析,提供增量数据订阅和消费。 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业https://maimai.cn/article/detail?fid=1779084320&efid=Mz5tMXwzMK7UBT3YsxxvGw
15.4种MySQL数据同步ES方案详解Mysql对数据库有一定的轮询压力,一种改进方法是将轮询放到压力不大的从库上。 经典方案:借助 Logstash 实现数据同步,其底层实现原理就是根据配置定期使用 SQL 查询新增的数据写入 ES 中,实现数据的增量同步。 2.4 基于 Binlog 实时同步 上面三种方案要么有代码侵入,要么有硬编码,要么有延迟,那么有没有一种方案既能保证https://www.jb51.net/database/301406wc1.htm