Compartilhar via


Solucionar problemas de conexão – Instância Gerenciada de SQL do Azure

Applies to:Instância Gerenciada de SQL do Azure

Este artigo ensina como monitorar e solucionar problemas com um link entre SQL Server e Instância Gerenciada de SQL do Azure.

Você pode verificar o estado do link com Transact-SQL (T-SQL), Azure PowerShell ou o CLI do Azure. Se você encontrar problemas, poderá usar os códigos de erro para solucionar o problema.

Muitos problemas com a criação do link podem ser resolvidos verificando a rede entre as duas instâncias e validando se o ambiente foi preparado corretamente para o link.

Semeadura inicial

Ao estabelecer um vínculo entre SQL Server e Instância Gerenciada de SQL do Azure, há uma fase inicial de propagação antes do início da replicação de dados. A fase de propagação inicial é a parte da operação mais longa e custosa. Após a conclusão da propagação inicial, os dados são sincronizados e somente as alterações de dados subsequentes são replicadas. O tempo necessário para que a propagação inicial seja concluída depende do tamanho dos dados, da intensidade da carga de trabalho nos bancos de dados primários e da velocidade do vínculo entre as redes das réplicas primária e secundária.

Caso a velocidade do link entre as duas instâncias seja mais lenta do que o necessário, provavelmente o tempo de propagação será significativamente afetado. Você pode usar a velocidade de propagação declarada, o tamanho total dos dados e a velocidade do link para estimar quanto tempo a fase de propagação inicial levará antes do início da replicação de dados. Por exemplo, para um único banco de dados de 100 GB, a fase inicial de preparação levaria cerca de 1,2 horas se o link fosse capaz de transferir 84 GB por hora e se não houver nenhum outro banco de dados sendo preparado para um link diferente. Se o link só puder transferir 10 GB por hora, a propagação de um banco de dados de 100 GB pode levar cerca de 10 horas. Se houver vários bancos de dados a serem replicados por meio de vários links, a propagação será executada em paralelo e, quando combinada com uma velocidade de vínculo lenta, a fase de propagação inicial poderá demorar consideravelmente mais, especialmente se a propagação paralela de dados de todos os bancos de dados exceder a largura de banda do link disponível.

A fase inicial de semeadura não é resiliente a interrupções de rede e a operações de manutenção ou comutação por falha de instância. Se a conectividade bidirecional entre SQL Server e Instância Gerenciada de SQL for perdida temporariamente ou se o SQL Server ou Instância Gerenciada de SQL for reiniciado ou falhar durante a fase inicial de semeadura, a semeadura será reiniciada.

Importante

A fase inicial de propagação pode levar dias com links de velocidade extremamente baixa ou congestionados. Nesse caso, a criação do link pode acabar. A criação do link é cancelada automaticamente após 6 dias.

Se você tiver problemas com um link, poderá usar SQL Server Management Studio (SSMS), Transact-SQL (T-SQL), Azure PowerShell ou o CLI do Azure para obter informações sobre o estado atual do link.

Use o T-SQL para obter detalhes de status rápidos do estado do link e, em seguida, use Azure PowerShell ou o CLI do Azure para obter informações abrangentes sobre o estado atual do link.

O monitoramento de link está disponível a partir do SQL Server Management Studio (SSMS) 21.0 (versão prévia).

Para verificar o estado do link no SSMS, siga estas etapas:

  1. Conecte-se a uma réplica que hospeda o link.

  2. Em Pesquisador de Objetos, expanda Always On High Availability e expanda Availability Groups.

  3. Clique com o botão direito do mouse no nome do link e selecione Propriedades para abrir a janela Propriedades do Link :

    Captura de tela do menu de clique com o botão direito do mouse em um link no SSMS, com propriedades realçadas.

  4. A janela Propriedades do Link exibe informações úteis sobre o link, como informações de réplica, estado do link e data de validade do certificado do ponto de extremidade:

    Captura de tela da janela de propriedades do link no SSMS.

O valor replicaState descreve o link atual. Se o estado também incluir Erro , ocorreu um erro durante a operação listada no estado. Por exemplo, LinkCreationError indica que ocorreu um erro ao criar o link.

Alguns valores possíveis de replicaState são:

  • CreatingLink: propagação inicial
  • LinkSynchronizing: A replicação de dados está em andamento
  • LinkFailoverInProgress: o failover está em andamento

Para obter uma lista completa das propriedades de estado do link, examine o comando Grupos de Disponibilidade Distribuída – API REST GET .

Tempo limite de failover planejado

Se a réplica secundária não conseguir acompanhar as alterações na réplica primária e ficar para trás, o failover planejado poderá acabar e falhar com um erro.

Para resolver esse problema, siga estas etapas:

  1. Verifique o atraso de replicação entre as duas instâncias.
  2. Se o atraso de replicação for alto, aguarde até que a réplica secundária acompanhe a réplica primária. Talvez seja necessário executar etapas adicionais de solução de problemas se o atraso persistir, como pausar cargas de trabalho na réplica primária, melhorar a taxa de transferência de rede de vínculo entre as duas instâncias ou aumentar a capacidade do recurso na réplica secundária.
    • A maneira mais fácil de parar cargas de trabalho em uma réplica primária SQL Server é cortar conexões de aplicativo com a instância.
  3. Depois que a réplica secundária tiver alcançado a réplica primária, tente o failover planejado novamente.

O erro a seguir pode ocorrer ao inicializar um link (Estado do link: LinkInitError):

  • Erro 41962: Operação anulada porque o link não foi iniciado em 5 minutos. Verifique a conectividade de rede e tente novamente.
  • Error 41973: o link não pode ser estabelecido porque endpoint certificate from SQL Server não foi importado para Instância Gerenciada de SQL do Azure corretamente.
  • Error 41974: o link não pode ser estabelecido porque endpoint certificate from Instância Gerenciada de SQL não foi importado para SQL Server corretamente.
  • Erro 41976: o grupo de disponibilidade não está respondendo. Verifique os nomes e os parâmetros de configuração e tente novamente.
  • Erro 41986: O link não pode ser estabelecido porque a conexão falhou ou a réplica secundária não responde. Verifique os nomes, os parâmetros de configuração e a conectividade de rede e tente novamente.
  • Erro 47521: o link não pode ser estabelecido porque o servidor secundário não recebeu a solicitação. Verifique se o grupo de disponibilidade e os bancos de dados estão íntegros no servidor primário e tente novamente.

Os seguintes erros podem ocorrer ao criar um link (Estado do link: LinkCreationError):

  • Erro 41977: o banco de dados de destino não responde. Verifique os parâmetros de link e tente novamente.
  • Truncamento de log prematuro: se o log de transações for truncado antes da conclusão da semeadura inicial, é provável que você veja um dos seguintes erros:
    • Erro 1408: Falha na replicação do banco de dados remoto e não pode ser recuperada devido a uma sobreposição de arquivo de log ausente entre a réplica primária e secundária. Exclua o link existente e crie um novo link para reiniciar a replicação.
    • Erro 1412: Falha na replicação para o banco de dados remoto e não pode ser recuperada devido a uma incompatibilidade de tamanho de arquivo de log com a réplica primária. Exclua o link existente e crie um novo link para reiniciar a replicação.

Erro 1412

Quando você cria um link pela primeira vez, a primeira parte do processo propaga um backup completo do banco de dados da réplica primária para a réplica secundária. Após a conclusão da propagação do backup completo, o link começa a replicar dados aplicando dados diferenciais da réplica primária à réplica secundária. Esse processo continua indefinidamente até que um comando de failover seja emitido ou o link seja removido.

Se ocorrer um backup de log de transações na réplica primária durante a propagação inicial do backup completo, o log de transações truncará. A criação de link falha com o erro 1412, pois os dados no log de transações necessários para propagação inicial não estão mais disponíveis. Se você vir o erro 1412 no log de erros do SQL Server no Instância Gerenciada de SQL do Azure, deverá drop e recriar o link.

Para evitar esse problema, pause os backups de log de transações durante a fase inicial de preparação.

Se os backups de log de transações forem necessários durante a fase inicial de propagação, especialmente para bancos de dados muito grandes, você poderá optar por impedir manualmente o truncamento de log ou automatizar o processo com um script T-SQL para pausar automaticamente os backups de log em fases críticas e quando ele estiver seguro.

Prevenção manual de truncamento de log

As etapas nesta seção demonstram como abrir uma transação em uma tabela fictícia para evitar o truncamento de log durante a fase inicial de propagação. Esse processo requer o monitoramento manual do progresso da semeadura e a sincronização cuidadosa para garantir que o truncamento de log seja evitado até que a semeadura seja concluída.

  1. Monitore o progresso da distribuição. Você pode usar a seguinte consulta T-SQL para monitorar o progresso da propagação inicial:

    SELECT * FROM sys.dm_exec_requests WHERE database_id = @dbId AND command = 'VDI_CLIENT_WORKER'
    
  2. Quando a semeadura estiver perto de 90% de conclusão, emita um comando BEGIN TRAN em uma tabela fictícia sem confirmação para manter uma transação aberta e impedir o truncamento do log.

  3. Monitore cuidadosamente o espaço em disco do log de transações para garantir que ele não exceda a capacidade de armazenamento enquanto a transação estiver aberta.

  4. Quando a distribuição atingir 100%, conclua a transação com COMMIT TRAN.

Por exemplo, a qualquer momento antes que a propagação inicial atinja 90%, execute o seguinte comando para criar uma tabela fictícia com a finalidade de evitar o erro 1412:

-- Create table
CREATE TABLE Prevent1412
(
    Id        INT,
    CreatedAt DATETIME
);

Em seguida, quando o semeio estiver quase completo, execute o seguinte comando para evitar o truncamento de logs:

BEGIN TRAN;

INSERT INTO Prevent1412 (Id, CreatedAt)
VALUES (1, GETDATE());

Cuidado

Após o início da transação, o log de transações não é mais truncado, portanto, monitore cuidadosamente o espaço em disco do log de transações para garantir que ele não exceda a capacidade de armazenamento enquanto a transação estiver aberta.

Depois que a semeadura for concluída, você poderá confirmar a transação para truncar o log.

COMMIT TRAN;

Após a conclusão da migração, você pode remover a tabela fictícia:

DROP TABLE Prevent1412;

Automatizar a pausa automática dos backups de log

Como alternativa, você pode automatizar o processo para pausar automaticamente os backups de log em fases críticas quando ele estiver seguro com um script T-SQL.

O script a seguir pode ser executado antes do início da migração:

-- Get last backup date
SELECT TOP 1 @lastBackupTime = b.backup_finish_date
FROM master.sys.sysdatabases d 
LEFT OUTER JOIN msdb..backupSET b
ON b.database_name = d.name
AND b.type = 'L'
WHERE d.name = @dbName
ORDER BY backup_finish_date DESC
SELECT @diffInMins = DATEDIFF(minute, @lastBackupTime, CURRENT_TIMESTAMP);

-- Get database id and group database id
SELECT @agDbId = group_database_id, @dbId = database_id FROM sys.databases WHERE name = @dbName

-- If there is no group database id, no need for checks
IF (@agDbId IS NOT NULL)
BEGIN
              -- Get last seeding start time and check if backup (VDI client) is actually running
              SELECT TOP 1 @seedingStartTime = start_time, @state = current_state, @agDbId = ag_db_id FROM sys.dm_hadr_automatic_seeding ORDER BY start_time DESC

              IF (@state = 'PENDING' OR @state = 'CHECK_IF_SEEDING_NEEDED' OR @state = 'LIMIT_CONCURRENT_BACKUPS')
                             SET @seedingStarting = 1
              ELSE
                             SET @seedingStarting = 0
              
              SELECT @backupWorkers = COUNT(*) FROM sys.dm_exec_requests WHERE database_id = @dbId AND command = 'VDI_CLIENT_WORKER'

              -- Check if seeding is done by looking at remote replica state and health
              SELECT TOP 1 @db_state = synchronization_state_desc, @db_health = synchronization_health_desc FROM sys.dm_hadr_database_replica_states WHERE database_id = @dbId AND is_local = 0

              IF (@db_state = N'SYNCHRONIZING' AND @db_health = N'HEALTHY')
              SET @seedingDone = 1
              ELSE
              SET @seedingDone = 0
END

-- If X minutes has passed since last log backup, do it, we don't want to wait anymore
IF (@alreadyFailed = 1 or @diffInMins > {set_minutes})
BEGIN
              {do_log_backup}
              SET @alreadyFailed = 1
              CONTINUE;
END

-- If seeding has started and finished take log backups
IF ((@agDbId IS NOT NULL) AND (@seedingStartTime IS NOT NULL) AND (@startTime < @seedingStartTime) AND (@seedingDone = 1))
BEGIN
              {do_log_backup}
              SET @alreadyFailed = 1
              CONTINUE;
END

-- If database is not in ag or
-- If seeding has not started or
-- If seeding is ongoing 
-- Take log backups
IF ((@agDbId IS NULL) OR (@seedingStartTime IS NULL) OR (@startTime > @seedingStartTime) OR (@seedingStarting = 1) or (@backupWorkers > 0))
BEGIN
              {do_log_backup}
              CONTINUE;
END

Estado inconsistente após failover forçado

Após um failover forçado, você pode encontrar um cenário de divisão cerebral em que ambas as réplicas estão na função primária, deixando o link em um estado inconsistente. Isso poderá acontecer se você realizar uma transição para a réplica secundária durante um desastre e, em seguida, a réplica primária ficar online novamente.

Primeiro, confirme se você está em um cenário de cérebro dividido. Você pode fazer isso usando SQL Server Management Studio (SSMS) ou Transact-SQL (T-SQL).

Conectar-se tanto ao SQL Server quanto à instância gerenciada SQL no SSMS, e, em Pesquisador de Objetos, expanda Availability replicas no nó Availability group no Always On High Availability. Se duas réplicas diferentes estiverem listadas como (Primárias), você estará em um cenário de cérebro dividido.

Como alternativa, você pode executar o seguinte script T-SQL em both SQL Server e Instância Gerenciada de SQL para verificar a função das 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

Se ambas as instâncias listam PRIMARY na coluna Função do link, você está em um cenário de divisão cerebral.

Para resolver o estado de cérebro dividido, primeiro faça um backup da réplica que era a primária original. Se o primário original foi SQL Server, faça um backup de log tail. Se o primário original é uma Instância Gerenciada de SQL, então faça um backup completo somente cópia. Após a conclusão do backup, configure o grupo de disponibilidade distribuído para a função secundária da réplica que era a primária original e agora será a nova secundária.

Por exemplo, no caso de um verdadeiro desastre, supondo que você tenha forçado um failover de sua carga de trabalho do SQL Server para o Instância Gerenciada de SQL do Azure e pretenda continuar executando sua carga de trabalho no Instância Gerenciada de SQL do Azure, faça um backup de log final no SQL Server e, em seguida, defina o grupo de disponibilidade distribuída para o papel secundário no SQL Server, como no exemplo a seguir:

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

Em seguida, execute um failover manual planejado de Instância Gerenciada de SQL para SQL Server usando o link fornecido, como no exemplo a seguir:

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

Certificado expirado

É possível que o certificado usado para o link expire. Se o certificado expirar, o link falhará. Para resolver esse problema, atualize o certificado.

Problemas conhecidos após a migração para Instância Gerenciada de SQL

Considere os seguintes problemas conhecidos após a migração para Instância Gerenciada de SQL do Azure:

Restaurar falhas de operação após a migração para Instância Gerenciada de SQL

Se você migrar um banco de dados para uma instância gerenciada do SQL na Azure a partir do SQL Server 2019 e versões posteriores, com a recuperação de banco de dados acelerada habilitada, mas se o repositório de versão persistente (PVS) estiver configurado para algo diferente do grupo de arquivos PRIMARY, poderão ocorrer falhas nas operações de restauração na instância gerenciada de SQL de destino.

Para contornar esse problema, defina o persistent version store (PVS) como PRIMARY no banco de dados de SQL Server de origem antes de migrá-lo para Instância Gerenciada de SQL. Se você já migrou o banco de dados sem definir a PVS para PRIMARY, poderá defini-lo no banco de dados de SQL Server de origem e migrar novamente o banco de dados para Instância Gerenciada de SQL.

Não é possível usar a recuperação acelerada do banco de dados após a migração para Instância Gerenciada de SQL

A partir do SQL Server 2019, se você migrar um banco de dados para Instância Gerenciada de SQL do Azure e o banco de dados de origem tiver recuperação de banco de dados com aceleração desabilitado, você não poderá usar a recuperação acelerada do banco de dados na instância gerenciada de SQL de destino.

Para contornar esse problema, verifique se você abilita recuperação acelerada de banco de dados no banco de dados de SQL Server de origem antes de migrá-lo para Instância Gerenciada de SQL. Se você já migrou o banco de dados sem habilitar a recuperação acelerada do banco de dados, poderá habilitá-lo no banco de dados de SQL Server de origem e, em seguida, migrar novamente o banco de dados para a instância gerenciada de SQL.

SQL Server 2017 e versões anteriores não dão suporte à recuperação acelerada do banco de dados, portanto, esse problema não se aplica aos bancos de dados migrados dessas versões do SQL Server.

Não é possível usar o Service Broker depois de migrar para Instância Gerenciada de SQL

Se você migrar um banco de dados para Instância Gerenciada de SQL do Azure e Service Broker estiver desabilitado no banco de dados de origem, não será possível usar o Service Broker na instância gerenciada de SQL de destino.

Para contornar esse problema, habilite o Service Broker no banco de dados de SQL Server de origem antes de migrá-lo para Instância Gerenciada de SQL. Se você já migrou o banco de dados sem habilitar o Service Broker, poderá habilitá-lo no banco de dados de SQL Server de origem e migrar novamente o banco de dados para Instância Gerenciada de SQL.

Testar a conectividade de rede

A conectividade de rede bidirecional entre SQL Server e Instância Gerenciada de SQL é necessária para que o link funcione. Depois de abrir portas no lado SQL Server e configurar uma regra NSG no lado Instância Gerenciada de SQL, teste a conectividade usando SQL Server Management Studio (SSMS) ou Transact-SQL.

Teste a rede criando um trabalho temporário do SQL Agent em SQL Server e Instância Gerenciada de SQL para verificar a conexão entre as duas instâncias. Quando você usa o Verificador de Rede no SSMS, o trabalho é criado automaticamente para você e excluído após a conclusão do teste. Você precisará excluir manualmente o trabalho do SQL Agent se testar sua rede usando T-SQL.

Observação

No momento, não há suporte para a execução de scripts do PowerShell pelo SQL Server Agent no SQL Server em Linux, portanto, não é possível executar Test-NetConnection do trabalho SQL Server Agent no SQL Server em Linux.

Para usar o SQL Agent para testar a conectividade de rede, você precisará cumprir os seguintes requisitos:

  • O usuário que está fazendo o teste deve ter permissões para criar um trabalho (como sysadmin ou pertence à função SQLAgentOperator para msdb) para SQL Server e Instância Gerenciada de SQL.
  • O serviço SQL Server Agent deve estar em execução no SQL Server. Como o Agente está ativado por padrão em Instância Gerenciada de SQL, nenhuma ação adicional é necessária.

Considere o seguinte:

  • Para evitar falsos negativos, todos os firewalls ao longo do caminho de rede devem permitir o tráfego de ICMP (Internet Control Message Protocol).
  • Para evitar falsos positivos, todos os firewalls ao longo do caminho de rede devem permitir o tráfego no protocolo UCS do SQL Server proprietário. Bloquear o protocolo pode levar a um teste de conexão bem-sucedido, mas a conexão não é criada.
  • As configurações avançadas de firewall com guardrails no nível do pacote precisam ser configuradas corretamente para permitir o tráfego entre SQL Server e Instância Gerenciada de SQL.

Para testar a conectividade de rede entre SQL Server e Instância Gerenciada de SQL no SSMS, siga estas etapas:

  1. Conecte-se à instância que será a réplica primária no SSMS.

  2. Em Pesquisador de Objetos, expanda bancos de dados e clique com o botão direito do mouse no banco de dados que você pretende vincular ao secundário. Selecione Tasks>Instância Gerenciada de SQL do Azure link>Test Connection para abrir o Network Checker assistente:

    Captura de tela do pesquisador de objetos no SSMS, com a conexão de teste selecionada no menu do link do banco de dados com o botão direito do mouse.

  3. Selecione Avançar na página Introdução do assistente Verificador de Rede.

  4. Se todos os requisitos forem atendidos na página Pré-requisitos, selecione Avançar. Caso contrário, resolva os pré-requisitos não atendidos e selecione Executar novamente a validação.

  5. Na página Logon, selecione Logon para se conectar à outra instância que será a réplica secundária. Selecione Próximo.

  6. Verifique os detalhes na página Especificar Opções de Rede e forneça um endereço IP, se necessário. Selecione Próximo.

  7. Na página Resumo, examine as ações executadas pelo assistente e selecione Concluir para testar a conexão entre as duas réplicas.

  8. Examine a página Resultados para validar a conectividade existente entre as duas réplicas e selecione Fechar para concluir.

Cuidado

Continue com as próximas etapas somente se você validou a conectividade de rede entre os ambientes de origem e de destino. Caso contrário, solucione os problemas de conectividade de rede antes de continuar.

Para obter mais informações sobre o recurso de link, examine os seguintes recursos: