动态

详情 返回 返回

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選項”(手動生成快照後,就允許了,這個地方搞的很亂)。

imageimage

 

在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/

Add a new 评论

Some HTML is okay.