在預設情況下,immediate_sync是關閉的,這個屬性可以在建立publication時指定,也可以在建立完畢後修改。 如果immediate_sync為true, snapshot 檔案和replicated transaction將一直保留到data retention.然後才會被刪除。這會導致distribution 資料庫增長,複製效能下降。 所以推薦設定為false. 需要注意的時,如果一個資料庫有多個publication,只要其中有一個publication的immediate_sync為true,將會導致這個資料庫的所有publication的replicated transaction的保留期都延長至data retention.
您可以在distribution database裡執行下面的語句進行檢查:
select p.publication,p.publisher_db,ser.name as publisherServer from MSpublications p inner join sys.servers ser on p.publisher_id =ser.server_id where immediate_sync=1 and publication_type =0
語句會列出immediate_sync為true的publication以及資料庫和伺服器資訊。下面是一個執行結果的截圖。
之後您需要去釋出資料庫執行下面的語句將immediate_sync禁止
exec sp_changepublication @publication = 'publicationName' ,@property = 'allow_anonymous' , @value = false
exec sp_changepublication @publication = 'publicationName' , @property = 'immediate_sync' , @value = false
有時候一些後設資料資訊無法被正確修改,導致即使immediate_sync為false, replicated transaction 仍然會被保留下來。 所以需要在distribution database中進行額外的檢查:
select *From MSdistribution_agents where subscriber_id<0
如果這個查詢仍然返回結果,則說明metadata有問題了。需要手工進行刪除(請在Microsoft support service的指導下執行下面的語句)
select * into MSdistribution_agents_bak From MSdistribution_agents where subscriber_id<0
select * into MSdistribution_history_bak From MSdistribution_history where agent_id in
(
select id From MSdistribution_agents where subscriber_id<0
)
delete From MSdistribution_history where agent_id in
(
select id From MSdistribution_agents where subscriber_id<0
)
delete From MSdistribution_agents where subscriber_id<0