执行大事务导致订阅数据库延迟的处理方法
2016-01-18 17:41
281 查看
在发布服务器上执行一个大事务,比如全表更新,用于数据初始化时,当传达到订阅服务器时,会分解成许多条命令,或者该命令会改写原sql,造成效率降低。先说明下原理:先查看订阅服务器正在执行的事务号(订阅服务器的MSreplication_subscriptions表),再确认分发数据库中下发的事务和命令是否准确(订阅服务器的MSrepl_transactions和MSrepl_commands表),最后用sp_setsubscriptionxactseqno函数对事务进行跳过sp_setsubscriptionxactseqno[@publisher=]'publisher'
,[@publisher_db=]'publisher_db'
,[@publication=]'publication'
,[@xact_seqno=]xact_seqno
以实例说明:在订阅服务器上确认,数据没有改变,但后续的事务已经执行:
等一会延迟就变低了,后续可以再从库上进行主库数据的一致性更新,直到主从数据一致为止。
上述只是阐述了如何补救,其实真正的安全是做到预防,如果有主库大事务的程序或操作,建议将大事务分解成若干小事务,并分时段进行提交。
相关连接:SQLServer复制系列4-Transactionalreplication中如何跳过一个事务
sp_setsubscriptionxactseqno函数
在SQLServer2005/2008事务复制中如何跳过一个事务