共用方式為


疑難解答連結 - Azure SQL 受控實例

適用於:Azure SQL 受控實例

本文說明如何監控和疑難排解 SQL Server 與 Azure SQL 受控實例之間的 鏈接問題。

您可以使用 Transact-SQL(T-SQL)、Azure PowerShell 或 Azure CLI 來檢查連結的狀態。 如果您遇到問題,您可以使用錯誤碼來針對問題進行疑難解答。

建立連結的許多問題都可以透過 檢查兩個實例之間的網路 來解決,並驗證環境 是否已正確準備以建立連結

如果您遇到連結的問題,您可以使用 Transact-SQL (T-SQL)、Azure PowerShell 或 Azure CLI 來取得連結目前狀態的相關信息。

使用 T-SQL 取得鏈接狀態的快速狀態詳細數據,然後使用 Azure PowerShell 或 Azure CLI 取得連結目前狀態的完整資訊。

使用 T-SQL 來判斷植入階段期間或數據同步處理開始之後的鏈接狀態。

使用下列 T-SQL 查詢,在裝載透過連結植入之資料庫的 SQL Server 或 SQL 受控實例的植入階段,判斷鏈接的狀態:

SELECT
    ag.local_database_name AS 'Local database name',
    ar.current_state AS 'Current state',
    ar.is_source AS 'Is source',
    ag.internal_state_desc AS 'Internal state desc',
    ag.database_size_bytes / 1024 / 1024 AS 'Database size MB',
    ag.transferred_size_bytes / 1024 / 1024 AS 'Transferred MB',
    ag.transfer_rate_bytes_per_second / 1024 / 1024 AS 'Transfer rate MB/s',
    ag.total_disk_io_wait_time_ms / 1000 AS 'Total Disk IO wait (sec)',
    ag.total_network_wait_time_ms / 1000 AS 'Total Network wait (sec)',
    ag.is_compression_enabled AS 'Compression',
    ag.start_time_utc AS 'Start time UTC',
    ag.estimate_time_complete_utc as 'Estimated time complete UTC',
    ar.completion_time AS 'Completion time',
    ar.number_of_attempts AS 'Attempt No'
FROM sys.dm_hadr_physical_seeding_stats AS ag
    INNER JOIN sys.dm_hadr_automatic_seeding AS ar
    ON local_physical_seeding_id = operation_id

-- Estimated seeding completion time
SELECT DISTINCT CONVERT(VARCHAR(8), DATEADD(SECOND, DATEDIFF(SECOND, start_time_utc, estimate_time_complete_utc) ,0), 108) as 'Estimated complete time'
FROM sys.dm_hadr_physical_seeding_stats

如果查詢未傳回任何結果,則植入程式尚未啟動或已完成。

主要 實例上使用下列 T-SQL 查詢,在數據同步處理開始后檢查連結的健康情況:

DECLARE @link_name varchar(max) = '<DAGname>'
SELECT
   rs.synchronization_health_desc [Link sync health]
FROM
   sys.availability_groups ag 
   join sys.dm_hadr_availability_replica_states rs 
   on ag.group_id = rs.group_id 
WHERE 
   rs.is_local = 0 AND rs.role = 2 AND ag.is_distributed = 1 AND ag.name = @link_name 
GO

此查詢會傳回下列可能的值:

  • 沒有結果:查詢是在次要實例上執行。
  • HEALTHY:連結狀況良好,數據在複本之間同步中。
  • NOT_HEALTHY:連結異常,數據未在複本之間同步。

replicaState 值描述目前的連結。 如果狀態中也包含錯誤,則在執行狀態中列出的作業時發生了錯誤。 例如,LinkCreationError 表示建立連結時發生錯誤。

一些可能的 replicaState 值為:

  • CreatingLink:初始化播種
  • LinkSynchronizing:數據複寫正在進行中
  • LinkFailoverInProgress:故障轉移正在進行中

如需鏈接狀態屬性的完整清單,請檢閱 分散式可用性群組 - GET REST API 命令。

有兩個不同的錯誤類別您可能會遇到:一是在您嘗試初始化連結時發生的錯誤,另一是在您嘗試建立連結時發生的錯誤。

初始化連結時,可能會發生下列錯誤(鏈接狀態:LinkInitError):

  • 錯誤 41962:作業已中止,因為連結未在 5 分鐘內起始。 請檢查 網路連線,然後再試一次。
  • 錯誤 41973:無法建立連接,因為來自 SQL Server 的 端點憑證未正確匯入 Azure SQL 受控實例。
  • 錯誤 41974:無法建立連線,因為來自 SQL 受控實例的端點憑證 未正確匯入 SQL Server。
  • 錯誤 41976:可用性群組沒有回應。 檢查名稱和組態參數,然後再試一次。
  • 錯誤 41986:無法建立連結,因為連線失敗或次要複本沒有回應。 檢查名稱、組態參數和 網路連線,然後再試一次。
  • 錯誤 47521:無法建立連結,因為輔助伺服器未收到要求。 請確定主伺服器上的可用性群組和資料庫狀況良好,然後再試一次。

建立連結時可能會發生下列錯誤(連結狀態: LinkCreationError):

  • 錯誤 41977:目標資料庫沒有回應。 請檢查鏈接參數,然後再試一次。

強制倒換之後的狀態不一致

在強制 故障轉移之後,您可能會遇到一個分裂腦情境,兩個副本都處於主要角色,使鏈接處於不一致的狀態。 如果您在災害期間切換到次要複本,然後主要複本重新恢復運行,就會發生這種情況。

首先,請確認您是否處於腦裂狀況中。 您可以使用 SQL Server Management Studio (SSMS) 或 Transact-SQL (T-SQL) 來執行此動作。

連線到 SSMS 中的 SQL Server 和 SQL 受控實例,然後在 [物件總管]中,展開 [可用性] 群組 下的 [可用性] 群組 節點,AlwaysOn 高可用性。 如果兩個不同的複本列為 (主要),您就會處於分割腦案例中。

或者,您可以在 SQL Server 和 SQL 受控實例上執行下列 T-SQL 腳本,以檢查複本的角色:

-- Execute on SQL Server and SQL Managed Instance 
USE master
DECLARE @link_name varchar(max) = '<DAGName>'
SELECT
   ag.name [Link name], 
   rs.role_desc [Link role] 
FROM
   sys.availability_groups ag 
   JOIN sys.dm_hadr_availability_replica_states rs 
   ON ag.group_id = rs.group_id 
WHERE 
   rs.is_local = 1 AND ag.is_distributed = 1 AND ag.name = @link_name 
GO

如果這兩個實例在 Link 角色 欄列出 PRIMARY,您就會處於分裂腦狀態。

若要解決腦裂狀態,請先在原始的主要副本上進行備份。 如果原始主伺服器是 SQL Server,則請取得 尾端日誌備份。 如果原始主資料庫是 SQL 管理實例,則執行 僅複製完整備份。 備份完成之後,請將分散式可用性群組設定為複本的次要角色,這些複本曾經是原始的主要複本,但現在會是新的次要複本。

例如,在發生真正的災害時,假設您已強制將 SQL Server 工作負載故障轉移至 Azure SQL 受控實例,並且您希望繼續在 SQL 受控實例上運行工作負載,請先在 SQL Server 上進行尾日誌備份,然後在 SQL Server 上將分散式可用性群組設定為次要角色,如以下範例所示。

--Execute on SQL Server 
USE master
ALTER AVAILABILITY GROUP [<DAGName>] 
SET (ROLE = SECONDARY) 
GO 

接下來,使用 鏈接執行從 SQL 受控實例到 SQL Server 的規劃手動故障轉移,例如下列範例:

--Execute on SQL Managed Instance 
USE master
ALTER AVAILABILITY GROUP [<DAGName>] FAILOVER 
GO 

測試網路連線能力

需要 SQL Server 與 SQL 受控實例之間的雙向網路連線,連結才能運作。 在 SQL Server 端開啟埠並在 SQL 受控實例端設定 NSG 規則之後,請使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 來測試連線能力。

在 SQL Server 和 SQL 受控實例上建立暫存 SQL Agent 作業來測試網路,以檢查兩個實例之間的連線。 當您在 SSMS 中使用 網路檢查程式 時,系統會自動為您建立作業,並在測試完成之後刪除。 如果您使用 T-SQL 測試網路,則必須手動刪除 SQL Agent 作業。

注意

目前不支援在Linux上的SQL Server 上由 SQL Server Agent 執行 PowerShell 腳本,因此目前無法從 Linux 上的 SQL Server 上的 SQL Server Agent 作業執行 Test-NetConnection

若要使用 SQL Agent 測試網路連線能力,您需要下列需求:

若要在 SSMS 中測試 SQL Server 與 SQL 受控實例之間的網路連線,請遵循下列步驟:

  1. 連接到將在 SSMS 中作為主要副本的資料庫實例。

  2. [物件總管]中,展開資料庫,並以滑鼠右鍵點選您想要連結至副資料庫的資料庫。 選取 [工作>Azure SQL 受控實例] 連結>[測試連線],以開啟 [網络檢查程式] 精靈:

    SSMS 中物件總管的螢幕快照,在資料庫連結的右鍵選單中選取了“測試連線”選項。

  3. 網路檢查 精靈的 [簡介] 頁面上,選取 [下一步]。

  4. 如果在 必要條件 頁面上符合所有需求,請選擇 下一步。 否則,請解決任何未符合的必要條件,然後選取 [重新執行驗證]

  5. 在 [登入] 頁面上,選取 [登入] 以連線到作為次要複本的其他實例。 選取 [下一步]

  6. 檢查 [指定網路選項 頁面的詳細數據,並視需要提供IP位址。 選取 [下一步]。

  7. 在 [摘要] 頁面上,檢閱精靈執行的動作,然後選擇 [完成] 來驗證兩個複本之間的連線。

  8. 檢閱 [結果] 頁面,來確認兩個副本之間有無連線,然後選取 [關閉] 完成。

謹慎

只有在您已驗證來源與目標環境之間的網路連線能力時,才能繼續進行後續步驟。 否則,請先針對網路連線問題進行疑難解答,再繼續進行。

如需連結功能的詳細資訊,請檢閱下列資源: