A conexão com o SQL Server funciona às vezes


100

Um aplicativo ADO.Net só às vezes é capaz de se conectar a outro servidor na rede local. Parece aleatório se uma determinada tentativa de conexão é bem-sucedida ou falha. A conexão está usando uma string de conexão no formato:

Servidor = THESERVER \ TheInstance; Banco de dados = TheDatabase; ID do usuário = TheUser; Senha = ThePassword;

o erro retornado é:

Tempo limite de conexão expirado. O período de tempo limite decorreu durante a tentativa de consumir a confirmação do handshake pré-login.
Isso pode acontecer porque o handshake pré-login falhou ou o servidor não conseguiu responder a tempo.
A duração gasta ao tentar se conectar a este servidor foi - [Pré-Login] inicialização = 42030; aperto de mão = 0;

O aplicativo .NET é um pequeno aplicativo de teste que executa o seguinte código:

using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
    conn.Open();
    int rowCount = (int)cmd.ExecuteScalar();
}

TheTable é pequena, apenas 78 linhas.

No entanto, na mesma máquina em que o aplicativo .NET recebe este erro, posso me conectar a THESERVER usando SSMS e a ID de usuário / senha nomeada na string de conexão.

Por que a conexão pode falhar de um aplicativo ADO.Net, mas ter sucesso com credenciais idênticas de SSMS?


1
você pode estar encontrando o problema mencionado em blogs.msdn.microsoft.com/dataaccesstechnologies/2016/05/07/…
pardeepk

Respostas:


92

Descobriu-se que o TCP / IP foi habilitado para o endereço IPv4, mas não para o endereço IPv6 de THESERVER.

Aparentemente, algumas tentativas de conexão acabaram usando IPv4 e outras usando IPv6.

Habilitar TCP / IP para ambas as versões de IP resolveu o problema.

O fato de o SSMS ter funcionado acabou sendo uma coincidência (as primeiras tentativas provavelmente usaram IPv4). Algumas tentativas posteriores de conexão por meio do SSMS resultaram na mesma mensagem de erro.

Para habilitar TCP / IP para endereços IP adicionais:

  • Inicie o Sql Server Configuration Manager
  • Abra o nó SQL Server Network Configuration
  • Clique com o botão esquerdo em Protocolos para MYSQLINSTANCE
  • No painel direito, clique com o botão direito em TCP / IP
  • Clique em Propriedades
  • Selecione a guia Endereços IP
  • Para cada endereço IP listado, certifique-se de que Ativo e Ativado estejam ambos Sim.

Obrigado, isso resolveu o erro para mim. Curiosamente, todos os endereços IP foram configurados como desativados (anteriormente não eram). Seria bom saber o que pode fazer com que estes sejam desativados, pois não acho que a configuração tenha sido alterada manualmente no meu caso ...
Matt

Também nunca desativei manualmente meus endereços IPv6. Também me pergunto como eles acabaram incapacitados.
Eric J.

Não consigo habilitar o IPv6 por algum motivo. Ele diz que o serviço precisa ser reiniciado para que as alterações tenham efeito, mas nunca o mantém como "Sim". Alguma pista sobre como lidar com isso
Salman

5
Não tenho certeza se as entradas individuais desabilitadas são um problema, pois a guia Protocolo tem uma substituição 'ouvir todos', que informa ao SQL para ouvir em todos os IPs. Veja o seguinte link para documentação. msdn.microsoft.com/en-us/library/dd981060.aspx
ShaneH

2
estou vendo esse tipo de coisa no Azure, eu acho
tofutim

31

Eu tive o mesmo erro que acabou de surgir, alinhado suspeitamente com a última rodada de atualizações da Microsoft (02/09/2016). Descobri que o SSMS se conectou sem problemas enquanto meu aplicativo ASP.NET retornou o erro de "tempo limite decorrido ao tentar consumir a confirmação do handshake pré-login"

A solução para mim foi adicionar um tempo limite de conexão de 30 segundos na string de conexão, por exemplo:

ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"

Na minha situação, a única conexão afetada foi aquela que estava usando Segurança integrada e eu estava representando um usuário antes de conectar, outras conexões para o mesmo servidor usando autenticação SQL funcionaram bem!

2 sistemas de teste (clientes separados e servidores Sql) foram afetados ao mesmo tempo, levando-me a suspeitar de uma atualização da Microsoft!


Tive o mesmo problema, obrigado pela resolução. Eu estava me conectando usando segurança integrada por meio de VPN e aumentar o tempo limite de conexão padrão de 15s para 30s resolveu o problema para mim.
Mark G

1
Tive esse problema com o SQL 2014 LocalDB depois que setup.exe instalou o novo aplicativo e o processo de inicialização estava tentando criar o novo banco de dados. Essa correção me salvou de cuspir no manequim - obrigado Shaun!
Scott

1
Isso resolveu o problema para mim também. No meu caso, eu estava me conectando via VPN e adicionando uma entrada no arquivo hosts. O problema ocorria apenas ao usar o nome do host em aplicativos SSMS e .NET. Ao usar o endereço IP, o problema não ocorreu.
Dan

OBRIGADO POR ESTA RESPOSTA!
Konrad

17

Resolvi o problema como Eric, mas com algumas outras mudanças:

  • Inicie o Sql Server Configuration Manager
  • Abra o nó SQL Server Network Configuration
  • Clique com o botão esquerdo em Protocolos para MYSQLINSTANCE
  • No painel direito, clique com o botão direito em TCP / IP
  • Clique em Propriedades
  • Selecione a guia Endereços IP
  • Para cada endereço IP listado, certifique-se de que Ativo e Ativado estejam ambos Sim.

E

  • Para cada endereço IP listado, certifique-se de que as portas dinâmicas TCP estejam vazias e a porta TCP = 1433 (ou alguma outra porta)
  • Abra o firewall do Windows e verifique se a porta está aberta nas conexões de entrada

A solução não está funcionando para mim. Eu tenho um servidor que contém o site e o banco de dados e esse problema nunca ocorre nele, mas eu encontrei esse problema quando o servidor web é separado do servidor de banco de dados
Ibrahim Amer

11

Eu tive o mesmo problema, tentando conectar a um servidor em uma rede local (através de VPN) do Visual Studio, enquanto configurava um Modelo de Dados de Entidade.
Conseguido resolver apenas definindo TransparentNetworkIPResolution=falsea string de conexão. No VS Add Connection Wizard, você pode encontrá-lo na guia Advanced.


3
A configuração é TransparentNetworkIPResolution = False. É um novo recurso do .NET 4.6.1 e está ativado por padrão. Definir isso como falso removerá o tempo limite de 500 ms que esse recurso cria. Para obter mais informações: blogs.msdn.microsoft.com/dataaccesstechnologies/2016/05/07/…
Jorriss

Obrigado. Horas de pesquisa sobre este problema. Eu preciso adicionar esta resposta como favorita. O comentário de @Jorriss foi muito útil para entender o porquê. Você pode atualizar sua resposta para ter a palavra-chave correta. Jorriss tem a referência correta.
TravisWhidden

5

Eu tive o mesmo problema de handshake ao conectar-se a um servidor hospedado.

Abri minha rede e centro de compartilhamento e habilitei IPv6 em minha conexão de rede sem fio.

insira a descrição da imagem aqui


3

Meu executável que foi construído usando o .NET Framework 3.5 começou a relatar esses problemas de conexão em cerca de metade das vezes depois que algumas atualizações do Windows foram instaladas recentemente (semana de 7 de agosto de 2017).

Falhas de conexão foram causadas pelo .NET Framework 4.7 que foi instalado no computador de destino (a instalação automática do Windows Updates estava ativada) - https://support.microsoft.com/?kbid=3186539

A desinstalação do .NET Framework 4.7 resolveu problemas de conexão.

Aparentemente, há uma alteração significativa no .Net Framework 4.6.1 - TransparentNetworkIPResolution A atualização da string de conexão conforme o artigo também resolveu o problema sem a necessidade de reverter a versão do framework.


2

Corrigi esse erro no Windows Server 2012 e SQL Server 2012 habilitando o IPv6 e desbloqueando a porta de entrada 1433.


1
Acho que essa não pode ser uma resposta correta porque a pergunta contém "apenas às vezes". Uma porta bloqueada não resolverá a questão sobre isso.
Magier

2

Em nosso caso, o problema ocorreu devido à configuração do cluster de disponibilidade. Para resolver esse problema, tivemos que definir MultiSubnetFailovercomo True na string de conexão.

Mais detalhes no MSDN


1

Tive o mesmo problema, consegui resolver abrindo / habilitando a porta 1433 e tcp / ip no SQL Server Configuration Manager e depois reiniciei o servidor

insira a descrição da imagem aqui


1

No meu caso, acima de tudo, as opções já existiam.

Resolvido aumentando o tempo limite de conexão = 30.SQL Server Management Studio


1

Antes que você perca mais tempo resolvendo o problema, como eu, tente reiniciar sua máquina Windows . Funcionou para mim depois de aplicar todas as outras soluções.


0

Tive esse problema quando fiz uma migração do SharePoint 2010 para 2013. Suspeitei disso porque o servidor de banco de dados está do outro lado de um firewall que não roteia IP6 que estava tentando então usar IP6 e falhando na conexão com o banco de dados.

Acho que o problema agora está resolvido. Os erros parecem ter parado. O que fiz foi simplesmente desabilitar o IP6 (desmarcando-o) para o adaptador de rede nos servidores SharePoint.


0

Eu tive o mesmo problema, mas estava me conectando a um banco de dados remoto usando um endereço IP estático. Portanto, nenhuma das soluções acima resolveu meu problema.

Não consegui adicionar o mapeamento de usuário adequado para o login de segurança que estava usando, então a solução para mim foi simplesmente garantir que a configuração de mapeamento de usuário fosse definida para acessar meu banco de dados.


0

Resolvido esse problema, bloqueando / colocando endereços IP na lista negra que tentavam usar contas de usuário de força bruta. Verifique seus logs de acesso SQL para um grande número de tentativas de login malsucedidas (geralmente para a conta 'sa').


0

Para mim, descobri que o firewall do servidor Windows estava bloqueando a porta 1433, que é a porta padrão do servidor sql. Portanto, adicionar uma regra de entrada para aceitar essas conexões foi o truque para mim.


0

No meu caso, o parâmetro Persist Security Info=truecom o usuário e a senha na string de conexão está causando o problema. Removendo o parâmetro ou conjunto para falseresolver o problema.


0

Tente reiniciar o SQL Server simples antes de fazer algo drástico. Pode consertar. Fez por mim


0

Infelizmente, tive problemas com o SQL Server local instalado no Visual Studio e aqui muitas soluções não funcionaram para mim. Tudo que tenho que fazer é redefinir meu Visual Studio, indo para:

Painel de controle> Programa e recursos> Inicializador de configuração do Visual Studio

e clique no botão Mais e escolha Reparar

Depois disso, consegui acessar meu SQL Server local e trabalhar com bancos de dados SQL locais.


0

Eu tive o mesmo problema que foi resolvido automaticamente após a última atualização do Microsoft Windows, alguém teve o mesmo?


0

Eu tive o problema exato, tentei vários soultion não funcionou, finalmente reiniciei o sistema, ele funcionou bem.


0

Para rastrear o erro "Tempo limite de conexão expirado" , certifique-se de que:

Para obter mais detalhes, verifique o tempo limite de conexão expirado. O período de tempo limite decorreu ao tentar consumir a confirmação do handshake pré-login


Qual desses casos tem a ver com erros intermitentes?
RonJohn

Edite para divulgar a afiliação, é obrigatório . Obrigado.
Maximillian Laumeister

0

Adicionando uma resposta aqui, apesar da resposta aceita anteriormente. Como meu cenário foi confirmado como DNS. Mais especificamente, um tempo limite de dns durante o handshake pré-login. Ao mudar de um nome DNS para um endereço IP (ou usando a entrada do arquivo Hosts), você contorna o problema. Embora ao custo de perder a resolução automática de ip.

Por exemplo, mesmo com o valor de tempo limite de uma string de conexão definido como 60 por um minuto completo, isso ainda aconteceria alguns segundos após a tentativa. O que nos leva a questionar por que o tempo limite seria excedido antes do período de tempo limite especificado? DNS.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.