A maioria das pessoas trata um nome de host do SQL Server como um endereço completo e uma VPN como algo permitido ou não. Na prática, uma instância nomeada obriga o cliente a fazer uma segunda consulta depois do DNS, e é essa consulta que um túnel quebra com mais frequência. Um endpoint explícito a evita, por isso tcp:host,port pode funcionar enquanto host\INSTANCE expira. A diferença está entre encontrar o serviço e ter permissão para usá-lo.

O mito: um nome de host significa uma porta

O nome do host resolve-se num endereço, e aí termina o seu trabalho. Uma instância nomeada acrescenta um nome de instância que o servidor tem de traduzir para uma porta TCP, e o cliente não o consegue adivinhar. A porta 1433 é o padrão de uma instância padrão, não uma propriedade de cada instância na máquina. Tratar as duas coisas como a mesma produz o sintoma clássico: o ping funciona, o DNS funciona, a verificação da 1433 não mostra nada, e a conclusão é que a rede bloqueia SQL.

Uma segunda suposição falha da mesma forma: que abrir a TCP 1433 é suficiente. Se a instância escuta noutro lugar, uma 1433 aberta prova apenas que há outra coisa ali. A porta tem de corresponder ao ouvinte, e o ouvinte é um detalhe de configuração do lado do servidor isso deve ser perguntado em vez de suposto.

O que o cliente realmente faz com uma instância nomeada

Depois de resolver o host, o cliente envia um pedido de descoberta ao SQL Server Browser por UDP 1434 e pergunta que porta a instância nomeada usa. O serviço de navegador responde do registo do próprio servidor, e depois o cliente abre uma ligação TCP a essa porta. Dois protocolos e duas portas estão envolvidos antes de sequer se tentar um início de sessão.

nslookup sqlhost.corp.example
nc -vzu sqlhost.corp.example 1434
Get-Service -Name SQLBrowser

Por isso um bloqueio apenas de UDP produz um tempo limite que parece um host morto. Se o serviço de navegador estiver parado ou desativado, o pedido de descoberta fica sem resposta, embora o motor de base de dados esteja a funcionar e a sua porta TCP esteja aberta. Se a instância estiver configurada com uma porta estática, o cliente ainda pergunta, a menos que lhe tenha sido dado o endpoint diretamente. Cada uma dessas falhas parece idêntica na mensagem de erro da aplicação, e precisam de correções diferentes.

O serviço de navegador é uma comodidade de descoberta, não a base de dados. Pará-lo não para o motor, e iniciá-lo não abre a porta TCP da instância.

Porque o endpoint explícito funciona quando o nome não funciona

Um endpoint explícito retira a consulta da sequência: o cliente liga-se diretamente ao endereço e à porta que indicou. Isso é primeiro um diagnóstico, não automaticamente uma correção permanente, porque a porta pode mudar se a instância for mais tarde reconfigurada para dinâmica. Compare as duas formas com o mesmo cliente e a mesma conta antes de tirar conclusões.

sqlcmd -S "tcp:sqlhost.corp.example,51433" -U app_login -Q "SELECT @@SERVERNAME"
Test-NetConnection sqlhost.corp.example -Port 51433

Se a forma explícita funcionar e a forma nomeada falhar, a descoberta é a lacuna, e pode escolher como fechá-la: permitir UDP 1434 através do túnel, ou pedir ao administrador que fixe uma porta estática e documente o endpoint. Ambas são decisões deliberadas com custos de manutenção diferentes. Abrir todas as portas do intervalo não é nenhuma delas, e é a opção que costuma ser proposta ao fim de um dia longo. Registe a escolha onde vivem as cadeias de ligação.

Se nenhuma das formas funcionar, o problema está a montante da descoberta. Verifique o ouvinte, a rota e a regra de acesso para a porta que a instância realmente usa antes de culpar o serviço de navegador.

Depois da descoberta: autenticação e identidade são separadas

Uma falha de início de sessão é um evento diferente de um tempo limite, e a identidade VPN não se torna um início de sessão SQL por causa do túnel. Quando o cliente chega à porta certa, o motor de base de dados aplica a sua própria autenticação e permissões. Misturar as duas fases num único ticket é como um problema de descoberta acaba atribuído à equipa errada. Leia o número do erro antes de mudar alguma coisa.

Mantenha o nome de host documentado se o controlador validar o certificado do servidor, porque ligar-se por endereço numérico pode alterar essa verificação em vez de resolver o problema original. Os controladores recentes da Microsoft cifram por predefinição, pelo que uma incompatibilidade de nome surge como erro de certificado após uma ligação TCP bem-sucedida. Isso é progresso, não uma nova falha.

O mito a abandonar é que um nome de host do SQL Server é um endereço completo. É um host mais, para uma instância nomeada, uma consulta que o túnel pode não transportar. Nomeie a porta, nomeie o caminho de descoberta, e a próxima falha dirá que camada corrigir.

Artigos relacionados