Sql-Server

標記為非活動的 SQL Server 複製訂閱

  • February 2, 2022

有沒有辦法強制 SQL Server 永遠不要將訂閱標記為非活動狀態?

當存在連接問題並且我不想每次都重新初始化訂閱時,它會偶爾發生。

請注意,我不是在談論被標記為過期的訂閱……就像不活動一樣。

我們將保留設置為 0(無限)。我寧願擁有一個大的分發數據庫,也不願通過 WAN 為訂閱者重新初始化一個 15GB 的數據庫。無論如何,這裡真正的問題是它們有時會在幾個小時內被標記為不活動……有時甚至幾天……這似乎是零星的。有什麼方法可以告訴為什麼 SQL 決定將它們標記為非活動狀態?

是的,您可以使用 t-SQL 和 sql 代理作業以程式方式執行此操作。

基本上,您必須查詢 distribution..MSSubscriptions 並檢查狀態列的值是否為 0(非活動)。

訂閱狀態:0 = 未啟動;1 = 訂閱; 2 = 活躍

下面的 T-SQL 會幫助你:

-- Author: Kin Shah
-- Date: 4-1-2013
-- For dba.stackexchange.com
-- Good to find out 
-- publisher_id
-- publisher_db
-- publication_id
-- subscriber_id
-- subscriber_db
select * From distribution..MSsubscriptions

--- based on the above values, run below statement
--- this can be run using SQLAgent job

if exists (select 1 from distribution..MSsubscriptions where status = 0)
begin
UPDATE distribution..MSsubscriptions
SET STATUS = 2
WHERE publisher_id = '--publisher_id -- will be integer --' 
   AND publisher_db = '--publisher db name ---'
   AND publication_id = '--publication_id -- will be integer --'
   AND subscriber_id = '--subscriber_id -- will be integer ---'
   AND subscriber_db = '-- subscriber_db ---'
end
else
begin
print 'The subscription is not INACTIVE ... you are good for now .... !!'
end

根據訂閱失敗與發布者同步並標記為非活動,即使設置已配置為“永不過期”

為了找到停用的原因,我們需要檢查 Distribution 屬性中的 Transaction Retention period。如果將其設置為較小的數字(如 3 小時),則表示如果訂閱者在 3 小時內未同步,則分發清理代理將截斷分發中的命令表,因此訂閱者將被標記為停用。

由於命令已從分發器中刪除,因此除了重新初始化訂閱者之外別無選擇。

此外,為了找到分發伺服器無法同步的原因,我們可以在分發數據庫的下表中查看分發歷史記錄,

msdistribution_agents

msdistribution_history

此外,來自產品文件中的Subscription Expiration and Deactivation :

可以指定訂閱永不過期(@retention 的值為 0),但強烈建議您不要使用此值,因為無法清除元數據。

另請閱讀此 MSDN 論壇主題以了解可能的解決方案:自動標記非活動訂閱以進行重新初始化

引用自:https://dba.stackexchange.com/questions/33801