Stories

Detail Return Return

暫停和恢復(Suspend and Resume)Always On數據庫副本之間的數據同步(譯) - Stories Detail

原文地址:https://www.sqlshack.com/suspend-and-resume-data-movement-in-sql-server-always-on-availability-groups/
 
 
在關於SQLServer 2016 Always On的第26篇文章中,我們將會討論Always On數據庫副本之間的掛起和恢復流程
 

要求

我們可以配置SQLServer的Always On Group為同步或者異步模式,取決於應用程序的重要程度,是否可接受數據丟失,災備恢復性,網絡帶寬等等因素。
假設我們需要重啓服務器來應用OS層面的補丁,SQL補丁,計劃內的重啓,OS相關的異常,通常,我們需要按照如下順序來避免任何的自動故障轉移。
1,首先重啓從節點
2,AG故障轉移(從節點接替主節點提供讀寫服務)
3,重啓原主節點
 
在同步提交模式 下,主副本在提交之前會等待輔助副本的確認。如果在輔助副本上停止了 SQL 服務,SQL Server 會立即將同步方式切換為異步模式。
一旦輔助副本重新建立連接,數據同步又會恢復為同步提交。在按照順序重啓服務器的過程中,可能會導致數據同步的中斷。
假設另一種情況:你實現了雙副本同步數據提交,並且兩台服務器位於不同的機房。此時,網絡團隊通知你兩個站點之間將出現網絡中斷或連接變慢的情況。
一種緩解數據同步的方法是將模式切換為異步模式。在這種模式下,主副本在提交時不再等待輔助副本的確認。然而,在網絡波動的情況下,可能會出現 數據包丟失,這可能會對輔助副本的數據同步造成問題。
 
在本文中,我們將尋找以下問題的答案:
1,我們是否可以暫停主副本到輔助副本的數據傳輸?
2,如果存在多個輔助副本,是否可以僅暫停某個特定輔助副本的數據傳輸?
3,在暫停數據傳輸的情況下,對主副本會有什麼影響?
4,如何恢復主副本到輔助副本的數據傳輸?
 

環境:

你需要先閲讀前面幾篇文章(文末的目錄 ToC),並配置兩個或多個節點的 SQL Server Always On可用性組(來作為測試環境)。
在本文中,我們使用以下 雙節點 AG 副本環境:
主副本:SQLNode2\INST1
輔助副本:SQLNode1\INST1
AG 數據庫:SQLShackDemo
 

SQL Server Always On Availability Groups中暫停數據傳輸

SQL Server Always On 有兩種副本:主副本和輔助副本。主副本既支持只讀事務,也支持寫事務。輔助副本可以配置為允許只讀連接,但在它發生故障轉移並接管為主副本之前,不能對其寫入數據。
數據傳輸是從主副本到輔助副本的,我們可以在主副本或輔助副本上暫停這種數據傳輸。可以使用SSMS圖形界面、T-SQL或PowerShell腳本來暫停數據傳輸。
 

從主副本上執行暫停數據傳輸

如果我們連接到主 SQL 實例並停止數據傳輸,那麼它會停止所有已連接的輔助副本的數據傳輸。SQL Server允許最多5個同步副本(1個主副本和4個輔助副本)。
我們無法在主SQ 實例上僅停止某一個特定輔助副本的數據傳輸。
一旦我們停止了數據傳輸,主副本仍能正常工作,並且可供客户端連接使用。如果你使用可讀的輔助副本,那麼現有連接和新的連接都能正常工作。
 

從輔助副本上執行暫停數據傳輸

我們也可以僅暫停某一個特定輔助副本的數據傳輸。為此,你需要連接到對應的SQL實例並停止數據傳輸。
如果在多個輔助副本的場景下僅暫停某個輔助副本的數據傳輸,不會影響其他副本,其他輔助副本仍會正常接收數據。被暫停的本地輔助副本數據庫會顯示狀態 NOT SYNCHRONIZING。
在可讀輔助副本的情況下,它將不允許建立新的連接,但已有的連接仍然可以繼續工作。
 

SQL Server Always On Availability Groups中如何暫停數據傳輸

從主副本和輔助副本暫停數據傳輸的過程是相同的,但你需要連接到合適的實例。
在 SSMS 中連接到SQL實例,導航到Always On可用性組 -> 可用性組 -> 可用性數據庫。
image
右鍵點擊要暫停數據傳輸的數據庫
image
相應地,可以使用如下腳本來完成該操
ALTER DATABASE [SQLShackdemo] SET HADR SUSPEND
GO

操作完成後,它會在數據庫前加上一個暫停符號,以表明數據傳輸已停止。(譯者注:SQLServer 2019下暫停數據同步之後,數據庫上是一個?的符號,不是暫停符號,主節點並不顯示紅叉的符號)

image
 
如果你從主副本上暫停數據同步,然後在副本副本上查看的時候,將會看到一個紅叉的標記
image
在AG的dashboard上,又會得到一個警告和錯誤信息,因為數據庫沒有處於同步狀態。
image
 

暫停數據同步對主副本數據庫的影響

通常情況下,在單實例數據庫中,SQL Server 會在日誌備份後截斷事務日誌。對於同步可用性組,在執行日誌備份時,它也會在checkpoint截斷日誌,因為它會先在輔助副本上提交數據。
現在,如果我們暫停了數據同步,主副本數據庫會繼續保留事務日誌。即使你定期執行事務日誌備份,它也不會截斷日誌。這可能會導致事務日誌被填滿,從而引發磁盤空間不足的問題。因此,不建議長時間暫停數據傳輸,尤其是在高併發 OLTP 環境下。
但是,如果仍然遇到事務日誌已滿的問題,你需要考慮增加磁盤空間、恢復數據傳輸,或者移除可用性組數據庫。

 

 

恢復Always On Availability Groups 數據傳輸

要恢復從主副本到輔助副本的數據傳輸,請右鍵點擊可用性組中的數據庫,然後點擊“恢復數據傳輸”。
image

相應地,您也可以運行以下的 T-SQL 腳本。

ALTER DATABASE [SQLShackdemo] SET HADR RESUME;
GO

如果我們是從主副本暫停的數據傳輸,也應該從主副本恢復數據傳輸。這會恢復所有輔助副本的數據傳輸。
然而,如果我們是在輔助實例本地暫停的數據傳輸,則必須從該輔助實例恢復。恢復後,它會捕獲所有待處理的事務日誌,並根據配置將數據庫狀態更改為 Synchronized/ synchronizing。在與主副本完全同步之前,輔助數據庫會以 異步數據提交 的方式工作。
這些操作也會記錄在 SQL Server 錯誤日誌中。下圖中,我們可以看到一些關於暫停、恢復和恢復 LSN 的高亮日誌。

image
 
 

通過DMV動態管理視圖來監控數據移動的暫停與恢復情況

我們可以利用動態管理視圖來監控數據從主副本向從副本的轉移情況。

SELECT
    ar.replica_server_name,
    adc.database_name,
    ag.name AS ag_name,
    dhdrs.synchronization_state_desc,
    dhdrs.is_commit_participant,
    dhdrs.last_sent_lsn,
    dhdrs.last_sent_time,
    dhdrs.last_received_lsn,
    dhdrs.last_hardened_lsn,
    dhdrs.last_redone_time
FROM sys.dm_hadr_database_replica_states AS dhdrs
INNER JOIN sys.availability_databases_cluster AS adc
    ON dhdrs.group_id = adc.group_id AND
    dhdrs.group_database_id = adc.group_database_id
INNER JOIN sys.availability_groups AS ag
    ON ag.group_id = dhdrs.group_id
INNER JOIN sys.availability_replicas AS ar
    ON dhdrs.group_id = ar.group_id AND
    dhdrs.replica_id = ar.replica_id
where database_name='SQLShackDemo'

在下面的輸出中,我們捕獲了 LSN 和 提交參與者 的詳細信息,場景如下:

第一部分:數據庫在兩個副本中均處於同步狀態
  is_commit_participant 列顯示為 1,表示我們配置了 同步提交模式,且兩個副本都參與數據提交。
  在主副本和輔助副本中,last_hardened_lsn 顯示相同的值,同時它也等於 SQLNode\INST1 實例中的 last_sent_lsn。

第二部分:暫停主副本與輔助副本之間的數據傳輸後
  輔助副本 SQLNode\INST1 的 is_commit_participant 顯示為 0,表示輔助副本不參與提交(暫停狀態)。
  雖然配置了同步提交模式,此時 AG 實際上以 異步提交 方式工作。
  可以看到兩個副本的 last_hardened_lsn 出現差異。
  在暫停狀態下,輔助副本無法接收事務塊,因此不會在輔助數據庫上應用任何日誌。

第三部分:恢復數據傳輸後
  is_commit_participant 再次標記為 1,輔助副本重新處於同步狀態。
  兩個副本的 last_hardened_lsn 再次匹配。

image
 
 

總結

在本文中,我們探討了 SQL Server 始終在線可用性組中的數據傳輸暫停與恢復問題。在工作完成後,您必須恢復數據傳輸,以便控制主副本數據庫的事務日誌增長情況。
 

Add a new Comments

Some HTML is okay.