找回密码
 立即注册
首页 业界区 安全 SqlServer 事务复制的两个参数immediate_sync,allow_an ...

SqlServer 事务复制的两个参数immediate_sync,allow_anonymous

咒卖箴 3 小时前
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的结果就是一个发布对应一组“虚拟订阅”。
  1. select * from syssubscriptions
  2. artid       srvid  dest_dbstatus sync_type login_name subscription_type distribution_jobid                 timestamp          update_mode loopback_detection queued_reinit nosync_type srvname
  3. ----------- ------ -------- ------ --------- ---------- ----------------- ---------------------------------- ------------------ ----------- ------------------ ------------- ----------- ----------------
  4. 7           -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x000000000000468D 0           1                  1             0           
  5. 8           -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x000000000000468E 0           1                  1             0           
  6. 9           -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x000000000000468F 0           1                  1             0           
  7. 10          -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x0000000000004690 0           1                  1             0           
  8. 11          -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x0000000000004691 0           1                  1             0           
  9. 12          -1     virtual  2     1         sa         0                 0x00000000000000000000000000000000 0x0000000000004692 0           1                  1             0           
  10. 7           2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AB 0           1                  1             0           sub_server\MSSQLSTD
  11. 8           2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AC 0           1                  1             0           sub_server\MSSQLSTD
  12. 9           2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AD 0           1                  1             0           sub_server\MSSQLSTD
  13. 10          2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AE 0           1                  1             0           sub_server\MSSQLSTD
  14. 11          2      pub_db  2      1         sa         0                 0x2989DF33CF30C34CB9D49BA5499115EE 0x00000000000046AF 0           1                  1             0           sub_server\MSSQLSTD
  15. 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
  1. EXEC sp_changepublication
  2. @publication = 'cashier_pub',
  3. @property = 'allow_anonymous' ,    --想关闭immediate_sync,必须先关闭allow_anonymous
  4. @value = 'false'
  5. GO
  6. EXEC sp_changepublication
  7. @publication = 'cashier_pub',
  8. @property = 'immediate_sync' ,
  9. @value = 'false'
  10. GO
复制代码
打开immediate_sync
  1. EXEC sp_changepublication
  2. @publication = 'cashier_pub',
  3. @property = 'immediate_sync' ,
  4. @value = 'true'
  5. GO
  6. EXEC sp_changepublication
  7. @publication = 'cashier_pub',
  8. @property = 'allow_anonymous' ,    --想打开allow_anonymous,必须先打开immediate_sync
  9. @value = 'true'
  10. 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/

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册