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/