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

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

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

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

可以看到,这1个事务的命令都得一次传递完才能分发,而分发又消耗时间,这里等待太久影响事务的实时性。
如果还有其他事务,默认500(参考参数:-ReadBatchSize),也将一起传递,耗时较长。

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

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

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

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

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

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

可以看到,命令达到 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

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

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

如:

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

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

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

标签:
大事务,小事务,分发

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com

RTX 5090要首发 性能要翻倍!三星展示GDDR7显存

三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。

首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。

据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。