开发者社区> 杰克.陈> 正文

SqlServer 复制中将大事务分成小事务分发

简介: 原文:SqlServer 复制中将大事务分成小事务分发 在sql server 复制中,当在发布数据库执行1个大事务时,如一次性操作 十万或百万以上的数据。当操作数据在发布数据库执行完成后 ,日志读取器代理将扫描事务日志,一次性传递到分发数据库中。
+关注继续查看
原文:SqlServer 复制中将大事务分成小事务分发


在sql server 复制中,当在发布数据库执行1个大事务时,如一次性操作 十万或百万以上的数据。当操作数据在发布数据库执行完成后 ,日志读取器代理将扫描事务日志,一次性传递到分发数据库中。若上个事务未传递完成,连续执行多个事务,日志读取器代理将扫描日志中多个事务同时传递到分发数据库中,默认最大扫描500个事务。如果执行多次上百万或千万的数据将堵塞很久。


日志读取器代理可配置将大事务划分为多个小事务进行传递到分发数据库中,分发队列则按照小事务分发到订阅数据库中,这样数据就很快同步!


在没改代理参数之前,本人执行1次插入30万的数据到发布表中。插入完成后,监控发布到分发的记录如下:


可以看到,这1个事务的命令都得一次传递完才能分发,而分发又消耗时间,这里等待太久影响事务的实时性。

如果还有其他事务,默认500(参考参数:-ReadBatchSize),也将一起传递,耗时较长。


现在更改参数,扫描到 1000 左右的命令就即时分发,需要设置如下参数:

-MaxCmdsInTran number_of_commands



注:该参数只能添加到日志读取器代理中,在代理配置文件没有此参数的设置。


添加后重启 日志读取器代理。

再次插入 30 万的数据!~到监视器查看



可以看到,命令达到 1000 左右就进行分发了,此时查看订阅数据库,数据也同步过来了,这样就省去了较多扫描命令的时间。

更详细查看每个事务的命令数,如下:

SELECT top 10  A.xact_seqno,A.entry_time,COUNT(*) AS cmds
FROM distribution.dbo.MSrepl_transactions A(NOLOCK) 
INNER JOIN distribution.dbo.MSrepl_commands B(NOLOCK) 
ON A.xact_seqno=B.xact_seqno
GROUP BY A.xact_seqno,A.entry_time
ORDER BY cmds DESC



这个参数虽好,但是也可能引起数据的一致性。

如:

 在发布更新了一批数据,但是订阅查询时却有不同。

分发事务遇到冲突或者死锁,也导致这部分的数据不一致。


参考:复制日志读取器代理



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQL Server 数据变更时间戳(timestamp)在复制中的运用
原文:SQL Server 数据变更时间戳(timestamp)在复制中的运用 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two) 方...
1477 0
sql server 本地复制订阅 实现数据库服务器 读写分离
原文:sql server 本地复制订阅 实现数据库服务器 读写分离 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下SQL Server的复制订阅实现数据的读写分离 比起mysql的复制,SQL server 复制相对强大 一、 名词解释 1、复制的 机构组成(类比报纸流通):   1)、发布服务器(报社出版)       生产维护数据源,审阅所有出版数据的更改 发送给 分发服务器(邮局)   2)、分发服务器 (邮局)       分发服务器包括分发数据库,并且存储元数据、历史数据和事务。
1002 0
oracle、mysql、sybase和sqlserver复制表结构和数据
Sql Server(sybase): 1.复制表结构: 新建表student2,并且结构同表syn_xj_student一致。Sql语句如下: select * into syn_xj_student2 from syn_xj_student where 1=2 2.复制表数据,并...
730 0
sql server 复制表从一个数据库到另一个数据库
/*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.
869 0
+关注
杰克.陈
一个安静的程序猿~
10425
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载