適用於:
Azure SQL 受控實例
本文說明如何監控和疑難排解 SQL Server 與 Azure SQL 受控實例之間的 鏈接問題。
您可以使用 Transact-SQL(T-SQL)、Azure PowerShell 或 Azure CLI 來檢查連結的狀態。 如果您遇到問題,您可以使用錯誤碼來針對問題進行疑難解答。
建立連結的許多問題都可以透過 檢查兩個實例之間的網路 來解決,並驗證環境 是否已正確準備以建立連結。
初期播種
在 SQL Server 與 Azure SQL 受控實例之間建立連結時,數據復寫開始前會有初始植入階段。 初始植入階段這部分是最長且最昂貴的作業。 初始種子完成後,資料同步進行,且只有後續的資料變更會被複製。 初始植入完成所需的時間取決於數據大小、主資料庫上的工作負載強度,以及主要和次要復本網路之間的連結速度。
如果兩個執行個體之間的連線速度低於必要的標準,則初始化的時間可能會受到明顯的影響。 您可以使用已陳述的植入速度、總數據大小,以及連結速度來估計初始植入階段在數據復寫開始前所花費的時間長度。 例如,對於單一 100 GB 資料庫,如果鏈接能夠每小時推送 84 GB,而且沒有其他資料庫植入到不同的連結,初始種子階段大約需要 1.2 小時的時間。 如果連結每小時只能傳送 10 GB,則植入一個 100-GB 的資料庫,大約需要 10 小時。 如果有多個資料庫可透過多個鏈接進行複寫,則會以平行方式執行植入,而且結合緩慢的連結速度時,初始植入階段可能需要相當長的時間,特別是如果來自所有資料庫的平行植入數據超過可用的連結頻寬。
初始播種階段不具備對網路中斷以及執行個體維護或容錯移轉作業的復原能力。 如果 SQL Server 與 SQL 受控執行個體之間的雙向連線暫時中斷,或者在初始植入階段期間 SQL Server 或 SQL 受控執行個體被重新啟動或發生容錯移轉,植入將會重新開始。
這很重要
初始播種階段可能需要幾天的時間,速度極低或繁忙的連線。 在此情況下,建立連結可能會逾時。建立連結會在 6 天后自動取消。
檢查連結狀態
如果您遇到鏈接的問題,您可以使用 SQL Server Management Studio (SSMS)、Transact-SQL (T-SQL)、Azure PowerShell 或 Azure CLI 來取得連結目前狀態的相關信息。
使用 T-SQL 取得鏈接狀態的快速狀態詳細數據,然後使用 Azure PowerShell 或 Azure CLI 取得連結目前狀態的完整資訊。
鏈接監視是從 SQL Server Management Studio (SSMS) 21.0 開始提供(預覽版)。
若要檢查 SSMS 中的連結狀態,請遵循下列步驟:
連接到裝載連結的複本。
在 [物件總管] 中,展開 [Always On 高可用性],然後展開 [可用性群組]。
以滑鼠右鍵按一下連結的名稱,然後選取 屬性 以開啟 連結屬性 視窗:
[ 鏈接屬性 ] 視窗會顯示連結的實用資訊,例如複本資訊、鏈接狀態和端點憑證到期日:
使用 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:連結異常,數據未在複本之間同步。
使用 Get-AzSqlInstanceLink 取得 PowerShell 的鏈接狀態資訊。
在 Azure Cloud Shell 中執行下列範例程式代碼,或在本機安裝 Az.SQL 模組。
$ManagedInstanceName = "<ManagedInstanceName>" # The name of your linked SQL Managed Instance
$DAGName = "<DAGName>" # distributed availability group name
# Find out the resource group name
$ResourceGroupName = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
# Show link state details
(Get-AzSqlInstanceLink -ResourceGroupName $ResourceGroupName -InstanceName $ManagedInstanceName -Name $DAGName).Databases
使用 az sql mi link show 來取得 Azure CLI 的鏈接狀態資訊。
# type "az" to use Azure CLI
managedInstanceName = "<ManagedInstanceName>" # The name of your linked SQL Managed Instance
dagName = "<DAGName>" # distributed availability group name
rgName = "<RGName>" # the resource group for the linked SQL Managed Instance
# Print link state details
az sql mi link show –-resource-group $rgName –-instance-name $managedInstanceName –-name $dagName
replicaState 值描述目前的連結。 如果狀態中也包含錯誤,則在執行狀態中列出的作業時發生了錯誤。 例如,LinkCreationError 表示建立連結時發生錯誤。
一些可能的 replicaState 值為:
-
CreatingLink:初始化播種
-
LinkSynchronizing:數據複寫正在進行中
-
LinkFailoverInProgress:故障轉移正在進行中
如需鏈接狀態屬性的完整清單,請檢閱 分散式可用性群組 - GET REST API 命令。
連結的錯誤
有兩個不同的錯誤類別您可能會遇到:一是在您嘗試初始化連結時發生的錯誤,另一是在您嘗試建立連結時發生的錯誤。
初始化 sql-server-2016-database-engine-events-and-errors-1000-1999 的鏈接時發生錯誤
初始化連結時,可能會發生下列錯誤(鏈接狀態:LinkInitError):
-
錯誤 41962:作業已中止,因為連結未在 5 分鐘內起始。 請檢查 網路連線,然後再試一次。
- 錯誤 41973:無法建立連接,因為來自 SQL Server 的 端點憑證未正確匯入 Azure SQL 受控實例。
-
錯誤 41974:無法建立連線,因為來自 SQL 受控實例的端點憑證 未正確匯入 SQL Server。
-
錯誤 41976:可用性群組沒有回應。 檢查名稱和組態參數,然後再試一次。
-
錯誤 41986:無法建立連結,因為連線失敗或次要複本沒有回應。 檢查名稱、組態參數和 網路連線,然後再試一次。
-
錯誤 47521:無法建立連結,因為輔助伺服器未收到要求。 請確定主伺服器上的可用性群組和資料庫狀況良好,然後再試一次。
建立連結時發生錯誤
建立連結時可能會發生下列錯誤(連結狀態: ): LinkCreationError
錯誤 41977:目標資料庫沒有回應。 請檢查鏈接參數,然後再試一次。
過早的日誌截斷:如果在初始播種完成之前截斷交易日誌,您可能會看到下列其中之一錯誤:
-
錯誤 1408:無法復原資料庫 「%.*ls」 的遠端複本,足以啟用資料庫鏡像或將其加入可用性群組。
-
錯誤 1412:資料庫 「%.*ls」 的遠端複本尚未向前復原到資料庫記錄的本機複本內含的時間點。
若要解決此問題,您必須 卸除 並重新建立連結。
若要避免此問題,請在 SQL Server 上暫停事務歷史記錄備份,以在初始植入階段複寫資料庫。
強制倒換之後的狀態不一致
在強制 故障轉移之後,您可能會遇到一個分裂腦情境,兩個副本都處於主要角色,使鏈接處於不一致的狀態。 如果您在災害期間切換到次要複本,然後主要複本重新恢復運行,就會發生這種情況。
首先,請確認您是否處於腦裂狀況中。 您可以使用 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 測試網路連線能力,您需要下列需求:
請考慮下列事項:
- 為避免誤報,網路路徑上的所有防火牆必須允許網際網路控制訊息協定(ICMP)流量。
- 為避免誤報,網路路徑上的所有防火牆必須允許使用專有的 SQL Server UCS 協定進行流量。 阻擋協定可能導致連線測試成功,但連結無法建立。
- 具備封包層級防護的進階防火牆設置,必須妥善配置,以允許 SQL Server 與 SQL 管理實例之間的流量。
若要在 SSMS 中測試 SQL Server 與 SQL 受控實例之間的網路連線,請遵循下列步驟:
連接到將在 SSMS 中作為主要副本的資料庫實例。
在 [物件總管]中,展開資料庫,並以滑鼠右鍵點選您想要連結至副資料庫的資料庫。 選取 [工作>Azure SQL 受控實例] 連結>[測試連線],以開啟 [網络檢查程式] 精靈:
在 網路檢查 精靈的 [簡介] 頁面上,選取 [下一步]。
如果在 必要條件 頁面上符合所有需求,請選擇 下一步。 否則,請解決任何未符合的必要條件,然後選取 [重新執行驗證]。
在 [登入] 頁面上,選取 [登入] 以連線到作為次要複本的其他實例。 選取 [下一步]。
檢查 [指定網路選項 頁面的詳細數據,並視需要提供IP位址。 選取 [下一步]。
在 [摘要] 頁面上,檢閱精靈執行的動作,然後選擇 [完成] 來驗證兩個複本之間的連線。
檢閱 [結果] 頁面,來確認兩個副本之間有無連線,然後選取 [關閉] 完成。
若要使用 T-SQL 來測試連線能力,您必須檢查兩個方向的連線。 首先,測試從 SQL Server 到 SQL 受控實例的連線,然後測試從 SQL 受控實例到 SQL Server 的連線。
測試從 SQL Server 到 SQL 受控實例的連線
在 SQL Server 上使用 SQL Server Agent 來執行從 SQL Server 到 SQL 受控實例的連線測試。
線上到 SQL 受控實例,然後執行下列腳本來產生您稍後需要的參數:
SELECT 'DECLARE @serverName NVARCHAR(512) = N''' + value + ''''
FROM sys.dm_hadr_fabric_config_parameters
WHERE parameter_name = 'DnsRecordName'
UNION
SELECT 'DECLARE @node NVARCHAR(512) = N''' + NodeName + '.' + Cluster + ''''
FROM (
SELECT SUBSTRING(replica_address, 0, CHARINDEX('\', replica_address)) AS NodeName,
RIGHT(service_name, CHARINDEX('/', REVERSE(service_name)) - 1) AppName,
JoinCol = 1
FROM sys.dm_hadr_fabric_partitions fp
INNER JOIN sys.dm_hadr_fabric_replicas fr
ON fp.partition_id = fr.partition_id
INNER JOIN sys.dm_hadr_fabric_nodes fn
ON fr.node_name = fn.node_name
WHERE service_name LIKE '%ManagedServer%'
AND replica_role = 2
) t1
LEFT JOIN (
SELECT value AS Cluster,
JoinCol = 1
FROM sys.dm_hadr_fabric_config_parameters
WHERE parameter_name = 'ClusterName'
) t2
ON (t1.JoinCol = t2.JoinCol)
INNER JOIN (
SELECT [value] AS AppName
FROM sys.dm_hadr_fabric_config_parameters
WHERE section_name = 'SQL'
AND parameter_name = 'InstanceName'
) t3
ON (t1.AppName = t3.AppName)
UNION
SELECT 'DECLARE @port NVARCHAR(512) = N''' + value + ''''
FROM sys.dm_hadr_fabric_config_parameters
WHERE parameter_name = 'HadrPort';
結果看起來應該像下列範例:
DECLARE @node NVARCHAR(512) = N'DB123.tr123456.west-us.worker.database.windows.net'
DECLARE @port NVARCHAR(512) = N'11002'
DECLARE @serverName NVARCHAR(512) = N'contoso-instance.12345678.database.windows.net'
儲存結果以使用後續步驟。 由於這些參數可以在任何故障轉移之後變更,因此如有必要,請務必再次產生這些參數。
連接到您的 SQL Server 實例。
開啟新的查詢視窗,並貼上下列文稿:
--START
-- Parameters section
DECLARE @node NVARCHAR(512) = N''
DECLARE @port NVARCHAR(512) = N''
DECLARE @serverName NVARCHAR(512) = N''
--Script section
IF EXISTS (
SELECT job_id
FROM msdb.dbo.sysjobs_view
WHERE name = N'TestMILinkConnection'
)
EXEC msdb.dbo.sp_delete_job @job_name = N'TestMILinkConnection',
@delete_unused_schedule = 1
DECLARE @jobId BINARY (16),
@cmd NVARCHAR(MAX)
EXEC msdb.dbo.sp_add_job @job_name = N'TestMILinkConnection',
@enabled = 1,
@job_id = @jobId OUTPUT
SET @cmd = (N'tnc ' + @serverName + N' -port 5022 | select ComputerName, RemoteAddress, TcpTestSucceeded | Format-List')
EXEC msdb.dbo.sp_add_jobstep @job_id = @jobId,
@step_name = N'Test Port 5022',
@step_id = 1,
@cmdexec_success_code = 0,
@on_success_action = 3,
@on_fail_action = 3,
@subsystem = N'PowerShell',
@command = @cmd,
@database_name = N'master'
SET @cmd = (N'tnc ' + @node + N' -port ' + @port + ' | select ComputerName, RemoteAddress, TcpTestSucceeded | Format-List')
EXEC msdb.dbo.sp_add_jobstep @job_id = @jobId,
@step_name = N'Test HADR Port',
@step_id = 2,
@cmdexec_success_code = 0,
@subsystem = N'PowerShell',
@command = @cmd,
@database_name = N'master'
EXEC msdb.dbo.sp_add_jobserver @job_id = @jobId,
@server_name = N'(local)'
GO
EXEC msdb.dbo.sp_start_job @job_name = N'TestMILinkConnection'
GO
--Check status every 5 seconds
DECLARE @RunStatus INT
SET @RunStatus = 10
WHILE (@RunStatus >= 4)
BEGIN
SELECT DISTINCT @RunStatus = run_status
FROM [msdb].[dbo].[sysjobhistory] JH
INNER JOIN [msdb].[dbo].[sysjobs] J
ON JH.job_id = J.job_id
WHERE J.name = N'TestMILinkConnection'
AND step_id = 0
WAITFOR DELAY '00:00:05';
END
--Get logs once job completes
SELECT [step_name],
SUBSTRING([message], CHARINDEX('TcpTestSucceeded', [message]), CHARINDEX('Process Exit', [message]) - CHARINDEX('TcpTestSucceeded', [message])) AS TcpTestResult,
SUBSTRING([message], CHARINDEX('RemoteAddress', [message]), CHARINDEX('TcpTestSucceeded', [message]) - CHARINDEX('RemoteAddress', [message])) AS RemoteAddressResult,
[run_status],
[run_duration],
[message]
FROM [msdb].[dbo].[sysjobhistory] JH
INNER JOIN [msdb].[dbo].[sysjobs] J
ON JH.job_id = J.job_id
WHERE J.name = N'TestMILinkConnection'
AND step_id <> 0
--END
將 @node、@port和 @serverName 參數替換為您從第一個步驟獲得的值。
執行腳本並檢查結果。 您應該會看到結果,例如下列範例:
確認結果:
- TcpTestSucceeded 的每個測試結果應為
TcpTestSucceeded : True。
- RemoteAddresses 應位於 SQL 管理執行個體子網的 IP 範圍之內。
如果回應失敗,請確認下列網路設定:
- 網路防火牆 和 SQL Server 主機 OS(Windows/Linux)防火牆 都有規則,允許流量進入 SQL Managed Instance(SQL 受控實例)的整個 子網 IP 範圍。
- NSG 規則允許裝載 SQL 受控實例的虛擬網路埠 5022 上的通訊。
測試從 SQL 受控實例到 SQL Server 的連線
若要檢查 SQL 受控實例是否可以連線到 SQL Server,請先建立測試端點。 然後使用 SQL Server Agent 來執行 PowerShell 腳本,並使用從 SQL 受控實例的埠 5022 上 ping SQL Server 的 tnc 命令。
若要建立測試端點,請連線到 SQL Server 並執行下列 T-SQL 腳本:
-- Run on SQL Server
-- Create the certificate needed for the test endpoint
USE MASTER
CREATE CERTIFICATE TEST_CERT
WITH SUBJECT = N'Certificate for SQL Server',
EXPIRY_DATE = N'3/30/2051'
GO
-- Create the test endpoint on SQL Server
USE MASTER
CREATE ENDPOINT TEST_ENDPOINT
STATE=STARTED
AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING (
ROLE=ALL,
AUTHENTICATION = CERTIFICATE TEST_CERT,
ENCRYPTION = REQUIRED ALGORITHM AES
)
若要確認 SQL Server 端點正在埠 5022 上接收連線,請在 SQL Server 實例的主機操作系統上執行下列 PowerShell 命令:
tnc localhost -port 5022
成功的測試會顯示 TcpTestSucceeded : True。 然後,您可以繼續在 SQL 受控實例上建立 SQL Server Agent 作業,以嘗試從 SQL 受控實例的埠 5022 上測試 SQL Server 測試端點。
接下來,在 SQL 受控實例上執行下列 T-SQL 腳本,在名為 NetHelper 的 SQL 受控實例上建立 SQL Server Agent 作業。 取代:
-
<SQL_SERVER_IP_ADDRESS>,包含可從 SQL 受控實例存取的 SQL Server IP 位址。
-- Run on SQL managed instance
-- SQL_SERVER_IP_ADDRESS should be an IP address that could be accessed from the SQL Managed Instance host machine.
DECLARE @SQLServerIpAddress NVARCHAR(MAX) = '<SQL_SERVER_IP_ADDRESS>'; -- insert your SQL Server IP address in here
DECLARE @tncCommand NVARCHAR(MAX) = 'tnc ' + @SQLServerIpAddress + ' -port 5022 -InformationLevel Quiet';
DECLARE @jobId BINARY(16);
IF EXISTS (
SELECT *
FROM msdb.dbo.sysjobs
WHERE name = 'NetHelper'
) THROW 70000,
'Agent job NetHelper already exists. Please rename the job, or drop the existing job before creating it again.',
1
-- To delete NetHelper job run: EXEC msdb.dbo.sp_delete_job @job_name=N'NetHelper'
EXEC msdb.dbo.sp_add_job @job_name = N'NetHelper',
@enabled = 1,
@description = N'Test SQL Managed Instance to SQL Server network connectivity on port 5022.',
@category_name = N'[Uncategorized (Local)]',
@owner_login_name = N'sa',
@job_id = @jobId OUTPUT;
EXEC msdb.dbo.sp_add_jobstep @job_id = @jobId,
@step_name = N'TNC network probe from SQL MI to SQL Server',
@step_id = 1,
@os_run_priority = 0,
@subsystem = N'PowerShell',
@command = @tncCommand,
@database_name = N'master',
@flags = 40;
EXEC msdb.dbo.sp_update_job @job_id = @jobId,
@start_step_id = 1;
EXEC msdb.dbo.sp_add_jobserver @job_id = @jobId,
@server_name = N'(local)';
提示
如果您需要針對 SQL 受控實例的連線探查修改 SQL Server 的 IP 位址,請執行 EXEC msdb.dbo.sp_delete_job @job_name=N'NetHelper'刪除 NetHelper 作業,然後使用先前的腳本重新建立 NetHelper 作業。
然後,建立可協助執行作業的預存程式 ExecuteNetHelper,並從網路探查取得結果。 在 SQL 受控實例上執行下列 T-SQL 文稿:
-- Run on managed instance
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'ExecuteNetHelper')
THROW 70001, 'Stored procedure ExecuteNetHelper already exists. Rename or drop the existing procedure before creating it again.', 1
GO
CREATE PROCEDURE ExecuteNetHelper AS
-- To delete the procedure run: DROP PROCEDURE ExecuteNetHelper
BEGIN
-- Start the job.
DECLARE @NetHelperstartTimeUtc DATETIME = GETUTCDATE();
DECLARE @stop_exec_date DATETIME = NULL;
EXEC msdb.dbo.sp_start_job @job_name = N'NetHelper';
-- Wait for job to complete and then see the outcome.
WHILE (@stop_exec_date IS NULL)
BEGIN
-- Wait and see if the job has completed.
WAITFOR DELAY '00:00:01'
SELECT @stop_exec_date = sja.stop_execution_date
FROM msdb.dbo.sysjobs sj
INNER JOIN msdb.dbo.sysjobactivity sja
ON sj.job_id = sja.job_id
WHERE sj.name = 'NetHelper'
-- If job has completed, get the outcome of the network test.
IF (@stop_exec_date IS NOT NULL)
BEGIN
SELECT sj.name JobName,
sjsl.date_modified AS 'Date executed',
sjs.step_name AS 'Step executed',
sjsl.log AS 'Connectivity status'
FROM msdb.dbo.sysjobs sj
LEFT JOIN msdb.dbo.sysjobsteps sjs
ON sj.job_id = sjs.job_id
LEFT JOIN msdb.dbo.sysjobstepslogs sjsl
ON sjs.step_uid = sjsl.step_uid
WHERE sj.name = 'NetHelper'
END
-- In case of operation timeout (90 seconds), print timeout message.
IF (datediff(second, @NetHelperstartTimeUtc, getutcdate()) > 90)
BEGIN
SELECT 'NetHelper timed out during the network check. Please investigate SQL Agent logs for more information.'
BREAK;
END
END
END;
在 SQL 受控實例上執行下列查詢,以執行將執行 NetHelper 代理程式作業的預存程式,並顯示產生的記錄:
-- Run on managed instance
EXEC ExecuteNetHelper;
如果連線成功,記錄會顯示 True。 如果連線失敗,記錄會顯示 False。
如果連線失敗,請確認下列項目:
- 主機 SQL Server 實例上的防火牆允許埠 5022 上的輸入和輸出通訊。
- 裝載 SQL 受控實例之虛擬網路的 NSG 規則允許埠 5022 上的通訊。
- 如果您的 SQL Server 實例位於 Azure VM 上,NSG 規則允許在裝載 VM 的虛擬網路上的埠 5022 上進行通訊。
- SQL Server 正在執行。
- SQL Server 上有測試端點。
解決問題之後,請在受控實例上執行 EXEC ExecuteNetHelper,再次重新執行 NetHelper 網路探查。
最後,在網路測試成功之後,使用下列 T-SQL 命令,在 SQL Server 上卸除測試端點和憑證:
-- Run on SQL Server
DROP ENDPOINT TEST_ENDPOINT;
GO
DROP CERTIFICATE TEST_CERT;
GO
謹慎
只有在您已驗證來源與目標環境之間的網路連線能力時,才能繼續進行後續步驟。 否則,請先針對網路連線問題進行疑難解答,再繼續進行。
相關內容
如需連結功能的詳細資訊,請檢閱下列資源: