SqlServer 复制中将大事务分成小事务分发
来源:互联网 发布:百度网盘端口 编辑:程序博客网 时间:2024/05/19 16:34
在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 cmdsFROM distribution.dbo.MSrepl_transactions A(NOLOCK) INNER JOIN distribution.dbo.MSrepl_commands B(NOLOCK) ON A.xact_seqno=B.xact_seqnoGROUP BY A.xact_seqno,A.entry_timeORDER BY cmds DESC
这个参数虽好,但是也可能引起数据的一致性。
如:
在发布更新了一批数据,但是订阅查询时却有不同。
分发事务遇到冲突或者死锁,也导致这部分的数据不一致。
参考:复制日志读取器代理
0 0
- SqlServer 复制中将大事务分成小事务分发
- SqlServer 使用脚本创建分发服务及事务复制的可更新订阅
- SQLServer 事务复制分发错误 The process could not connect to Subscriber
- sqlserver 2005 分布式架构 对等事务复制
- sqlserver 2005 分布式架构 对等事务复制
- sqlserver 2005 分布式架构 对等事务复制 .
- sqlserver 事务复制的工作机制
- sqlserver事务
- sqlserver 事务
- 事务复制
- SQL Server 事务复制分发到订阅同步慢
- sqlserver事务与oracle事务
- SQLServer 使用sp_repldone标识所有未分发的事务为已分发
- SQLServer事务日志清理
- sqlserver分布式事务解决方案
- SqlServer事务回滚
- sqlserver 事务日志备份
- sqlserver 事务日志文件格式
- ZigBee之基础概念2
- Android自定义ScrollView
- Android Studio下载和安装
- Redis相关指令文档
- Android Studio 1.3下载地址
- SqlServer 复制中将大事务分成小事务分发
- iOS PerformSelector may cause a leak because its selector is unknown
- android Spinner(下拉列表)
- lua路上踩到的坑
- linux ssh 无法连接解决
- DJ's WebGL Tutorial 001--渲染准备
- redis之如何配置jedisPool参数 jedis连接池参数
- 机房收费系统重构——问题集锦一
- 浅谈对物联网的理解(转载清注明出处,会根据完成进度实时更新)