若要容錯移轉,您必須先使用 Transact-SQL (T-SQL) 切換複寫模式 SQL Server 執行個體。
然後,您可以使用 PowerShell 來容錯移轉及切換角色。
切換複寫模式 (容錯移轉至 SQL MI)
SQL Server 與 SQL 受控執行個體之間的複寫預設為非同步。 如果您要從 SQL Server 容錯移轉至 Azure SQL 受控執行個體,請在容錯移轉資料庫之前,使用 Transact-SQL (T-SQL) 切換連結至 SQL Server 的同步處理模式。
注意
- 若您正在從 SQL 受控執行個體容錯移轉至 SQL Server 2022,請略過此步驟。
- 跨大型網路距離的同步複寫可能會讓主要複本上的交易變慢。
在 SQL Server 執行下列 T-SQL 指令碼,將分散式可用性群組的複寫模式從非同步變更為同步。進行下列取代:
-
<DAGName>
使用分散式可用性群組 (用來建立連結的群組) 的名稱。
-
<AGName>
使用在 SQL Server 上建立的可用性群組 (用來建立連結的群組) 的名稱。
- 將
<ManagedInstanceName>
取代為您的受控執行個體名稱。
-- Run on SQL Server
-- Sets the distributed availability group to a synchronous commit.
-- ManagedInstanceName example: 'sqlmi1'
USE master
GO
ALTER AVAILABILITY GROUP [<DAGName>]
MODIFY
AVAILABILITY GROUP ON
'<AGName>' WITH
(AVAILABILITY_MODE = SYNCHRONOUS_COMMIT),
'<ManagedInstanceName>' WITH
(AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
若要確認您已成功變更連結的複寫模式,請使用下列動態管理檢視。 結果表示 SYNCHRONOUS_COMMIT
狀態。
-- Run on SQL Server
-- Verifies the state of the distributed availability group
SELECT
ag.name, ag.is_distributed, ar.replica_server_name,
ar.availability_mode_desc, ars.connected_state_desc, ars.role_desc,
ars.operational_state_desc, ars.synchronization_health_desc
FROM
sys.availability_groups ag
join sys.availability_replicas ar
on ag.group_id=ar.group_id
left join sys.dm_hadr_availability_replica_states ars
on ars.replica_id=ar.replica_id
WHERE
ag.is_distributed=1
現在您已將 SQL Server 切換為同步提交模式,這兩個執行個體之間的複寫會是同步的。 如果您需要反轉此狀態,請遵循相同步驟,並設定 AVAILABILITY_MODE
為 ASYNCHRONOUS_COMMIT
。
檢查 SQL Server 和 SQL 受控執行個體上的 LSN 值
若要完成容錯移轉或移轉,請確認複寫至次要複本已完成。 為此,請確保 SQL Server 與 SQL 受控執行個體的記錄檔記錄中的記錄序號 (LSN) 相同。
一開始,預期主要複本上的 LSN 會高於次要複本上的 LSN。 網路延遲可能會導致複寫稍微落後於主要複本。 因為工作負載已在主要複本上停止,所以 LSN 會在一段時間後符合並停止改變。
在 SQL Server 上使用下列 T-SQL 查詢,讀取上次記錄的交易記錄 LSN。 將:
-
<DatabaseName>
使用您的資料庫名稱,並尋找最後一次強行寫入的 LSN 號碼。
-- Run on SQL Server
-- Obtain the last hardened LSN for the database on SQL Server.
SELECT
ag.name AS [Replication group],
db.name AS [Database name],
drs.database_id AS [Database ID],
drs.group_id,
drs.replica_id,
drs.synchronization_state_desc AS [Sync state],
drs.end_of_log_lsn AS [End of log LSN],
drs.last_hardened_lsn AS [Last hardened LSN]
FROM
sys.dm_hadr_database_replica_states drs
inner join sys.databases db on db.database_id = drs.database_id
inner join sys.availability_groups ag on drs.group_id = ag.group_id
WHERE
ag.is_distributed = 1 and db.name = '<DatabaseName>'
在 SQL 受控執行個體上使用下列 T-SQL 查詢,讀取您資料庫中最後一次強行寫入的 LSN。 將 <DatabaseName>
取代為您的資料庫名稱。
此查詢適用於一般用途 SQL 受控執行個體。 針對業務關鍵 SQL 受控執行個體,取消註解指令碼結尾的 and drs.is_primary_replica = 1
。 在業務關鍵服務層級上,此篩選可確保只會讀取主要複本詳細資料。
-- Run on SQL managed instance
-- Obtain the LSN for the database on SQL Managed Instance.
SELECT
db.name AS [Database name],
drs.database_id AS [Database ID],
drs.group_id,
drs.replica_id,
drs.synchronization_state_desc AS [Sync state],
drs.end_of_log_lsn AS [End of log LSN],
drs.last_hardened_lsn AS [Last hardened LSN]
FROM
sys.dm_hadr_database_replica_states drs
inner join sys.databases db on db.database_id = drs.database_id
WHERE
db.name = '<DatabaseName>'
-- for Business Critical, add the following as well
-- AND drs.is_primary_replica = 1
或者,您也可以使用 Get-AzSqlInstanceLink PowerShell 或 az sql mi link show Azure CLI 命令來擷取 SQL 受控執行個體上連結的 LastHardenedLsn
屬性,此屬性提供與上述 T-SQL 查詢相同的資訊。
重要
再次確認您的工作負載已在主要複本上停止。 確認 SQL Server 和 SQL 受控執行個體上的 LSN 相符,而且在一段時間內保持一致。 這兩個執行個體上的穩定 LSN 表示結尾記錄已複寫到次要複本,而且工作負載實際上已停止。
容錯移轉資料庫
如果您想要使用 PowerShell 在 SQL Server 2022 與 SQL 受控執行個體 之間容錯移轉資料庫,同時仍維持連結,或針對任何版本的 SQL Server 執行有資料遺失的容錯移轉,請使用 SSMS 中的 SQL Server 與受控執行個體之間的容錯移轉精靈來產生適合您環境的指令碼。 您可從主要或次要複本執行計劃性容錯移轉。 若要執行強制容錯移轉,請連線次要複本。
若要在容錯移轉或移轉資料庫時中斷連結並停止複寫,不論 SQL Server 版本為何,請使用 Remove-AzSqlInstanceLink PowerShell 或 az sql mi link delete Azure CLI 命令。
警告
- 在容錯移轉之前,請停止來源資料庫的工作負載,以便複寫資料庫可完全趕上並進行容錯移轉,而不會遺失資料。 如果執行強制容錯移轉,或在 LSN 相符之前中斷連結,您可能會遺失資料。
- 在 SQL Server 2019 與舊版容錯移轉資料庫會發生中斷並移除兩個複本之間的連結。 您無法容錯回復到初始主要複本。
下列範例指令碼會中斷連結並結束複本之間的複寫,在兩個執行個體上進行資料庫讀取/寫入。 將:
- 將
<ManagedInstanceName>
取代為您的受控執行個體名稱。
- 將
<DAGName>
取代為容錯移轉之連結的名稱 (稍早所執行命令 Name
輸出中的 Get-AzSqlInstanceLink
屬性)。
# Run in Azure Cloud Shell (select PowerShell console)
# =============================================================================
# POWERSHELL SCRIPT TO FAIL OVER OR MIGRATE DATABASE TO AZURE
# ===== Enter user variables here ====
# Enter your managed instance name – for example, "sqlmi1"
$ManagedInstanceName = "<ManagedInstanceName>"
$LinkName = "<DAGName>"
# ==== Do not customize the following cmdlet ====
# Find out the resource group name
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
# Failover the specified link
Remove-AzSqlInstanceLink -ResourceGroupName $ResourceGroup |
-InstanceName $ManagedInstanceName -Name $LinkName -Force
容錯移轉成功時,連結會卸除且不再存在。 由於 SQL Server 資料庫和 SQL 受控執行個體資料庫現已完全獨立,因此兩者都可執行讀取/寫入工作負載。
重要
在成功容錯移轉至 SQL 受控執行個體之後,請手動將應用程式連接字串重新指向 SQL 受控執行個體 FQDN,才能完成移轉或容錯移轉流程並繼續在 Azure 執行。
在卸除連結之後,您可以在 SQL Server 保留可用性群組,但您必須卸除分散式可用性群組,才能從 SQL Server 移除連結中繼資料。 僅當使用 PowerShell 進行容錯移轉時,才需要此額外步驟,因為 SSMS 會為您執行此動作。
若要卸除分散式可用性群組,請取代下列值,然後執行範例 T-SQL 程式碼:
-
<DAGName>
使用 SQL Server 上的分散式可用性群組 (用來建立連結的群組) 的名稱。
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <DAGName>
GO