標記為非活動的 SQL Server 複製訂閱
有沒有辦法強制 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 論壇主題以了解可能的解決方案:自動標記非活動訂閱以進行重新初始化