Sql-Server

確定訂閱何時在事務複製中變為非活動狀態

  • October 21, 2019

當我嘗試在我的一些出版物上發送跟踪令牌以獲得延遲時,我收到以下錯誤 -

未找到有效訂閱。發布必須具有活動訂閱才能發布跟踪令牌。

這些出版物也有訂閱。我可以通過重新初始化\重建複製來解決這個問題,但我想知道是否有辦法告訴訂閱何時停止接收任何內容?我想確定這有多久沒有工作了。

正在複製的表上沒有時間戳,因此我可以據此計算出來。我檢查了複製監視器,瀏覽了分發數據庫中的幾個表,檢查了作業歷史記錄和 SQL 日誌,但無法確定這一點。是否在某處記錄了時間戳,顯示從分發者到訂閱者的最後一次同步?

我們在 SQL Server 2012 SP4 上使用 SQL 事務複製(推送)。

我強烈建議您根據 Brent 部落格的建議設置 Replication Canary 程序:monitoring-sql-server-transactional-replication

我們創建了自己的變體:

  1. 確保您的發布伺服器和訂閱伺服器的時鐘同步
  2. 為每個出版物創建一個表,該表將包含具有結構的單行

範例腳本:

CREATE TABLE [{Schema}].[{PublicationName}_Canary]
( 
 [ID] INT NOT NULL, 
 [PublicationDate] DATETIME NOT NULL,
 CONSTRAINT [PK_{PublicationName}_Canary] PRIMARY KEY CLUSTERED 
 (
   [ID] ASC
 )WITH (ONLINE = ON) ON [PRIMARY]
) ON [PRIMARY]
GO 

INSERT INTO [{Schema}].[{PublicationName}_Canary]
 (ID, PublicationDate)
VALUES (1, SYSUTCDATETIME())
  1. 創建一個將在間隔內更新單行的作業,我喜歡使用每隔幾秒執行一次的東西,即:7 秒(導致金絲雀在奇數時間通過,因此我們更有可能發現可能得到的預定操作如果間隔太寬/同步而無法錯過金絲雀,則錯過)
  2. 將此表添加到您的出版物
  3. 在訂閱伺服器上創建一個表來記錄金絲雀以及它們何時到達(不要忘記創建一個清理過程來清除舊數據!)

範例腳本:

CREATE TABLE [{Schema}].[Replication_Canary_Log]
( 
 [Publication] SYSNAME NOT NULL, 
 [PublicationDate] DATETIME NOT NULL,
 [SubscriberDate] DATETIME NOT NULL,
) ON [PRIMARY]
GO 
  1. 更改該 Canary 文章的更新儲存過程,以[Replication_Canary_Log]在更新到達訂閱者時插入到您的

範例腳本:

ALTER PROCEDURE [dbo].[sp_MSupd_{Schema}{PublicationName}_Canary]     
   @c1 int = NULL, @c2 DATETIME = NULL, @pkc1 int = NULL, @bitmap binary(1)
AS
begin   
   /* I've removed the main body of the replication stored procedure for brevity */

   /* Customization of this Replication proc to log every time an update arrives */
   DECLARE 
       @SubscriberDate DATETIME2 = SYSUTCDATETIME(), 
       @Publication SYSNAME = '{PublicationName}'

   INSERT INTO [{Schema}].[Replication_Canary_Log]
       ([Publication], [PublicationDate], [SubscriberDate])
   VALUES
       (@Publication , @PublicationDate, @SubscriberDate)
end 
GO

完成上述所有操作後,您現在只需要監視[{Schema}].[Replication_Canary_Log]表中的最新行以跟踪何時出現延遲…如果您的出版物因任何原因停止寫入訂閱者,您將獲得延遲峰值(自最後一隻金絲雀來了)。對我們來說,這可以讓我們找出原因:

  • 網路曇花一現
  • 對需要很長時間才能應用的複製表的批量更改
  • 訂閱者已被標記為非活動狀態,需要重新同步
  • 還有什麼原因。。

您必須查看錯誤日誌或作業歷史記錄(前提是未清除或回收)。

請參閱我對 T-Rep 的回答 .. 如何啟動訂閱:https ://dba.stackexchange.com/a/38999/8783

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