Sql-Server

如果我只能訪問訂閱者,如何通過腳本永久刪除複製?

  • April 30, 2021

我們一直在建構數據庫的複製網路,以便在不支付全價的情況下為我們提供一定程度的 Always On。目前我們有一個發布者數據庫,它複製到少數訂閱者,因此如果發布者出現故障,我們可以將訂閱者提升為新發布者。事實上,這是一個乏味的手動過程,但我們希望開始編寫腳本元素,以便該過程更快,更接近自動化。

我們目前想要做的是為訂閱者製作一個腳本,以在舊發布者出現故障時禁用/刪除對舊發布者的訂閱。這是因為數據庫有時會在離線一段時間後重新線上 - 在這種情況下,我們不希望它對訂閱者產生任何進一步的複制影響,因為這可能會導致數據不一致。我們可能會清理舊發布者,因此如果其複制設置引發錯誤,這不是問題。

我已經嘗試過sp_subscription_cleanup簡單地顯示訂閱已消失,但它又回來了,並且數據繼續從發布者分發給它。我找到了一個關於此的MS 文件,但假設可以訪問發布者。

那麼是否有一種腳本方法可以僅從訂閱者那里永久終止訂閱?

附加資訊

我注意到您可以右鍵點擊訂閱並將其刪除,但我無法從該菜單中看到它正在執行的腳本。訂閱也返回了。

聽起來您要的是 is sp_removedbreplication,您會像這樣執行:

EXEC sp_removedbreplication @dbname = 'MySubscriberDb';

來自docs.microsoft.com

此儲存過程刪除所有複製對象…在 SQL Server 的訂閱伺服器實例上的訂閱數據庫上。在適當的數據庫中執行,或者如果在同一實例上的另一個數據庫的上下文中執行,請指定應刪除複製對象的數據庫。此過程不會從其他數據庫(例如分發數據庫)中刪除對象。

也就是說,這樣做可能無法解決您的問題,具體取決於您的配置。

選項 1) 更改複製拓撲

我還建議將您的分發代理配置為作為請求訂閱執行。這將使您能夠禁用與載入任何快照或事務相關的 SQL 代理作業。因為該作業在您的訂閱者身上,所以即使發布者/分發者處於離線狀態,您也可以禁用它。如果/當發布者/分發者聯機時,您無需擔心將事務/快照載入到訂閱者,直到您明確重新啟用分發代理作業。請注意,如果您這樣做,則不需要使用sp_removedbreplication.

選項 2) 以另一種方式更改複製拓撲

您的分發數據庫是否與主伺服器位於同一台伺服器上?如果您將分發數據庫和作業移動到專用分發伺服器,那麼這將提供與選項 1 類似的好處。此外,您將有權訪問分發數據庫,以便從複製元數據中添加/刪除訂閱資訊。

選項 3) 撤銷權限

您還可以評估您的分發代理正在使用的權限。通過撤銷遠端分發代理的權限,您可以阻止分發代理登錄到數據庫以重新建立複製。

選項 4) 複製真的是正確的選擇嗎?

當您詢問複製時,我會挑戰您詢問複製是否是您需要的正確選擇。聽起來您正在使用複制來實現高可用性/災難恢復 (HA/DR)。複製對於 HA/DR 來說不是一個很好的選擇。您可能會發現可用性組可提供更好的 HA/DR 解決方案。它們面臨不同的挑戰,但專門為解決 HA/DR 需求而建構,並確保只有一個可寫的主數據庫,以避免這一特殊挑戰。

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