Sql-Server

什麼會導致事務複製訂閱重複重新啟動而沒有錯誤?

  • August 16, 2018

我已經設置了一個事務複製發布/訂閱來測試從本地 SQL 2016 企業版安裝到 Azure SQL DB 的遷移,我發現當數據庫快照完成上傳到 Azure 時,它只是從開始。它在 5-6 小時內完成並上傳約 125GB 的數據,因此我認為這與訂閱過期或超過任何超時門檻值無關。它被設置為連續執行,而不是按計劃執行。

我查看了 MSdistribution_history 表中的分發歷史記錄,看不到任何提及訂閱被標記為重新初始化的內容,所有這些都是顯示“將數據批量複製到表中……”的條目,然後在這一點我可以告訴它重新啟動,它會回到“在表上創建主鍵索引……”和“應用腳本 x……”。我還查看了 MSrepl_errors 表和 msdb..sysreplicationalerts ,兩者都是空的。

我曾嘗試刪除 Azure SQL DB 和發布並再次從頭開始執行該過程,但在完成此操作後我看到了同樣的事情。

這是有人以前見過並且可以解釋其原因以及如何解決它的東西嗎?

以防萬一其他人遇到這個問題,我相信我已經找到了解決方案。

在準備數據庫以進行複制時,我從頭到尾再次執行了所有步驟,並且我意識到我們在數據庫上擁有的觸發器之一沒有標記為“不用於複製”屬性。以前是這樣,但是已經進行了程式碼更改並部署了沒有此屬性的觸發器版本。改回來後,我設置了一個新快照並成功應用它,沒有任何問題。

由於我試圖複製的數據庫的大小,我沒有測試過將設置切換回關閉並再次嘗試以確認這是修復它的原因,儘管我確實嘗試使用較小的數據庫並且沒有看到相同的行為。我對此的想法是觸發器導致數據出現某種錯誤,但沒有正確拋出錯誤消息。

要檢查是否設置了此屬性,只需執行以下腳本並查看is_not_for_replication屬性 - 1 表示已設置,0 表示未設置。

SELECT name,
is_not_for_replication
FROM sys.triggers
WHERE is_ms_shipped = 0;

如果您看到上述問題,然後發現一個或多個觸發器沒有設置此屬性,請更新儲存過程的定義以包含 not for replication 屬性,然後重試。此處解釋了設置屬性:https ://stackoverflow.com/questions/44882512/how-to-create-trigger-with-not-for-replication-in-merge-replication-of-mssql

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