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'
GO
EXEC sp_changepublication
@publication = 'cashier_pub',
@property = 'immediate_sync' ,
@value = 'false'
GO
--查看復制屬性
exec sp_helppublication;
go
打開immediate_sync
EXEC sp_changepublication
@publication = 'cashier_pub',
@property = 'immediate_sync' ,
@value = 'true'
GO
EXEC sp_changepublication
@publication = 'cashier_pub',
@property = 'allow_anonymous' , --想打開allow_anonymous,必須先打開immediate_sync
@value = 'true'
GO
--查看復制屬性
exec sp_helppublication;
go
然后再往發布中增加發布對象,手動創建快照,此時創建的快照,是新增對象的快照,而不是整個發布的快照
3.2 在往發布中新增對象的情況下,需要關閉匿名同步和立即創建快照
發布數據保存在分發數據庫distribution中,當的清理機制是靠[Distribution clean up: distribution]這個job每10分鐘運行一次,自動刪除(Retention period)過期數據的,(Retention period)默認是72小時。
如果發布對象過多,或者發布對象上的增刪改過多,會產生大量的分發日志(通俗說就是distribution爆了,這種情況大概率是[Distribution clean up: distribution] job因為某些原因停了),在immediate_sync=true以及allow_anonymous=true的情況下,這個日志又要保留72小時,
因此可能造成distribution庫的嚴重膨脹,以及造成[Distribution clean up: distribution]執行過濾緩慢,此時需要關閉allow_anonymous和immediate_sync,關閉后,分發的數據不受控于Retention period,只要分發完成后隨即會被[Distribution clean up: distribution] job刪除。
關于重Reinitialize新初始化的選項,是否可以勾選“generated the new snapshot now”,情況有點有復雜,我試了N多遍才試出來:
1,如果allow_anonymous和immediate_sync都是true的情況下,創建的訂閱允許勾選“復選框generated the new snapshot now選項”
2,如果allow_anonymous和immediate_sync都是true的情況下,創建訂閱,然后修改allow_anonymous和immediate_sync為false,則不允許“復選框generated the new snapshot now選項”
3,如果allow_anonymous和immediate_sync都是false的情況下,創建的訂閱不允許勾選“復選框generated the new snapshot now選項”
4,如果allow_anonymous和immediate_sync都是false的情況下,創建訂閱,然后修改allow_anonymous和immediate_sync為true,也不允許勾選“復選框generated the new snapshot now選項”(手動生成快照后,就允許了,這個地方搞的很亂)。


在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/
浙公網安備 33010602011771號