Azure SQL Managed Instnace 에서 다른 외부 리소스(Azure Storage, SMTP, SQL VM 등)에 연결이 필요한 경우 아래 테스트 쿼리를 통해 DNS 이름 풀이나 TCP 포트 연결 성공 여부를 자가 진단할 수 있습니다.
테스트를 위해 SQL VM 을 만들고 VM의 NSG에서 1433 Inbound 포트를 오픈하였고 SQL MI 의 NSG에서 VM으로 연결되는 Outbound 패킷을 허용/차단하여 아래와 같이 각각 성공/실패 사례를 체크하였습니다.
먼저 아래 스크립트 상단에 있는 @endpoint, @port 정보에 대해서만 연결 대상 정보로 변경합니다. 그리고 SQL MI 에 연결한 후 새쿼리를 통해 이 스크립트를 수행하면 TCP 연결 테스트 결과를 반환하게 됩니다.
--START
-- Parameters
DECLARE @endpoint NVARCHAR(512) = N'52.155.000.14' -- 대상 IP
DECLARE @port NVARCHAR(5) = N'1433' -- 대상 PORT
--Script
DECLARE @jobName NVARCHAR(512) = N'TestTCPNetworkConnection', @jobId BINARY(16), @cmd NVARCHAR(MAX);
IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = @jobName)
BEGIN
EXEC msdb.dbo.sp_delete_job @job_name=@jobName, @delete_unused_schedule=1;
END
EXEC msdb.dbo.sp_add_job @job_name=@jobName, @enabled=1, @job_id = @jobId OUTPUT;
DECLARE @stepName NVARCHAR(512) = @endpoint + N':' + @port;
SET @cmd = (N'tnc ' + @endpoint + N' -port ' + @port +' | select ComputerName, RemoteAddress, TcpTestSucceeded | Format-List');
EXEC msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name = @stepName, @step_id=1, @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)';
EXEC msdb.dbo.sp_start_job @job_name=@jobName;
--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 JOIN [msdb].[dbo].[sysjobs] J ON JH.job_id= J. job_id
WHERE J.name=@jobName and step_id = 0;
WAITFOR DELAY '00:00:05';
END
--Get logs once job completes
SELECT [step_name] AS [Endpoint]
,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 JOIN [msdb].[dbo].[sysjobs] J ON JH.job_id= J. job_id
WHERE J.name=@jobName and step_id <> 0;
--END
원본 아티클은 아래 링크에 소개되어 있습니다만 일부 컬럼명에 대한 스크립트에 오류가 있어 정상적으로 동작하는 수정된 스크립트를 이 블로그에 게시하였습니다.
How-to test TCP connectivity from a SQL Managed Instance
https://techcommunity.microsoft.com/t5/azure-sql-blog/how-to-test-tcp-connectivity-from-a-sql-managed-instance/ba-p/3058458
How-to test failover group connectivity between primary and secondary SQL Managed Instances
https://techcommunity.microsoft.com/t5/azure-sql-blog/how-to-test-failover-group-connectivity-between-primary-and/ba-p/3058443
작성자: Lai Go / 작성일자: 2022.01.26