Se aplica a:
Azure SQL Managed Instance
En este artículo se explica cómo supervisar y solucionar problemas con un vínculo entre SQL Server y Azure SQL Managed Instance.
Puede comprobar el estado del vínculo con Transact-SQL (T-SQL), Azure PowerShell o la CLI de Azure. Si encuentra problemas, puede usar los códigos de error para solucionar el problema.
Muchos problemas con la creación del vínculo se pueden resolver comprobando la red entre las dos instancias y validando el entorno se ha preparado correctamente para el vínculo.
Propagación inicial
Al establecer un vínculo entre SQL Server e Instancia administrada de Azure SQL, hay una fase inicial de propagación antes de que se inicie la replicación de datos. Esta fase de propagación inicial es la operación más larga y costosa de la operación. Una vez completada, se sincronizan los datos y solo se replican los cambios de datos posteriores. El tiempo necesario para que se complete la inicialización depende del tamaño de los datos, la intensidad de la carga de trabajo en las bases de datos principales y la velocidad del vínculo entre las redes de las réplicas principales y secundarias.
Si la velocidad del vínculo entre las dos instancias es más lenta de lo necesario, es probable que el tiempo de inicialización resulte muy afectado. Puede usar la velocidad de propagación indicada, el tamaño total de los datos y la velocidad del vínculo para calcular cuánto tiempo tardará la fase inicial de propagación antes de que se inicie la replicación de datos. Por ejemplo, para una sola base de datos de 100 GB, la fase inicial de inicialización tardaría aproximadamente 1,2 horas si el vínculo es capaz de insertar 84 GB por hora y, si no hay otras bases de datos que se inicializarán en un vínculo diferente. Si el vínculo solo puede transferir 10 GB por hora, la propagación de una base de datos de 100 GB tardará aproximadamente 10 horas. Si hay varias bases de datos que se van a replicar a través de varios vínculos, la propagación se ejecutará en paralelo y, cuando se combina con una velocidad de vínculo lenta, la fase de propagación inicial puede tardar considerablemente más tiempo, especialmente si la inicialización paralela de datos de todas las bases de datos supera el ancho de banda del vínculo disponible.
Importante
La fase de propagación inicial puede tardar días con vínculos extremadamente lentos o congestionados. En este caso, la creación del vínculo puede agotar el tiempo de espera. La creación del vínculo se cancela automáticamente después de 6 días.
Comprobar el estado del vínculo
Si tiene problemas con un vínculo, puede usar SQL Server Management Studio (SSMS), Transact-SQL (T-SQL), Azure PowerShell o la CLI de Azure para obtener información sobre el estado actual del vínculo.
Use T-SQL para obtener detalles de estado rápido del estado del vínculo y, a continuación, use Azure PowerShell o la CLI de Azure para obtener información completa sobre el estado actual del vínculo.
La supervisión de vínculos está disponible a partir de SQL Server Management Studio (SSMS) 21.0 (versión preliminar).
Para comprobar el estado del vínculo en SSMS, siga estos pasos:
Conéctese a una réplica que hospede el vínculo.
En el Explorador de objetos, expanda Alta disponibilidad AlwaysOn y después, expanda Grupos de disponibilidad.
Haga clic con el botón derecho en el nombre del vínculo y seleccione Propiedades para abrir la ventana Propiedadesdel vínculo :
La ventana Propiedades del vínculo muestra información útil sobre el vínculo, como la información de réplica, el estado del vínculo y la fecha de expiración del certificado de punto de conexión:
Use T-SQL para determinar el estado del vínculo durante la fase de propagación o después de que se inicie la sincronización de datos.
Utilice la siguiente consulta de T-SQL para determinar el estado del vínculo durante la fase de inicialización en SQL Server o Instancia Administrada de SQL que hospeda la base de datos sembrada a través del vínculo.
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
Si la consulta no devuelve ningún resultado, el proceso de propagación no se ha iniciado o ya se ha completado.
Use la siguiente consulta de T-SQL en la instancia principal para comprobar el estado del vínculo una vez que comience la sincronización de datos:
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
La consulta devuelve los siguientes valores posibles:
- sin resultado: la consulta se ejecutó en la instancia secundaria.
-
HEALTHY
: el enlace está en buen estado y los datos se están sincronizando entre las réplicas.
-
NOT_HEALTHY
: El vínculo es deficiente y los datos no se sincronizan entre las réplicas.
Use Get-AzSqlInstanceLink para obtener información de estado de vínculo con PowerShell.
Ejecute el código de ejemplo siguiente en Azure Cloud Shell o instale el módulo Az.SQL localmente.
$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
Use az sql mi link show para obtener información de estado de vínculo con la CLI de Azure.
# 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
El valor de replicaState describe el vínculo actual. Si el estado también incluye Error , se produjo un error durante la operación que aparece en el estado . Por ejemplo, LinkCreationError indica que se produjo un error al crear el vínculo.
Algunos valores de replicaState posibles son:
-
CreatingLink: Propagación inicial
-
LinkSynchronizing: La replicación de datos está en curso
-
LinkFailoverInProgress: La conmutación por error está en curso
Para obtener una lista completa de las propiedades de estado de vínculo, revise el comando Distributed Availability Groups - GET REST API .
Errores con el vínculo
Hay dos categorías distintas de errores que puede encontrar al usar el vínculo: errores al intentar inicializar el vínculo y errores al intentar crear el vínculo.
Errores al inicializar un enlace sql-server-2016-database-engine-events-and-errors-1000-1999
Se puede producir el siguiente error al inicializar un vínculo (estado de vínculo: LinkInitError
):
-
Error 41962: Operación anulada porque el vínculo no se inició en 5 minutos. Compruebe la conectividad de red e inténtelo de nuevo.
-
Error 41973: No se puede establecer el vínculo porque el certificado de punto de conexión de SQL Server no se importó correctamente en Azure SQL Managed Instance.
-
Error 41974: No se puede establecer el vínculo porque el certificado de punto de conexión de SQL Managed Instance no se importó correctamente en SQL Server.
-
Error 41976: El grupo de disponibilidad no responde. Compruebe los nombres y los parámetros de configuración e inténtelo de nuevo.
-
Error 41986: No se puede establecer el vínculo porque no se pudo establecer la conexión o la réplica secundaria no responde. Compruebe los nombres, los parámetros de configuración y la conectividad de red y vuelva a intentarlo.
-
Error 47521: No se puede establecer el vínculo porque el servidor secundario no recibió la solicitud. Asegúrese de que el grupo de disponibilidad y las bases de datos están en buen estado en el servidor principal e inténtelo de nuevo.
Errores al crear un vínculo
Se pueden producir los siguientes errores al crear un vínculo (estado de vínculo: LinkCreationError
):
Error 41977: La base de datos de destino no responde. Compruebe los parámetros de vínculo e inténtelo de nuevo.
Truncamiento prematuro del registro: Si el registro de transacciones se trunca antes de que finalice el proceso de inicialización, es probable que vea uno de los siguientes errores:
-
Error 1408: La copia remota de la base de datos "%.*ls" no se ha recuperado suficientemente como para reflejar la base de datos o agregarla al grupo de disponibilidad.
-
Error 1412: La copia remota de la base de datos "%.*ls" no se ha puesto al día a un momento dado que esté incluido en la copia local del registro de la base de datos.
Para resolver este problema, debe eliminar y volver a crear el vínculo.
Para evitar este problema, detenga las copias de seguridad del registro de transacciones en SQL Server para que la base de datos se replique durante la fase inicial de propagación.
Estado inconsistente después de la conmutación por error forzada
Después de una conmutación por error forzada, podría encontrarse con un escenario de cerebro dividido en el que ambas réplicas están en el rol principal, dejando el vínculo en un estado incoherente. Esto puede ocurrir si conmuta por error a la réplica secundaria durante un desastre y, a continuación, la réplica principal vuelve a estar en línea.
En primer lugar, confirme que está en un escenario de cerebro dividido. Para ello, puede usar Transact-SQL (T-SQL) o SQL Server Management Studio (SSMS).
Conéctese tanto a SQL Server como a SQL Managed Instance en SSMS y, a continuación, en Explorador de objetos, expanda Réplicas de disponibilidad en el nodo Grupo de disponibilidad en Alta disponibilidad AlwaysOn. Si se muestran dos réplicas diferentes como (principal), se encuentra en un escenario de cerebro dividido.
Como alternativa, puede ejecutar el siguiente script de T-SQL en ambos, SQL Server y SQL Managed Instance, para comprobar el rol de las réplicas:
-- 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
Si ambas instancias muestran PRIMARY en la columna Función de enlace, se encuentra en un escenario de cerebro dividido.
Para resolver el estado del cerebro dividido, primero realice una copia de seguridad en la réplica que sea la principal original. Si la principal original era SQL Server, realice una copia de seguridad del final del registro. Si la principal original era SQL Managed Instance, realice una copia de seguridad completa de solo copia. Una vez completada la copia de seguridad, establezca el grupo de disponibilidad distribuido en el rol secundario de la réplica que solía ser la principal original, pero ahora será la nueva secundaria.
Por ejemplo, en caso de un desastre verdadero, suponiendo que ha forzado una conmutación por error de la carga de trabajo de SQL Server a Azure SQL Managed Instance, y tiene previsto seguir ejecutando la carga de trabajo en SQL Managed Instance, realice una copia de seguridad del final del registro en SQL Server y, a continuación, establezca el grupo de disponibilidad distribuido en el rol secundario en SQL Server, como el ejemplo siguiente:
--Execute on SQL Server
USE master
ALTER AVAILABILITY GROUP [<DAGName>]
SET (ROLE = SECONDARY)
GO
A continuación, ejecute una conmutación por error manual planeada de SQL Managed Instance a SQL Server mediante el vínculo, como el ejemplo siguiente:
--Execute on SQL Managed Instance
USE master
ALTER AVAILABILITY GROUP [<DAGName>] FAILOVER
GO
Certificado expirado
Es posible que el certificado usado para el vínculo caduque. Si el certificado expira, se produce un error en el vínculo. Para resolver este problema, gire el certificado.
Comprobar la conectividad de red
La conectividad de red bidireccional entre SQL Server y SQL Managed Instance es necesaria para que el vínculo funcione. Después de abrir los puertos en el lado de SQL Server y configurar una regla NSG en el lado de SQL Managed Instance, pruebe la conectividad utilizando SQL Server Management Studio (SSMS) o Transact-SQL.
Pruebe la red mediante la creación de un trabajo temporal del Agente SQL en SQL Server y SQL Managed Instance para comprobar la conexión entre las dos instancias. Cuando se usa Network Checker en SSMS, el trabajo se crea automáticamente y se elimina una vez completada la prueba. Debe eliminar manualmente el trabajo del Agente SQL si prueba la red mediante T-SQL.
Nota:
Actualmente no se admite la ejecución de scripts de PowerShell mediante el Agente SQL Server en SQL Server en Linux, por lo que actualmente no es posible ejecutar Test-NetConnection
desde el trabajo de Agente SQL Server en SQL Server en Linux.
Para usar el Agente SQL a fin de probar la conectividad de red, necesita los siguientes requisitos:
- El usuario que realiza la prueba debe tener permisos para crear un trabajo (ya sea como sysadmin o perteneciente al rol SQLAgentOperator para
msdb
) para SQL Server y SQL Managed Instance.
- Se debe ejecutar el servicio Agente SQL Server en SQL Server. Puesto que el Agente está activado de forma predeterminada en SQL Managed Instance, no es necesario realizar ninguna acción adicional.
Para probar la conectividad de red entre SQL Server y SQL Managed Instance en SSMS, siga estos pasos:
Conéctese a la instancia que será la réplica principal en SSMS.
En Explorador de objetos, expanda bases de datos y haga clic con el botón derecho en la base de datos que quiere vincular con la base de datos secundaria. Seleccione el vínculo Tareas>Azure SQL Managed Instance>Prueba de conexión para abrir el asistente Comprobador de red:
Seleccione Siguiente en la página Introducción del asistente de Network Checker.
Si se cumplen todos los requisitos en la página Requisitos previos, seleccione Siguiente. De lo contrario, resuelva los requisitos previos no satisfechos y, a continuación, seleccione Volver a ejecutar validación.
En la página Inicio de sesión, seleccione Iniciar sesión para conectarse a la otra instancia que será la réplica secundaria. Seleccione Siguiente.
Compruebe los detalles de la página Especificar opciones de red y proporcione una dirección IP, si es necesario. Seleccione Siguiente.
En la página Resumen, revise las acciones que realiza el asistente y, a continuación, seleccione Finalizar para probar la conexión entre las dos réplicas.
Revise la página Resultados para validar que existe conectividad entre las dos réplicas y, a continuación, seleccione Cerrar para finalizar.
Para usar T-SQL para probar la conectividad, debe comprobar la conexión en ambas direcciones. En primer lugar, pruebe la conexión de SQL Server a SQL Managed Instance y, a continuación, pruebe la conexión de SQL Managed Instance a SQL Server.
Prueba de conexión desde SQL Server a SQL Managed Instance
Use el Agente SQL Server en SQL Server para ejecutar pruebas de conectividad de SQL Server a SQL Managed Instance.
Conéctese a SQL Managed Instance y ejecute el siguiente script para generar algunos parámetros que necesitaremos más adelante:
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';
Los resultados deberían parecerse a lo siguiente:
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'
Guarde los resultados para utilizarlos en los pasos siguientes. Dado que estos parámetros pueden cambiar después de cualquier conmutación por error, asegúrese de generarlos de nuevo, si es necesario.
Conéctese a la instancia de SQL Server.
Abra una ventana de consulta nueva y pegue el script siguiente:
--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
Reemplace los parámetros @node
, @port
y @serverName
por los valores que obtuvo del primer paso.
Ejecute el script y compruebe los resultados. Debería ver resultados parecidos a este ejemplo:
Compruebe los resultados:
- El resultado de cada prueba en TcpTestSucceededed debe ser
TcpTestSucceeded : True
.
- RemoteAddresses debe pertenecer al intervalo IP de la subred SQL Managed Instance.
Si la respuesta no es correcta, compruebe la siguiente configuración de red:
- Hay reglas en el firewall de red y en el firewall del sistema operativo (Windows o Linux) del host de SQL Server que permiten el tráfico a todo el intervalo IP de la subred de SQL Managed Instance.
- Hay una regla de NSG que permite la comunicación en el puerto 5022 para la red virtual que hospeda SQL Managed Instance.
Prueba de conexión desde SQL Managed Instance a SQL Server
Para comprobar que SQL Managed Instance puede acceder a SQL Server, primero debe crear un punto de conexión de prueba. A continuación, use el Agente SQL Server para ejecutar un script de PowerShell con el comando tnc
que haga ping a SQL Server en el puerto 5022 desde la instancia administrada de SQL.
Para crear un punto de conexión de prueba, conéctese a SQL Server y ejecute el siguiente script de 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
)
Para comprobar que el punto de conexión de SQL Server está recibiendo conexiones en el puerto 5022, ejecute el siguiente comando de PowerShell en el sistema operativo del host de la instancia de SQL Server:
tnc localhost -port 5022
Una prueba correcta muestra TcpTestSucceeded : True
. A continuación, podemos continuar con la creación de un trabajo del Agente SQL Server en una instancia administrada de SQL para intentar probar el punto de conexión de prueba de SQL Server en el puerto 5022 desde la instancia administrada de SQL.
A continuación, cree un trabajo del Agente SQL Server en la instancia administrada de SQL llamada NetHelper
mediante la ejecución del siguiente script de T-SQL en la instancia administrada de SQL. Reemplazar:
-
<SQL_SERVER_IP_ADDRESS>
con la dirección IP de SQL Server a la que se puede acceder desde la instancia administrada de SQL.
-- 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)';
Sugerencia
Si tiene que modificar la dirección IP de la instancia de SQL Server para el sondeo de conectividad desde SQL Managed Instance, elimine el trabajo de NetHelper mediante la ejecución de EXEC msdb.dbo.sp_delete_job @job_name=N'NetHelper'
y vuelva a crear el trabajo de NetHelper con el script anterior.
Después, cree un procedimiento almacenado ExecuteNetHelper
que ayude a ejecutar el trabajo y obtener resultados del sondeo de red. Ejecute el siguiente script de T-SQL en la instancia administrada de 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;
Ejecute la siguiente consulta en la instancia administrada de SQL para ejecutar el procedimiento almacenado que ejecutará el trabajo del agente de NetHelper y mostrará el registro resultante:
-- Run on managed instance
EXEC ExecuteNetHelper;
Si la conexión ha sido correcta, el registro muestra True
. Si la conexión no ha sido correcta, el registro muestra False
.
Si la conexión no fue correcta, compruebe los siguientes elementos:
- El firewall del host de la instancia de SQL Server permite la comunicación entrante y saliente en el puerto 5022.
- Hay una regla de NSG para la red virtual que hospeda SQL Managed Instance que permite la comunicación en el puerto 5022.
- Si la instancia de SQL Server está en una máquina virtual de Azure, una regla de NSG permite la comunicación en el puerto 5022 en la red virtual que hospeda la máquina virtual.
- SQL Server se está ejecutando.
- Existe un punto de conexión de prueba en SQL Server.
Después de resolver problemas, vuelva a ejecutar el sondeo de red netHelper mediante la ejecución EXEC ExecuteNetHelper
en la instancia administrada.
Por último, después de que la prueba de red re haya realizado correctamente, elimine el punto de conexión de prueba y el certificado de SQL Server con los siguientes comandos de T-SQL:
-- Run on SQL Server
DROP ENDPOINT TEST_ENDPOINT;
GO
DROP CERTIFICATE TEST_CERT;
GO
Precaución
Continúe con los pasos siguientes solo si ha validado la conectividad de red entre los entornos de origen y de destino. De lo contrario, solucione los problemas de conectividad de red antes de continuar.
Contenido relacionado
Para obtener más información sobre la característica de vínculo, revise los siguientes recursos: