Partilhar via


Solucionar problemas de conectividade e outros erros

Aplica-se a:Banco de Dados SQL do AzureInstância Gerenciada SQL do Azurebanco de dados SQL no Fabric

Você recebe mensagens de erro quando a conexão com o Banco de Dados SQL do Azure, banco de dados SQL no Microsoft Fabric ou Instância Gerenciada SQL do Azure falha.

Como sempre, aplique as melhores práticas e diretrizes de design durante o processo de design do aplicativo .

Observação

Você pode usar o Verificador de Conectividade SQL do Azure para detetar e corrigir uma grande variedade de erros de conectividade.

Etapas para corrigir problemas comuns de conexão

  1. Verifique se o TCP/IP está habilitado como um protocolo cliente no servidor de aplicativos. Em servidores de aplicativos onde você não tem ferramentas SQL instaladas, verifique se o TCP/IP está habilitado executando cliconfg.exe (utilitário de rede cliente do SQL Server).

  2. Verifique a cadeia de conexão do aplicativo para certificar-se de que está configurado corretamente. Por exemplo, certifique-se de que a cadeia de conexão especifica a porta correta (1433) e o nome do servidor totalmente qualificado. Consulte Obter informações de conexão usando o SQL Server Management Studio.

  3. Tente aumentar o valor do tempo limite de conexão. Recomendamos o uso de um tempo limite de conexão de pelo menos 30 segundos.

  4. Teste a conectividade entre o servidor de aplicações e a Base de Dados SQL do Azure usando Início Rápido: utilize o SSMS para se conectar e consultar a Base de Dados SQL do Azure ou a Instância Gerida SQL do Azure, um ficheiro UDL, ping ou telnet. Para obter mais informações, consulte Solução de problemas de conectividade e Diagnóstico de problemas de conectividade.

    Observação

    Como etapa de solução de problemas, você também pode testar a conectividade em um computador cliente diferente.

  5. Como prática recomendada, os aplicativos conectados à nuvem devem usar a lógica de repetição.

Se estes passos não resolverem o problema, tente recolher mais dados e, em seguida, contacte o suporte. Se o seu aplicativo for um serviço de nuvem, habilite o registro. Este passo devolve a marca temporal UTC da falha. Para obter mais informações sobre como habilitar o log, consulte Habilitar o log de diagnóstico para aplicativos no Serviço de Aplicativo do Azure. Além disso, o Banco de dados SQL retorna a ID de rastreamento. Os Serviços de Atendimento Microsoft podem usar essas informações.

Implementar lógica de nova tentativa

É altamente recomendável que seus aplicativos cliente usem a lógica de repetição para que ela possa restabelecer uma conexão depois de dar tempo de falha transitória para se corrigir. Recomendamos que você atrase por 5 segundos antes de sua primeira tentativa. Tentar novamente após um atraso inferior a 5 segundos corre o risco de sobrecarregar o serviço de nuvem. Para cada nova tentativa subsequente, o atraso deve crescer exponencialmente, até um máximo de 60 segundos.

Para obter exemplos de código de lógica de repetição, consulte:

Para obter mais informações sobre como lidar com erros transitórios em seu aplicativo, consulte Solucionar problemas de erros de conexão transitória.

Uma discussão sobre o período de bloqueio para clientes que usam ADO.NET está disponível em Pool de conexões (ADO.NET).

Mensagens de erro de falha transitórias (40197, 40613 e outros)

A infraestrutura do Azure tem a capacidade de reconfigurar dinamicamente os serviços quando surgem cargas de trabalho pesadas no serviço Base de Dados SQL. Este comportamento dinâmico poderá fazer com que o seu programa cliente perca a ligação à base de dados ou à instância. Este tipo de condição de erro é chamado de falha transitória. Os eventos de reconfiguração da base de dados ocorrem devido a um evento planeado (por exemplo, uma atualização de software) ou a um evento não planeado (por exemplo, uma falha de processo ou balanceamento de carga). A maioria dos eventos de reconfiguração são de curta duração e devem ser concluídos em menos de 60 segundos, no máximo. No entanto, esses eventos ocasionalmente podem levar mais tempo para serem concluídos, como quando uma transação grande causa uma recuperação de longa duração. A tabela a seguir lista vários erros transitórios que os aplicativos podem receber ao se conectar ao Banco de Dados SQL do Azure.

Lista de códigos de erro de falha transitória

Código de erro Severidade Descrição
926 14 Database 'replicatedmaster' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server error log for more information.

Esse erro pode ser registado no log de erros da Instância Gerida SQL, por um curto período de tempo, durante o último estágio de uma reconfiguração, enquanto a instância primária antiga está a encerrar o seu log.
Outros cenários não transitórios envolvendo essa mensagem de erro são descritos na documentação de erros do MSSQL.
4060 16 Cannot open database "%.*ls" requested by the login. The login failed.

Para obter mais informações, consulte Erros 4000 a 4999
40197 17 The service has encountered an error processing your request. Please try again. Error code %d.

Você recebe esse erro quando o serviço está inativo devido a atualizações de software ou hardware, falhas de hardware ou quaisquer outros problemas de failover. O código de erro (%d) incorporado na mensagem de erro 40197 fornece informações adicionais sobre o tipo de falha ou failover que ocorreu. Alguns exemplos dos códigos de erro são incorporados na mensagem de erro 40197 são 40020, 40143, 40166 e 40540.
A reconexão conecta-lhe automaticamente a uma cópia saudável do seu banco de dados. Seu aplicativo deve detetar o erro 40197, registrar o código de erro incorporado (%d) na mensagem para solução de problemas e tentar se reconectar ao Banco de dados SQL até que os recursos estejam disponíveis e sua conexão seja estabelecida novamente. Para obter mais informações, veja Erros transitórios.
40501 20 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Para mais informações, consulte:
Gestão de recursos.
Limites de recursos para pools elásticos usando o modelo de compra DTU.
Limites baseados em vCore para bancos de dados únicos.
Limites baseados em vCore para piscinas elásticas.
Limites de recursos da Instância Gerenciada SQL do Azure.
40613 17 Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'.

Esse erro pode ocorrer se já houver uma conexão de administrador dedicado (DAC) estabelecida para o banco de dados. Para obter mais informações, veja Erros transitórios.
49918 16 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later.

Para mais informações, consulte:
Gestão de recursos.
Limites de recursos para pools elásticos usando o modelo de compra DTU.
Limites baseados em vCore para bancos de dados únicos.
Limites baseados em vCore para piscinas elásticas.
Limites de recursos da Instância Gerenciada SQL do Azure.
49919 16 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".

O serviço está ocupado processando várias solicitações de criação ou atualização para sua assinatura ou servidor. No momento, as solicitações estão bloqueadas para otimização de recursos. Consulta sys.dm_operation_status para operações pendentes. Aguarde até que as solicitações pendentes de criação ou atualização sejam concluídas ou exclua uma das solicitações pendentes e tente novamente sua solicitação mais tarde. Se suas operações parecerem travadas, aguarde a conclusão de outras operações em andamento ou cancele-as quando possível. Por exemplo, você pode cancelar uma cópia de banco de dados ou a criação de réplica geográfica excluindo o banco de dados ou a réplica que está sendo criada. Se não for possível cancelar uma operação aparentemente presa, abra um pedido de suporte com a Microsoft.
49920 16 Cannot process request. Too many operations in progress for subscription "%ld".

O serviço está ocupado processando várias solicitações para esta assinatura. No momento, as solicitações estão bloqueadas para otimização de recursos. Consulta sys.dm_operation_status para o status da operação. Aguarde até que as solicitações pendentes sejam concluídas ou exclua uma de suas solicitações pendentes e tente novamente sua solicitação mais tarde. Se suas operações parecerem travadas, aguarde a conclusão de outras operações em andamento ou cancele-as quando possível. Por exemplo, você pode cancelar uma cópia de banco de dados ou a criação de réplica geográfica excluindo o banco de dados ou a réplica que está sendo criada. Se não for possível cancelar uma operação aparentemente presa, abra um pedido de suporte com a Microsoft.
4221 16 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.

A réplica não está disponível para login porque faltam versões de linha para transações que estavam em andamento quando a réplica foi reciclada. O problema pode ser resolvido anulando ou confirmando as transações ativas na réplica primária. As ocorrências dessa condição podem ser minimizadas evitando longas transações de gravação no servidor principal.
615 21 Could not find database ID %d, name '%.*ls'

Isso significa que o cache na memória não está sincronizado com a instância do SQL Server e as pesquisas estão recuperando um ID obsoleto do banco de dados.

Os logons SQL usam cache na memória para obter o nome do banco de dados para mapeamento de ID. O cache deve estar sincronizado com o banco de dados back-end e atualizado sempre que ocorrer anexação e desanexação do banco de dados de/para a instância do SQL Server.
Você recebe esse erro quando o fluxo de trabalho de desanexação não consegue limpar o cache na memória a tempo e pesquisas subsequentes para o banco de dados apontam para ID de banco de dados obsoleto.
Tente se reconectar ao Banco de dados SQL até que o recurso esteja disponível e a conexão seja estabelecida novamente. Para obter mais informações, veja Erros transitórios.

Passos para resolver problemas de conectividade transitórios

  1. Verifique o Painel de Serviço do Microsoft Azure para quaisquer interrupções conhecidas que ocorreram durante o tempo durante o qual o aplicativo relata.
  2. Os aplicativos que se conectam a um serviço de nuvem, como o Banco de Dados SQL do Azure, devem esperar eventos periódicos de reconfiguração e implementar a lógica de repetição para lidar com esses erros, em vez de revelar erros de aplicativo aos usuários.
  3. À medida que um banco de dados se aproxima de seus limites de recursos, pode parecer um problema transitório de conectividade. Consulte Limites de recursos.
  4. Se os problemas de conectividade continuarem, ou se a duração durante a qual seu aplicativo encontrar o erro exceder 60 segundos ou se você vir várias ocorrências do erro em um determinado dia, registre uma solicitação de suporte do Azure selecionando Obter Suporte no site de Suporte do Azure.

O problema ocorre se o aplicativo não pode se conectar ao servidor.

Para resolver esse problema, tente as etapas (na ordem apresentada) na seção Etapas para corrigir problemas comuns de conexão .

O servidor/instância não foi encontrado ou não estava acessível (erros 26, 40, 10053)

Erro 26: Erro ao localizar o servidor especificado

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.(provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)

Erro 40: Não foi possível abrir uma conexão com o servidor

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

Erro 10053: Ocorreu um erro no nível de transporte ao receber resultados do servidor

10053: A transport-level error has occurred when receiving results from the server. (Provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine)

Esses problemas ocorrem se o aplicativo não pode se conectar ao servidor.

Para resolver esses problemas, tente as etapas (na ordem apresentada) na seção Etapas para corrigir problemas comuns de conexão .

Não é possível conectar-se ao servidor devido a problemas de firewall

Erro 40615: Não é possível conectar-se ao < servername >

Para resolver esse problema, defina as configurações de firewall no Banco de Dados SQL por meio do portal do Azure.

Erro 5: Não é possível conectar-se ao < servername >

Para resolver esse problema, verifique se a porta 1433 está aberta para conexões de saída em todos os firewalls entre o cliente e a Internet.

Não é possível iniciar sessão no servidor (erros 18456, 40531)

Falha de login para o usuário '< Nome de usuário >'

Login failed for user '<User name>'.This session has been assigned a tracing ID of '<Tracing ID>'. Provide this tracing ID to customer support when you need assistance. (Microsoft SQL Server, Error: 18456)

Para resolver esse problema, contate o administrador do serviço para fornecer um nome de usuário e senha válidos.

Normalmente, o administrador de serviço pode usar as seguintes etapas para adicionar as credenciais de login:

  1. Faça logon no servidor usando o SQL Server Management Studio (SSMS).

  2. Para verificar se o nome de logon está desabilitado, execute a master seguinte consulta SQL no banco de dados:

    SELECT name, is_disabled FROM sys.sql_logins;
    
  3. Se o nome correspondente estiver desativado, você pode decidir habilitá-lo usando a seguinte instrução:

    ALTER LOGIN <User name> ENABLE;
    
  4. Se o nome de usuário de logon do SQL não existir, edite e execute a seguinte consulta SQL para criar um novo logon SQL:

    CREATE LOGIN <SQL_login_name, sysname, login_name>
    WITH PASSWORD = '<password, sysname, Change_Password>';
    GO
    
  5. No Pesquisador de Objetos do SSMS, expanda Bancos de Dados.

  6. Selecione o banco de dados ao qual você deseja conceder permissão ao usuário.

  7. Clique com o botão direito do rato em Segurança e, em seguida, selecione Novo, Utilizador.

  8. No script gerado com espaços reservados, siga as etapas para substituir os parâmetros do modelo SSMS e executá-lo, por exemplo:

    CREATE USER [<user_name, sysname, user_name>]
    FOR LOGIN [<login_name, sysname, login_name>]
    WITH DEFAULT_SCHEMA = [<default_schema, sysname, dbo>];
    GO
    
    -- Add user to the database owner role
    EXEC sp_addrolemember N'db_owner', N'<user_name, sysname, user_name>';
    GO
    

    Você também pode usar sp_addrolemember para mapear usuários específicos para funções de banco de dados específicas.

    Observação

    No Banco de Dados SQL do Azure, considere a sintaxe ALTER ROLE mais recente para gerenciar a associação à função de banco de dados.

Para obter mais informações, consulte Autorizar acesso ao banco de dados.

Erros de tempo limite de conexão expirado

System.Data.SqlClient.SqlException (0x80131904): Tempo limite de conexão expirou

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=3; handshake=29995;

System.Data.SqlClient.SqlException (0x80131904): Tempo limite expirado

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

System.Data.Entity.Core.EntityException: O provedor subjacente falhou em Open

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. -> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. -> System.ComponentModel.Win32Exception: The wait operation timed out

Não é possível conectar-se ao nome do < servidor >

Cannot connect to <server name>.ADDITIONAL INFORMATION:Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=231; handshake=983; [Login] initialization=0; authentication=0; [Post-Login] complete=13000; (Microsoft SQL Server, Error: -2) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=-2&LinkId=20476 The wait operation timed out

Essas exceções podem ocorrer devido a problemas de conexão ou consulta. Para confirmar se problemas de conectividade causaram esse erro, consulte Confirmar se um erro é causado por um problema de conectividade.

Os tempos limite de conexão ocorrem porque o aplicativo não pode se conectar ao servidor. Para resolver esse problema, tente as etapas (na ordem apresentada) na seção Etapas para corrigir problemas comuns de conexão .

Erros de terminação da conexão de rede

As bibliotecas de cliente SQL se conectam ao Banco de Dados SQL do Azure e à Instância Gerenciada SQL do Azure usando o protocolo de rede TCP. Uma biblioteca de cliente usa um componente de nível inferior chamado provedor TCP para gerenciar conexões TCP. Quando o provedor TCP deteta que um host remoto encerra inesperadamente uma conexão TCP existente, a biblioteca de cliente gera um erro. Como o erro é um erro do cliente e não um erro do SQL Server, não há nenhum número de erro SQL incluído. Em vez disso, o número do erro é 0 e a mensagem de erro do provedor TCP é usada.

Exemplos de erros de terminação de conexão de rede incluem:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) An existing connection was forcibly closed by the remote host

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following: the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Erros de terminação de conexão podem ocorrer porque o banco de dados ou pool elástico está temporariamente indisponível. Eles também ocorrem devido a vários problemas na infraestrutura de rede entre o servidor de banco de dados e o aplicativo cliente, incluindo firewalls, dispositivos de rede, etc. Estes problemas podem ser transitórios ou permanentes. Como orientação geral, os aplicativos devem usar um número fixo de tentativas repetidas para esses erros antes de considerá-los falhas permanentes.

Erros de governança de recursos

O Banco de Dados SQL do Azure usa uma implementação de governança de recursos baseada no Administrador de Recursos para impor limites de recursos. Saiba mais sobre o gerenciamento de recursos no Banco de Dados SQL do Azure.

Os erros de governança de recursos mais comuns são listados primeiro com detalhes, seguidos por uma tabela de mensagens de erro de governança de recursos.

Erros 10928 e 10936: ID do recurso: 1. O limite de solicitação para o [banco de dados ou pool elástico] é %d e foi atingido

Se o limite de nível de banco de dados for atingido, a mensagem de erro detalhada neste caso diz: Resource ID : 1. The request limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

Se o limite do pool elástico for atingido, a mensagem de erro detalhada neste caso diz: Resource ID : 1. The request limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. Os limites do pool elástico são maiores do que os limites do banco de dados, para obter mais informações, consulte Gerenciamento de recursos no Banco de dados SQL do Azure. Os limites podem ser encontrados quando vários bancos de dados no pool usam um recurso (como trabalhadores) simultaneamente.

Essa mensagem de erro indica que o limite de trabalho para o banco de dados ou pool elástico foi atingido. O valor máximo de trabalhadores simultâneos para o objetivo de serviço do banco de dados ou pool elástico estará presente em vez do espaço reservado %d.

Observação

A oferta inicial do Banco de Dados SQL do Azure dava suporte apenas a consultas de thread único. Nessa altura, o número de pedidos era sempre equivalente ao número de trabalhadores. As mensagens de erro 10928 e 10936 no Banco de Dados SQL do Azure contêm o texto "O limite de solicitação [...] é N e foi atingido" para fins de compatibilidade com versões anteriores. O limite atingido é, na verdade, o número de trabalhadores. Se sua configuração de grau máximo de paralelismo (MAXDOP) for igual a zero ou maior que um, o número de trabalhadores pode ser muito maior do que o número de solicitações, e o limite pode ser atingido muito mais cedo do que quando MAXDOP é igual a um.

Saiba mais sobre Sessões, trabalhadores e solicitações.

Ligue-se à Conexão de Administrador Dedicado (DAC), se necessário.

Se houver um incidente ativo em que o limite de trabalhadores foi atingido, pode receber o Erro 10928 ao ligar-se usando SQL Server Management Studio (SSMS). Uma sessão pode se conectar usando a Conexão de Diagnóstico para Administradores de Banco de Dados (DAC) mesmo quando o limite máximo de trabalho tiver sido atingido.

Para estabelecer uma conexão com o DAC a partir do SSMS:

  • No menu, selecione Ficheiro > Nova > Consulta ao Mecanismo de Base de Dados
  • Na caixa de diálogo de conexão no campo Nome do servidor, digite admin:<fully_qualified_server_name> (por exemplo, admin:servername.database.windows.net).
  • Selecione Opções >>
  • Selecione a guia Propriedades da conexão
  • Na caixa Conectar ao banco de dados: , digite o nome do seu banco de dados
  • Selecione Conectar.

Se você receber o erro 40613, Database '%.&#x2a;ls' on server '%.&#x2a;ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '%.&#x2a;ls'isso pode indicar que outra sessão já está conectada ao DAC. Apenas uma sessão pode conectar-se ao DAC para um único banco de dados ou um pool elástico de cada vez.

Se você encontrar o erro 'Falha ao se conectar ao servidor' depois de selecionar Conectar, a sessão do DAC ainda pode ter sido estabelecida com êxito se você estiver usando uma versão das versões do SSMS anteriores à 18.9. As primeiras versões do SSMS tentaram fornecer o Intellisense para conexões com o DAC. Isso falhou, pois o DAC suporta apenas um único trabalhador e o Intellisense requer um trabalhador separado.

Não é possível usar uma conexão de DAC com o Pesquisador de Objetos no SSMS.

Reveja a sua percentagem de utilização do max_worker_percent

Para obter estatísticas de consumo de recursos do seu banco de dados durante 14 dias, faça uma consulta na vista de catálogo do sistema sys.resource_stats. A max_worker_percent coluna mostra a porcentagem de trabalhadores usados em relação ao limite de trabalhadores do banco de dados. Conecte-se ao master banco de dados no seu servidor lógico para consultar sys.resource_stats.

SELECT start_time, end_time, database_name, sku, avg_cpu_percent, max_worker_percent, max_session_percent 
FROM sys.resource_stats;

Você também pode consultar estatísticas de consumo de recursos da última hora a partir do modo de exibição de gerenciamento dinâmico sys.dm_db_resource_stats . Conecte-se diretamente ao seu banco de dados para consultar sys.dm_db_resource_stats.

SELECT end_time, avg_cpu_percent, max_worker_percent, max_session_percent
FROM sys.dm_db_resource_stats;

Reduza a utilização de mão de obra quando possível

O bloqueio de cadeias pode causar um aumento súbito no número de trabalhadores em um banco de dados. Um grande volume de consultas paralelas simultâneas pode causar um grande número de trabalhadores. Aumentar seu grau máximo de paralelismo (MAXDOP) ou definir MAXDOP para zero pode aumentar o número de trabalhadores ativos.

Faça a triagem de um incidente com trabalhadores insuficientes seguindo estes passos:

  1. Investigue se o bloqueio está ocorrendo ou se você pode identificar um grande volume de trabalhadores simultâneos. Execute a consulta a seguir para examinar as solicitações atuais e verificar se há bloqueio quando o banco de dados estiver retornando o erro 10928. Talvez seja necessário conectar-se com a Conexão de Administrador Dedicado (DAC) para executar a consulta.

    SELECT
        r.session_id, r.request_id, r.blocking_session_id, r.start_time, 
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        (SELECT COUNT(*) 
            FROM sys.dm_os_tasks AS t 
            WHERE t.session_id=r.session_id and t.request_id=r.request_id) AS worker_count,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1;
    GO
    
    1. Procure linhas com um blocking_session_id para identificar sessões bloqueadas. Encontre cada blocking_session_id na lista para determinar se a sessão também está bloqueada. Seguir os valores blocking_session_id e session_id vai levá-lo eventualmente ao bloqueador principal: uma sessão que não está bloqueada, mas que está a bloquear. Ajuste a consulta do bloqueador de cabeça.

      Sugestão

      Para obter informações mais completas sobre como solucionar problemas de longa execução ou consultas de bloqueio, consulte Compreender e resolver problemas de bloqueio.

    2. Para identificar um grande volume de trabalhadores simultâneos, revise o número geral de solicitações e a worker_count coluna de cada solicitação. Worker_count é o número de trabalhadores no momento amostrado e pode mudar ao longo do tempo à medida que a solicitação é executada. Ajuste as consultas para reduzir a utilização de recursos se a causa do aumento de trabalhadores for consultas simultâneas que estão sendo executadas em seu grau ideal de paralelismo. Para obter mais informações, consulte de ajuste de consulta/dicas .

  2. Avalie a configuração de grau máximo de paralelismo (MAXDOP) para o banco de dados.

Aumentar os limites de trabalhadores

Se o banco de dados ou pool elástico atingir consistentemente seu limite de trabalho apesar de abordar o bloqueio, otimizar consultas e validar sua configuração MAXDOP, considere dimensionar o banco de dados ou pool elástico para aumentar o limite de trabalho.

Encontre limites de recursos para o Banco de Dados SQL do Azure por camada de serviço e tamanho de computação:

Saiba mais sobre a governança de recursos do Banco de Dados SQL do Azure dos trabalhadores.

Erro 10929: ID do recurso: 1

10929: Resource ID: 1. The %s minimum guarantee is %d, maximum limit is %d and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. See http://go.microsoft.com/fwlink/?LinkId=267637 for assistance. Otherwise, please try again later.

Erro 40501: O serviço está atualmente ocupado

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

O erro 40501 é um erro de limitação do mecanismo, uma indicação de que os limites de recursos estão sendo excedidos.

Para obter mais informações sobre limites de recursos, consulte Gerenciamento de recursos no Banco de Dados SQL do Azure.

Erro 40544: O banco de dados atingiu sua cota de tamanho

40544: The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Incident ID: <ID>. Code: <code>.

Este erro ocorre quando o banco de dados atingiu sua cota de tamanho.

As etapas a seguir podem ajudá-lo a contornar o problema ou fornecer mais opções:

  1. Verifique o tamanho atual do banco de dados usando o painel no portal do Azure.

    Observação

    Para identificar quais tabelas estão consumindo mais espaço e, portanto, são potenciais candidatas à limpeza, execute a seguinte consulta SQL:

    SELECT o.name,
     SUM(p.row_count) AS 'Row Count',
     SUM(p.reserved_page_count) * 8.0 / 1024 AS 'Table Size (MB)'
    FROM sys.objects o
    JOIN sys.dm_db_partition_stats p on p.object_id = o.object_id
    GROUP BY o.name
    ORDER BY [Table Size (MB)] DESC;
    GO
    
  2. Se o tamanho atual não exceder o tamanho máximo suportado para sua edição, você poderá usar ALTER DATABASE para aumentar a configuração MAXSIZE.

  3. Se o banco de dados já tiver ultrapassado o tamanho máximo suportado para sua edição, tente uma ou mais das seguintes etapas:

    • Execute atividades normais de limpeza do banco de dados. Por exemplo, limpe os dados indesejados usando truncate/delete ou mova dados para fora usando o SQL Server Integration Services (SSIS) ou o utilitário de programa de cópia em massa (bcp).
    • Crie uma partição ou elimine dados, remova índices ou consulte a documentação para conhecer resoluções possíveis.
    • Para dimensionamento de banco de dados, consulte Dimensionar recursos de banco de dados único e Dimensionar recursos de pool elástico.

Erro 40549: A sessão é encerrada porque você tem uma transação de longa duração

40549: Session is terminated because you have a long-running transaction. Try shortening your transaction.

Se você encontrar esse erro repetidamente, tente resolver o problema seguindo estas etapas:

  1. Execute a seguinte consulta para ver todas as sessões abertas que têm um valor alto para a duration_ms coluna:

    SELECT
        r.start_time, DATEDIFF(ms,start_time, SYSDATETIME()) as duration_ms, 
        r.session_id, r.request_id, r.blocking_session_id,  
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1
    ORDER BY start_time ASC;
    GO
    

    Você pode ignorar linhas em que a coluna `input_buffer` mostra uma consulta lendo de `sys.fn_MSxe_read_event_stream`: estas solicitações estão relacionadas a sessões de Eventos Estendidos.

  2. Analise a coluna blocking_session_id para ver se o bloqueio está a contribuir para transações de longa duração.

    Observação

    Para obter mais informações sobre como solucionar problemas de bloqueio no Banco de Dados SQL do Azure, consulte Compreender e resolver problemas de bloqueio.

  3. Considere agrupar suas consultas em lote. Para obter informações sobre lotes, consulte Como usar o processamento em lote para melhorar o desempenho do Banco de Dados SQL do Azure e do aplicativo da Instância Gerenciada SQL do Azure.

Erro 40551: A sessão foi encerrada devido ao uso excessivo de tempdb

40551: The session has been terminated because of excessive TEMPDB usage. Try modifying your query to reduce the temporary table space usage.

Para contornar este problema, siga estes passos:

  1. Altere as consultas para reduzir o uso temporário de espaço de tabela.
  2. Solte objetos temporários depois que eles não forem mais necessários.
  3. Truncar tabelas ou remover tabelas não utilizadas.

Erro 40552: A sessão foi encerrada devido ao uso excessivo de espaço no log de transações

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Para resolver esse problema, tente os seguintes métodos:

Erro 40553: A sessão foi encerrada devido ao uso excessivo de memória

40553: The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Para contornar esse problema, tente otimizar a consulta.

Para obter um procedimento de solução de problemas detalhado, consulte Minha consulta está sendo executada corretamente na nuvem?

Para obter mais informações sobre outros erros de falta de memória e consultas de exemplo, consulte Solucionar problemas de erros de falta de memória com o Banco de Dados SQL do Azure.

Tabela de mensagens de erro de governança de recursos

Código de erro Severidade Descrição
10928 20 Resource ID: %d. The %s limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

A ID do recurso indica o recurso que atingiu o limite. Quando o ID de recurso = 1, isso indica que um limite de trabalhadores foi atingido. Saiba mais em Erro 10928: ID do recurso: 1. O limite de solicitação para o banco de dados é %d e foi atingido. Quando ID de Recurso = 2, isso indica que o limite de sessão foi atingido.
Saiba mais sobre os limites de recursos:
Gestão de recursos na Base de Dados SQL do Azure.
Limites de recursos para o modelo de compras DTU.
Limites baseados em vCore para bancos de dados únicos.
Limites de recursos da Instância Gerenciada SQL do Azure.
10936 20 Resource ID: %d. The %s limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

A ID do recurso indica o recurso que atingiu o limite. Quando o ID de recurso = 1, isso indica que um limite de trabalhadores foi atingido. Saiba mais em Erro 10936: ID do recurso: 1. O limite de solicitação para o pool elástico está %d e foi atingido. Quando ID de Recurso = 2, isso indica que o limite de sessão foi atingido.
Saiba mais sobre os limites de recursos:
Gestão de recursos na Base de Dados SQL do Azure.
Limites de recursos para pools elásticos usando o modelo de compra DTU.
Limites baseados em vCore para piscinas elásticas.
Limites de recursos da Instância Gerenciada SQL do Azure.
10929 20 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

A ID do recurso indica o recurso que atingiu o limite. Para threads de trabalho, a ID do Recurso = 1. Para sessões, o ID do recurso = 2. Para mais informações, consulte:
Gestão de recursos na Base de Dados SQL do Azure.
Limites de recursos para pools elásticos usando o modelo de compra DTU.
Limites baseados em vCore para bancos de dados únicos.
Limites baseados em vCore para piscinas elásticas.
Limites de recursos da Instância Gerenciada SQL do Azure.
Caso contrário, tente novamente mais tarde.
40544 20 The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.

Para dimensionamento de banco de dados, consulte Dimensionar recursos de banco de dados único e Dimensionar recursos de pool elástico.
40549 16 Session is terminated because you have a long-running transaction. Try shortening your transaction.

Para obter informações sobre lotes, consulte Como usar o processamento em lote para melhorar o desempenho do Banco de Dados SQL do Azure e do aplicativo da Instância Gerenciada SQL do Azure.
40550 16 The session has been terminated because it has acquired too many locks. Try reading or modifying fewer rows in a single transaction.

Para obter informações sobre lotes, consulte Como usar o processamento em lote para melhorar o desempenho do Banco de Dados SQL do Azure e do aplicativo da Instância Gerenciada SQL do Azure.
40551 16 The session has been terminated because of excessive tempdb usage. Try modifying your query to reduce the temporary table space usage.

Se você estiver usando objetos temporários, conserve espaço tempdb no banco de dados descartando objetos temporários depois que eles não forem mais necessários para a sessão. Para obter mais informações sobre tempdb limites na Base de dados SQL, consulte base de dados tempdb na Base de dados SQL.
40552 16 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Para obter informações sobre lotes, consulte Como usar o processamento em lote para melhorar o desempenho do Banco de Dados SQL do Azure e do aplicativo da Instância Gerenciada SQL do Azure.
Se executar inserções em massa utilizando o utilitário bcp.exe ou a classe System.Data.SqlClient.SqlBulkCopy, experimente usar as opções -b batchsize ou BatchSize para limitar o número de linhas copiadas para o servidor em cada transação. Se você estiver reconstruindo um índice com a ALTER INDEX instrução, tente usar a REBUILD WITH ONLINE = ON opção. Para obter informações sobre tamanhos de log de transações para o modelo de compra vCore, consulte:
Limites baseados em vCore para bancos de dados únicos.
Limites baseados em vCore para piscinas elásticas.
Limites de recursos da Instância Gerenciada SQL do Azure.
40553 16 The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Reduzir o número de operações ORDER BY e GROUP BY no seu código Transact-SQL reduz os requisitos de memória da consulta. Para dimensionamento de banco de dados, consulte Dimensionar recursos de banco de dados único e Dimensionar recursos de pool elástico. Para obter mais informações sobre erros de falta de memória e consultas de exemplo, consulte Solucionar problemas de erros de falta de memória com o Banco de Dados SQL do Azure.

Erros do pool elástico

Os seguintes erros estão relacionados à criação e ao uso de pools elásticos:

Código de erro Severidade Descrição Ação corretiva
1132 17 The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (%d) MBs.

Tentativa de gravar dados em um banco de dados quando o limite de armazenamento do pool elástico tiver sido atingido. Para obter informações sobre limites de recursos, consulte:
Limites de recursos para pools elásticos usando o modelo de compra DTU.
Limites baseados em vCore para piscinas elásticas.
Considere aumentar as DTUs e/ou adicionar armazenamento ao pool elástico, se possível, para aumentar seu limite de armazenamento, reduzir o armazenamento usado por bancos de dados individuais dentro do pool elástico ou remover bancos de dados do pool elástico. Para dimensionamento de pool elástico, consulte Dimensionar recursos de pool elástico. Para obter mais informações sobre como remover espaço não utilizado de bancos de dados, consulte Gerenciar espaço de arquivo para bancos de dados no Banco de Dados SQL do Azure.
10929 16 The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

Para obter informações sobre limites de recursos, consulte:
Limites de recursos DTU para pools elásticos.
Limites baseados em vCore para piscinas elásticas.
Caso contrário, tente novamente mais tarde. DTU / vCore min por banco de dados; DTU / vCore max por banco de dados. O número total de trabalhadores simultâneos em todos os bancos de dados no pool elástico tentou exceder o limite do pool.
Considere aumentar as DTUs ou vCores do pool elástico, se possível, para aumentar o seu limite de trabalhadores, ou remover bancos de dados do pool elástico.
40844 16 Database '%ls' on Server '%ls' is a '%ls' edition database in an elastic pool and cannot have a continuous copy relationship. N/A
40857 16 Elastic pool not found for server: '%ls', elastic pool name: '%ls'. Specified elastic pool does not exist in the specified server. Forneça um nome de pool elástico válido.
40858 16 Elastic pool '%ls' already exists in server: '%ls'. Specified elastic pool already exists in the specified server. Forneça um novo nome de pool elástico.
40859 16 Elastic pool does not support service tier '%ls'. Specified service tier is not supported for elastic pool provisioning. Forneça a edição correta ou deixe a camada de serviço em branco para usar a camada de serviço padrão.
40860 16 Elastic pool '%ls' and service objective '%ls' combination is invalid. Elastic pool and service tier can be specified together only if resource type is specified as 'ElasticPool'. Especifique a combinação correta de pool elástico e camada de serviço.
40861 16 The database edition '%.*ls' cannot be different than the elastic pool service tier which is '%.*ls'. The database edition is different than the elastic pool service tier. Não especifique uma edição de banco de dados diferente da camada de serviço do pool elástico. A edição do banco de dados não precisa ser especificada.
40862 16 Elastic pool name must be specified if the elastic pool service objective is specified. Elastic pool service objective does not uniquely identify an elastic pool. Especifique o nome do pool elástico se estiver a utilizar o objetivo de serviço deste.
40864 16 The DTUs for the elastic pool must be at least (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool below the minimum limit. Tente definir novamente as DTUs para o pool elástico para pelo menos o limite mínimo.
40865 16 The DTUs for the elastic pool cannot exceed (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool above the maximum limit. Tente definir novamente as DTUs para o pool elástico para não mais do que o limite máximo.
40867 16 The DTU max per database must be at least (%d) for service tier '%.*ls'. Attempting to set the DTU max per database below the supported limit. Considere o uso da camada de serviço do pool elástico que ofereça suporte à configuração desejada.
40868 16 The DTU max per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU max per database beyond the supported limit. Considere o uso da camada de serviço do pool elástico que ofereça suporte à configuração desejada.
40870 16 The DTU min per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU min per database beyond the supported limit. Considere o uso da camada de serviço do pool elástico que ofereça suporte à configuração desejada.
40873 16 The number of databases (%d) and DTU min per database (%d) cannot exceed the DTUs of the elastic pool (%d). Attempting to specify DTU min for databases in the elastic pool that exceeds the DTUs of the elastic pool. Considere aumentar as DTUs do pool elástico, diminuir o DTU mínimo por base de dados ou diminuir o número de bases de dados no pool elástico.
40877 16 An elastic pool cannot be deleted unless it does not contain any databases. The elastic pool contains one or more databases and therefore cannot be deleted. Remova bases de dados do pool elástico para poder excluí-lo.
40881 16 The elastic pool '%.*ls' has reached its database count limit. The database count limit for the elastic pool cannot exceed (%d) for an elastic pool with (%d) DTUs. Attempting to create or add database to elastic pool when the database count limit of the elastic pool has been reached. Considere aumentar as DTUs do pool elástico, se possível, para aumentar seu limite de banco de dados ou remover bancos de dados do pool elástico.
40889 16 The DTUs or storage limit for the elastic pool '%.*ls' cannot be decreased since that would not provide sufficient storage space for its databases. Attempting to decrease the storage limit of the elastic pool below its storage usage. Considere reduzir o uso de armazenamento de bancos de dados individuais no pool elástico ou remover bancos de dados do pool para reduzir suas DTUs ou limite de armazenamento.
40891 16 The DTU min per database (%d) cannot exceed the DTU max per database (%d). Attempting to set the DTU min per database higher than the DTU max per database. Verifique se o DTU min por banco de dados não excede o DTU max por banco de dados.
TBD 16 The storage size for an individual database in an elastic pool cannot exceed the max size allowed by '%.*ls' service tier elastic pool. The max size for the database exceeds the max size allowed by the elastic pool service tier. Defina o tamanho máximo do banco de dados dentro dos limites do tamanho máximo permitido pela camada de serviço do pool elástico.

Não é possível abrir o banco de dados "master" solicitado pelo login. O login falhou

Esse problema ocorre porque a conta não tem permissão para acessar o master banco de dados. Mas, por padrão, o SQL Server Management Studio (SSMS) tenta se conectar ao master banco de dados.

Para resolver este problema, siga estes passos:

  1. No ecrã de início de sessão do SSMS, selecione Opções e, em seguida, selecione Propriedades da Ligação.

  2. No campo Conectar ao banco de dados , insira o nome do banco de dados padrão do usuário como o banco de dados de logon padrão e selecione Conectar.

    Captura de ecrã da caixa de diálogo Ligar no SSMS, mostrando o separador Propriedades da Ligação.

Erros de leitura apenas

Se você tentar gravar em um banco de dados que é somente leitura, você receberá um erro. Em alguns cenários, a causa do status somente leitura do banco de dados pode não estar imediatamente clara.

Erro 3906: Falha ao atualizar a base de dados 'databaseName' porque a base de dados é de leitura apenas.

Ao tentar modificar um banco de dados somente leitura, o seguinte erro é gerado.

Msg 3906, Level 16, State 2, Line 1
Failed to update database "%d" because the database is read-only.

Há várias explicações possíveis para um banco de dados ser apenas de leitura.

Após um failover manual, os aplicativos ainda estão se conectando à réplica antiga

No Azure SQL Database, após um failover para outra réplica, a sua aplicação ainda pode estar a conectar-se à réplica primária anterior devido ao DNS. O roteamento de conexão de grupo de failover é implementado usando DNS.

Potenciais causas profundas:

  1. Durante a comutação por falha, os pontos de extremidade do grupo de comutação por falha são atualizados para apontar para os novos servidores primário e secundário aplicáveis, alterando o destino da entrada DNS relevante. Por padrão, as entradas DNS são criadas com um TTL de 30 segundos, o que significa que os clientes DNS armazenam essas entradas em cache por 30 segundos. Como resultado, as atualizações dos registros DNS não se propagam imediatamente; As entradas ficarão obsoletas até que todos os clientes e nós intermediários tenham atualizado seus caches. Portanto, pode levar de 0 a aproximadamente 10 minutos (dependendo da topologia de rede) para que os logins para endpoints do grupo de failover sejam redirecionados para seus novos destinos após um failover. Liberar caches DNS pode ou não ajudar o problema, já que nós de rede intermediários que respondem a solicitações DNS também armazenam em cache os resultados DNS por um tempo.

    A solução recomendada para esse problema é simplesmente esperar até que as entradas DNS sejam atualizadas no cliente. Atualmente, essa solução alternativa levaria a que o problema se resolvesse dentro de 10 minutos.

  2. Algumas bibliotecas de cliente SQL usam um recurso chamado "pool de conexões", que reutiliza conexões com a mesma fonte de dados em vez de fechá-las e reabri-las sempre que uma nova conexão de banco de dados é necessária. Em particular, o pool de conexões é habilitado em ADO.NET por padrão. Quando combinado quando o problema descrito em 1), o pool de conexões pode fazer com que conexões recém-abertas reutilizem uma conexão com o banco de dados antigo, impedindo assim que o aplicativo se conecte ao novo banco de dados primário indefinidamente.

Soluções:

Há três possíveis soluções alternativas para este problema de DNS após um failover de um Grupo de Failover:

  1. Modifique a aplicação para chamar SQLConnection.ClearAllPools ou SQLConnection.ClearPool(conn) sempre que for encontrado um erro de "só leitura".
  2. Na cadeia de conexão do aplicativo, especifique Pooling=False para desabilitar o pool de conexões. Isso deve ser testado, pois pode afetar significativamente o desempenho se o aplicativo abrir e fechar conexões com frequência.
  3. Outra opção para evitar os atrasos de replicação/cache de DNS é conectar-se diretamente usando o nome do servidor lógico do Banco de Dados SQL do Azure (do servidor secundário original, agora o novo primário) por uma janela de tempo após o 3906 ser encontrado.

Você pode estar conectado a uma réplica de somente leitura

Para o Banco de Dados SQL do Azure e a Instância Gerida SQL do Azure, pode estar ligado a um banco de dados numa réplica só de leitura. Nesse caso, a seguinte consulta usando a função DATABASEPROPERTYEX() retorna READ_ONLY:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');
GO

Se você estiver se conectando usando o SQL Server Management Studio, verifique se especificou ApplicationIntent=ReadOnly na guia Parâmetros de Conexão Adicionaisnas opções de conexão.

Se a conexão for de um aplicativo ou cliente usando uma cadeia de conexão, valide se a cadeia de conexão especificou ApplicationIntent=ReadOnly. Saiba mais em Conectar-se a uma réplica somente de leitura.

O banco de dados pode ser definido como somente leitura

Se você estiver usando o Banco de Dados SQL do Azure, o próprio banco de dados pode ter sido definido como somente leitura. Você pode verificar o status do banco de dados com a seguinte consulta:

SELECT name, is_read_only
FROM sys.databases
WHERE database_id = DB_ID();

Você pode modificar o status somente leitura de um banco de dados no Banco de Dados SQL do Azure usando ALTER DATABASE Transact-SQL. No momento, não é possível definir um banco de dados em uma instância gerenciada como somente leitura.

Confirmar se um erro é causado por um problema de conectividade

Para confirmar se um erro é causado por um problema de conectividade, examine o rastreio de pilha para quadros que mostram chamadas para abrir uma conexão, como os seguintes (observe a referência à classe SqlConnection).

System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at AzureConnectionTest.Program.Main(String[] args)
ClientConnectionId:<Client connection ID>

Quando a exceção é acionada por problemas de consulta, você notará uma pilha de chamadas semelhante à seguinte (observe a referência à classe SqlCommand ). Nesta situação, ajuste as suas consultas.

  at System.Data.SqlClient.SqlCommand.ExecuteReader()
  at AzureConnectionTest.Program.Main(String[] args)
  ClientConnectionId:<Client ID>

Para obter mais informações sobre o ajuste fino do desempenho, consulte: