Sql-Server

暫停 AlwaysOn 可用性組複製以進行故障轉移

  • March 3, 2017

我們目前正在實施一個新的軟體包,它的一部分系統使用數據庫複製(但不支持 AlwaysOn 可用性組)從另一個支持 AOAG 的數據庫複製。

目前,他們只支持通過他們的安裝程序進行複制設置,這會一次性在發布者和訂閱者伺服器上創建整個配置。

它使用事務複製,並且有拉訂閱和推訂閱。

安裝程序在發布者上創建分發者,我假設它會在故障轉移後中斷複製,並需要生成新的快照和重新初始化訂閱。

假設我們正在進行計劃中的故障轉移(例如用於作業系統更新檔),希望暫停複製,直到我們可以通過分發伺服器故障轉移回節點。

我是否在正確的軌道上說“暫停”複製的最可靠方法是在故障轉移到(非分發器)節點之前在發布者(對於 PUSH)和訂閱者(對於 PULL)上使用 sp_MSstopdistribution_agent,然後執行sp_MSstartdistribution_agent 在我們再次故障恢復後?

我們在發布者和訂閱者上都使用 SQL 2014。

我認為你在這裡絕對正確:

安裝程序在發布者上創建分發者,我假設它會在故障轉移後中斷複製,並需要生成新的快照和重新初始化訂閱。

將複製與可用性組相關聯的一個好方法是:

主副本是 SP1,輔助副本是 SS2。分發器位於另一台伺服器 SD3 上。複製工作正常。我們使用以下腳本將原始發布者重定向到 AG 偵聽器名稱:

USE distribution;
GO  
EXEC sys.sp_redirect_publisher   
   @original_publisher = 'MyPublisher',  
   @publisher_db = 'MyPublishedDB',  
   @redirected_publisher = 'MyAGListenerName'; 

您可以在此連結上找到更多詳細資訊:

可用性組故障轉移後,複製日誌讀取器未更新到新的主數據庫

在 AlwaysOn 可用性組中,輔助數據庫不能是發布者。

不支持可用性數據庫上的分發伺服器故障轉移。

我建議您使用另一台伺服器作為分發伺服器,因為您可能已經這樣做了。

我通常使用另一台伺服器作為分銷商和幾個分銷商數據庫,具體取決於您的出版物的大小和繁忙程度。

我不完全確定推送訂閱,但對於其他內容,您可以查看此連結:

在屬於 AlwaysOn 可用性組的數據庫上設置複製

SRV1:原始發布者

SRV2:發布者副本

SRV3:發布者副本

SRV4:分發伺服器和訂閱伺服器(您也可以選擇一個全新的伺服器作為分發伺服器,但是在這種情況下,任何發布伺服器上都沒有分發伺服器,因為在這種情況下不支持分發伺服器的故障轉移)。

在此處輸入圖像描述

也許這不適用於您的情況,但僅供參考:

為 Always On 可用性組配置複製 (SQL Server)

我是否在正確的軌道上說“暫停”複製的最可靠方法是在故障轉移到(非分發器)節點之前在發布者(對於 PUSH)和訂閱者(對於 PULL)上使用 sp_MSstopdistribution_agent,然後執行sp_MSstartdistribution_agent 在我們再次故障恢復後?

我會說在大多數情況下是的,我曾經使用過您在此連結上看到的這些程序(包括腳本):

如何重啟事務複製的分發代理?

現在我更喜歡使用以下方法:

-- on the publisher
-- this gives you the distributor server name and distributor database name

sp_helpdistributor


-- now connect to the distributor server and database 
-- get the job name 

-- get the distributor job name for the publication you want
-- in this example my publication is called 'DEOrder'
use distribution
go

我的數據庫和出版物ATOrder在下面的範例中被呼叫。

-- the snapshot agent
select  job_name=name, publisher_db, publication from  distribution.dbo.mssnapshot_agents
where publisher_db = N'ATOrder'

-- the distributor jon transactional replication
select job_name=name, publisher_db, publication from  distribution.dbo.MSlogreader_agents
where publisher_db = N'ATOrder'

-- if it is merge replication
select  job_name=name, publisher_db, publication  from MSmerge_agents
where publisher_db = N'ATOrder'

-- who are my publishers and who are my subscribers
select * from MSsubscriber_info

-- just checking dbs
select * from MSpublisher_databases



-- get the distributor job (log reader) for a specific publication
select job_name=name, publisher_db, publication from  distribution.dbo.MSlogreader_agents
where publisher_db = N'ATOrder'

-- take note of the job name
--my_publication_server_name_and_instance2-ATOrder-25

-- check that the job is running at the moment - it must be!!
sp_runningjobs 'my_publication_server_name_and_instance2-ATOrder-25'


--check I am targeting the right job
exec msdb.dbo.sp_help_job @job_name = 'my_publication_server_name_and_instance2-ATOrder-25'

--stop the job
exec msdb.dbo.sp_stop_job @job_name = 'my_publication_server_name_and_instance2-ATOrder-25'

--start the job
exec msdb.dbo.sp_start_job @job_name = 'my_publication_server_name_and_instance2-ATOrder-25'

欲了解更多資訊,看看一切是否正常,或者誰和什麼變得有點慢,你可以查看這個連結:

使用 T-SQL 的複制監視器資訊

我們在發布者和訂閱者上都使用 SQL 2014。

幸運的你

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