SqlServer 事务复制的两个参数immediate_sync,allow_anonymous
SqlServer的事务复制中,immediate_sync和allow_anonymous两个参数会影响到复制的后台行为和分发库(distribution)的数据保留方式,这两个参数单从名字上看,可能有些模棱两可甚至云里雾里,以下是个人结合复制的运维,对两个参数的理解。
1,immediate_sync
参数含义:是否执行“立即同步”,立即同步啥?谁来同步?有啥作用?表面含义跟没说一样,完全看不懂啥意思。
默认值:true,也就是“立即同步”。
表面上看,基本上看不出来这个参数到底是干嘛的,那么用人话,直白地说,当该immediate_sync 参数为true时,会产生一下行为:
1,当创建完发布之后,会立即(自动)创建一个快照备用(给谁备用,当然是订阅了,可现在还没有订阅啊)。
2,快照行为:该快照会一直保留,直至超过保留期(Retention period)之后,才会被倍自动清理。
3,增量数据行为:在创建快照那一刻之后,分发数据库中会保留待发布的事务,对应在distribution库中的MSrepl_commands, ,MSrepl_transactions表,直至超过超过保留期(Retention period),才会被倍自动清理。
4,新建订阅会使用已有的快照完成初始化,以及结合distribution库中的增量数据做增量数据复制。
当该immediate_sync 参数为false时,会产生一下行为
1,当创建完发布之后,不会立即创建一个快照,只有新增订阅或者重新手动初始化的时候,才会生成快照
2,增量数据行为:只要快照之后的事务,倍同步至订阅节点之后,就会[Distribution clean up: distribution]自动删除,不会等到保留期(Retention period)
2,allow_anonymous
参数含义:是否允许匿名订阅,匿名是什么意思?为什么要匿名?同样,表面含义跟没说一样,完全看不懂啥意思
默认值:true,也就是“允许匿名订阅”
到底什么是“匿名”订阅?“匿名”订阅会产生什么结果?
allow_anonymous依赖于上面提到的immediate_sync参数,只有在允许了匿名订阅allow_anonymous=true的情况下,且immediate_sync=true的情况下,发布才可以在没有订阅的情况下生成快照,以及将快照之后的事务保留在distribution库中。
说白了就是,提前把发布的快照生成好(全量数据),然后事务数据(增量数据)写入distribution库中保留,就好像已经有了订阅一样,把数据都准备好。一旦真正有订阅过来,可以直接利用快照,以及distribution中的活动事务数据做同步。
allow_anonymous的结果就是一个发布对应一组“虚拟订阅”。
select * from syssubscriptions artid srvid dest_dbstatus sync_type login_name subscription_type distribution_jobid timestamp update_mode loopback_detection queued_reinit nosync_type srvname
----------- ------ -------- ------ --------- ---------- ----------------- ---------------------------------- ------------------ ----------- ------------------ ------------- ----------- ----------------
7 -1 virtual 2 1 sa 0 0x00000000000000000000000000000000 0x000000000000468D 0 1 1 0
8 -1 virtual 2 1 sa 0 0x00000000000000000000000000000000 0x000000000000468E 0 1 1 0
9 -1 virtual 2 1 sa 0 0x00000000000000000000000000000000 0x000000000000468F 0 1 1 0
10 -1 virtual 2 1 sa 0 0x00000000000000000000000000000000 0x0000000000004690 0 1 1 0
11 -1 virtual 2 1 sa 0 0x00000000000000000000000000000000 0x0000000000004691 0 1 1 0
12 -1 virtual 2 1 sa 0 0x00000000000000000000000000000000 0x0000000000004692 0 1 1 0
7 2 pub_db 2 1 sa 0 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AB 0 1 1 0 sub_server\MSSQLSTD
8 2 pub_db 2 1 sa 0 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AC 0 1 1 0 sub_server\MSSQLSTD
9 2 pub_db 2 1 sa 0 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AD 0 1 1 0 sub_server\MSSQLSTD
10 2 pub_db 2 1 sa 0 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AE 0 1 1 0 sub_server\MSSQLSTD
11 2 pub_db 2 1 sa 0 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AF 0 1 1 0 sub_server\MSSQLSTD
12 2 pub_db 2 1 sa 0 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046B0 0 1 1 0 sub_server\MSSQLSTD
3,什么情况下需要取消匿名订阅
3.1 在往发布中新增对象的情况下,需要关闭匿名同步和立即创建快照
allow_anonymous和immediate_sync是一个相互依赖的参数,如果要取消立即同步:需要先关闭allow_anonymous,然后再关闭immediate_sync,否则会报错
关闭immediate_sync
EXEC sp_changepublication
@publication = 'cashier_pub',
@property = 'allow_anonymous' , --想关闭immediate_sync,必须先关闭allow_anonymous
@value = 'false'
GOEXEC sp_changepublication
@publication = 'cashier_pub',
@property = 'immediate_sync' ,
@value = 'false'
GO
打开immediate_sync
EXEC sp_changepublication
@publication = 'cashier_pub',
@property = 'immediate_sync' ,
@value = 'true'
GOEXEC sp_changepublication
@publication = 'cashier_pub',
@property = 'allow_anonymous' , --想打开allow_anonymous,必须先打开immediate_sync
@value = 'true'
GO
然后再往发布中增加发布对象,手动创建快照,此时创建的快照,是新增对象的快照,而不是整个发布的快照
3.2 在往发布中新增对象的情况下,需要关闭匿名同步和立即创建快照
发布数据保存在分发数据库distribution中,当的清理机制是靠[Distribution clean up: distribution]这个job每10分钟运行一次,自动删除(Retention period)过期数据的,(Retention period)默认是72小时。
如果发布对象过多,或者发布对象上的增删改过多,会产生大量的分发日志,在immediate_sync=true以及allow_anonymous=true的情况下,这个日志又要保留72小时,
因此可能造成distribution库的严重膨胀,以及造成[Distribution clean up: distribution]执行过滤缓慢,此时需要关闭allow_anonymous和immediate_sync。
在SqlServer的replication中,感觉这两个参数,有点历史遗留问题的影响,感觉有些啰嗦和混乱。
https://repltalk.com/2010/03/24/what-immediate_sync-means-in-transactional-replication/
https://repltalk.com/2010/02/03/what-is-a-virtual-subscription-in-transactional-replication/
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941139.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!