如何处理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
转载于:https://blog.51cto.com/ultrasql/1905168
如何处理SQL Server事务复制中的大事务操作相关推荐
- sql server 快照_在SQL Server合并复制中应用快照时出现外键问题
sql server 快照 This article will review specific SQL Server merge replication issues related to forei ...
- SQL Server 将一个表中字段的值复制到另一个表的字段中
原文:SQL Server 将一个表中字段的值复制到另一个表的字段中 具体方法如下 一:update 表2 set (要插入的列名)= select 表1.某一列 from 表1 left jion ...
- SQL Server 2012 复制(发布订阅的研究)
原文:SQL Server 2012 复制(发布订阅的研究) 已实现发布订阅功能,可以实现局域网内双击备份. 一.注意事项: a) 使用[事务复制]功能 b) 必须是相同的SqlServer 帐号和密 ...
- 逻辑SQL Server数据复制101
介绍 (Introduction) Data replication has been around for many decades. There are two primary types of ...
- [翻译]一步步教你配置SQL SERVER合并复制(五)配置Publisher(上)
上一篇:一步步教你配置 SQL SERVER合并复制(四)设置Distributor的安全 (译者注:本篇内容较多也是合并复制最重要的一个环节之一,因此配置Publisher将分成两个章节来翻译) ...
- Linux上SQL Server合并复制
Replication is a process to manage multiple copies of the same data at a different node. Microsoft S ...
- SQL Server 2016 SP1中的新功能和增强功能
SQL Server 2016 SP1 is released as announced by Microsoft. It comes with a bunch of new features and ...
- 如何为报表服务器设置SQL Server数据库复制
In this article, we'll discuss the purpose of database replication and show how you can implement Re ...
- Sql server 2005日志文件太大,使其减小的方法
Sql server 2005日志文件太大,使其减小的方法 Sqlserver2005日志文件太大,使其减小的方法: 运行下面的三行 dbName为数据库名: backup log dbNamewit ...
最新文章
- 2021年大数据常用语言Scala(十九):基础语法学习 iterator迭代器
- 数据库优化:Mysql慢查询的定位和分析
- 使用DroidPlugin实践应用的插件化
- C++笔记-获取光标(非鼠标坐标)在屏幕的位置
- 乘法逆元(洛谷-P3811)
- jQuery: 插件开发模式详解 $.extend(), $.fn, $.widget()
- 2021级C语言大作业 - 坏蛋冰淇凌
- Codeforces Round 253 (Div. 2)
- [不限速百度云]两款百度网盘破解版分享
- 【FPGA知识点】八段共阳极数码管编码表
- GPGPU基础(一):一些基本概念
- 前端后端程序员必备的Linux基础知识
- Java的JDK和JRE
- table 表格的一些属性
- python夯实基础日记-序列、列表、元组
- lingo中@wrap函数的理解
- 一张图分出你是用左脑还是右脑!
- pyqt5:python读取二进制文件(音频PCM文件)显示波形
- 香港中文大学(深圳)招收全奖博士生
- SAS导出EXCEL文件的几种方法