如何处理SQL Server事务复制中的大事务操作
如何处理SQL Server事务复制中的大事务操作
事务复制的工作机制
事务复制是由 SQL Server 快照代理、日志读取器代理和分发代理实现的。快照代理准备快照文件(其中包含了已发布表和数据库对象的架构和数据),然后将这些文件存储在快照文件夹中,并在分发服务器中的分发数据库中记录同步作业。
日志读取器代理监视为事务复制配置的每个数据库的事务日志,并将标记为要复制的事务从事务日志复制到分发数据库中,分发数据库的作用相当于一个可靠的存储-转发队列。 分发代理将快照文件夹中的初始快照文件和分发数据库表中的事务复制到订阅服务器中。
在发布服务器中所做的增量更改根据分发代理的计划流向订阅服务器,分发代理可以连续运行以尽量减少滞后时间,也可以按预定的时间间隔运行。对于推送订阅,分发代理在分发服务器上运行;对于请求订阅,分发代理在订阅服务器上运行。该代理将事务从分发数据库移动到订阅服务器中。 如果订阅被标记为需要验证,则分发代理还要检查发布服务器和订阅服务器中的数据是否匹配。
大事务同步延时处理方法
在transactional replication, 经常会遇到数据同步延迟的情况。有时候这些延迟是由于在publication中执行了一个更新,例如update ta set col=? Where ?,这个更新包含巨大的数据量。在subscription端,这个更新会分解成多条命令(默认情况下每个数据行一个命令)应用到subscription上。 不得已的情况下,我们需要跳过这个大的事务,让replication继续运行下去。
现在介绍一下transactional replication的一些原理和具体的方法:
当publication database的article发生更新时, 会产生相应的日志,Log reader会读取这些日志信息,将他们写入到Distribution 数据库的msrepl_transactions和msrepl_commands中。
Msrepl_transactions中的每一条记录都有一个唯一标识xact_seqno,xact_seqno对应日志中的LSN。 所以可以通过xact_seqno推断出他们在publication database中的生成顺序,编号大的生成时间就晚,编号小的生成时间就早。
Distributionagent包含两个子进程,reader和writer。 Reader负责从Distribution 数据库中读取数据,Writer负责将reader读取的数据写入到订阅数据库。
Reader是通过sp_MSget_repl_commands来读取Distribution数据库中(读取Msrepl_transactions表和Msrepl_Commands表)的数据。
大致逻辑是:Reader读取subscription database的MSreplication_subscriptions表的transaction_timestamp列,获得更新的上一次LSN编号,然后读取分发数据库中LSN大于这个编号的数据。 Writer将读取到的数据写入订阅,并更新MSreplication_subscriptions表的transaction_timestamp列。然后Reader会继续用新的LSN来读取后续的数据,再传递给Writer,如此往复。
如果我们手工更新transaction_timestamp列,将这个值设置为当前正在执行的大事务的LSN,那么distribution agent就会不读取这个大事务,而是将其跳过了。
具体逻辑参见:
SQL Server复制系列3 – 存储过程sp_MSins_dboTableName_msrepl_ccs & sp_MSdel_dboTableName_msrepl_ccs的作用
SQL Server复制系列4 – Transactional replication中如何跳过一个事务
DBA的建议
为了最小化影响,建议使用复制的存储过程,将更新操作封装为一个独立事务,在订阅服务器上调用复制的存储过程,在本地执行批量更新。
在高并发的数据库做归档后的删除,为了避免业务影响,删除操作会循环分批删除,每批间等待一定时间。这里,我们也可以使用控制表来控制大事务分批操作。将控制逻辑和复制的存储过程结合,增加批次并减少执行时间。这个过程也可以工作得和非复制的更新一样好,几乎不会用实际的UPDATE替换EXEC SP操作。
具体脚本参见:
Large Updates on Replicated Tables
深入优化复制架构
对于多个发布者、多个发布、多个订阅的情况,我们可以从架构上来优化和扩展。将每个发布者独立一个distribution数据库,放到独立的服务器上,减轻分发代理的压力。对于订阅,不需要实时要求的,用请求订阅,尽量减少推送订阅的数量。
对于订阅数据库,可以配置为大容量模式,优化批量操作的日志写入。创建轻量的订阅数据库,减少不必要的索引和触发器。对于请求订阅,修改拉取间隔。增加日志备份的频率。配置高性能的配置文件。
复制优化参见:
15 SQL Server replication tips in 15 minutes
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java数组篇总结
数组(数组篇学于传智和王伟老师) 1、数组:存储同一种数据类型的多个元素的容器。 2、特点:每一个元素都有编号,从0开始,最大编号是长度-1。编号的专业叫法:索引 3、定义格式 3.1):数据类型[] 数组名; 3.2):数据类型 数组名[]; 推荐是用A方式,B方法就忘了吧。但是要能看懂 4、数组的初始化 4.1)动态初始化 只给长度,系统给出默认值 举例:int[] arr = new int[3]; 4.2)静态初始化 给出值,系统决定长度 举例:int[] arr = new int[]{1,2,3}; 简化版:int[] arr = {1,2,3}; 5、Java的内存分配 栈 存储局部变量 堆 存储所有new出来的 方法区(面向对象部分详细讲解) 本地方法区(系统相关) 寄存器(CPU使用) 内存图: 注意: a:局部变量 在方法定义中或者方法声明上定义的变量。 b:栈内存和堆内存的区别 栈:数据使用完毕,就消失。 堆:每一个new出来的东西都有地址 每一个变量都有默认值 byte,short,int,long 0 float,double 0.0 char '\u0000...
- 下一篇
SylixOS中TPSFS格式化流程简析
1.TPSFS简介 TPSFS文件系统是一款掉电安全的文件系统,该系统是SylixOS内建文件系统(专利技术),该文件系统有如下特点: 采用B+树存储文件数据,读取与定位速度快,空间管理效率高; 对数据使用原子操作,掉电安全; 64位文件系统,支持EP级别文件长度; 大文件处理性能好; 支持文件记录锁,可支持大型数据库; 支持多块分配机制,提高了系统性能,使得分配器有了充足的优化空间; 支持子目录可扩展性,使得在一个目录下可以创建无数多个子目录。 TPSFS文件系统结构如图 1.1所示。 图 1.1 TPSFS文件系统结构图 超级块是TPSFS的第一个块,其中记录了文件系统的基本信息,如:块大小、块数量、数据块位置、log块位置等。TPSFS中每个数据块都被记录在一个以inode块为根的B+树中。 超级块后是空间管理inode块,inode对应的B+树管理整个磁盘的空闲块,可以理解为将所有空闲块记录到空间管理inode形成一个大文件。与普通文件不同的是,空间管理inode B+树节点的key值为磁盘块区间的物理块号,而普通文件的key值为该块区间在文件中的偏移。 2. SD卡...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS6,7,8上安装Nginx,支持https2.0的开启