SQL Server复制怎么实现大事务划分小事务
Admin 2022-06-01 群英技术资讯 531 次浏览
在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
这个参数虽好,但是也可能引起数据的一致性。
如:
在发布更新了一批数据,但是订阅查询时却有不同。
分发事务遇到冲突或者死锁,也导致这部分的数据不一致。
参考:复制日志读取器代理
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
SQL WHERE 子句用于过滤记录。WHERE 子句用于提取满足指定标准的记录。一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
一些朋友在使用sqlserver时,遇到过死锁问题,不知道要怎么解决。对此,这篇文章就给大家分享关于sqlserver查询死锁的方法,下面我们就一起来了解一下死锁和查看死锁的的方法是什么。
本文讲的是SQLserver数据库创建新用户方法以及赋予此用户特定权限的方法,非常的简单实用,有需要的小伙伴可以参考下
sql中go的作用是什么?很多新手学习SQL SERVER可能对于go的作用和用法不是很了解,对此这篇文章就给大家介绍一下sql中go,下文实例有一定的参考价值,感兴趣的朋友可以了解看看,接下来跟随小编来学习一下sql中go吧。
这篇文章介绍了SQL Server中Sequence对象的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008