Ocorreu um erro não recuperável durante uma consulta ao banco de dados

5

Versão resumida: Por que Test-Connection report "Ocorreu um erro não recuperável durante uma consulta ao banco de dados" para um host offline em uma sub-rede diferente?

Estou usando o PowerShell para fazer ping de um host remoto com o cmdlet Test-Connection :

$Computer = "COMPUTER01"
Test-Connection -ComputerName $Computer -Count 3

Eu recebo a seguinte mensagem de erro:

System.Net.NetworkInformation.PingException: Testing connection to computer
'COMPUTER01' failed: A non-recoverable error occurred during a database
lookup ---> System.ComponentModel.Win32Exception: A non-recoverable error
occurred during a database lookup.

Meus servidores DNS são todos os controladores do Windows AD executando o serviço DNS. Eu sou capaz de resolver o nome do host para o endereço IP usando nslookup :

Name:    computer01.domain.com
Address:  192.168.2.153

O site da Microsoft diz o seguinte:

This is a nonrecoverable error. This indicates that some sort of nonrecoverable error occurred during a database lookup. This may be because the database files (for example, BSD-compatible HOSTS, SERVICES, or PROTOCOLS files) could not be found, or a DNS request was returned by the server with a severe error.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx

Pergunta: O que "pesquisa de banco de dados" pode estar falhando?

Solução de problemas pt. 1

Eu tentei ping o mesmo host, que também falha, mas com uma mensagem mais familiar:

C:\> ping COMPUTER01

Pinging COMPUTER01.domain.com [192.168.2.153] with 32 bytes of data:
Reply from 192.168.0.220: Destination host unreachable.

A execução de tracert para o endereço IP de destino confirma isso:

C:\> tracert -d 192.168.2.153

7    40 ms    40 ms    40 ms  192.168.0.220
8  192.168.0.220  reports: Destination host unreachable.

This message indicates one of two problems: either the local system has no route to the desired destination, or a remote router reports that it has no route to the destination...

If the message is "Reply From < IP address >: Destination Host Unreachable," then the routing problem occurred at a remote router, whose address is indicated by the "< IP address >" field. Use the appropriate utility or facility to check the IP routing table of the router assigned the IP address of < IP address >.

https://technet.microsoft.com/en-us/library/cc940095.aspx

Solução de problemas pt. 2

Eu dei uma olhada nos pacotes ICMP usando o WireShark. Eu posso ver que a resposta deste roteador é:

Type: 3 (Destination unreachable)
Code: 1 (Host unreachable)

Destination unreachable is generated by the host or its inbound gateway to inform the client that the destination is unreachable for some reason... Unreachable TCP ports notably respond with TCP RST rather than a Destination Unreachable type 3 as might be expected.

https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable

E finalmente

Eu também tenho uma confirmação separada / independente de que o host de destino é conhecido por estar fora da rede, o que explica porque o roteador não consegue "atingir" o alvo. Ainda estou me perguntando por que o cmdlet Test-Connection jogou o que é (para mim) uma mensagem de exceção tão enganosa.

    
por Charlie Joynt 20.05.2016 / 16:10

2 respostas

1

Após a solução de problemas que eu coloquei para isso, minha conclusão é simplesmente que Test-Connection está retornando uma mensagem de erro muito inútil e / ou interpretando mal a resposta "Destination host inacessível" sendo recebida do roteador.

Se alguém mais estiver vendo isso, sugiro executar um tracert para confirmar se há algum dispositivo na rota que possa estar retornando uma resposta à solicitação de ping.

Se você tiver alguma outra forma além de ping para determinar se o host está on-line ou não, ele fará uma boa verificação de integridade e ajudará a descobrir se você pode ignorar esses erros (usando -ErrorAction ) supondo que o host está offline:

$Computer = "COMPUTER01"

if(Test-Connection -ComputerName $Computer -Count 1 -ErrorAction SilentlyContinue) {
  "Online"
} else {
  "Offline"
}

Como observação, a única diferença entre ping e Test-Connection era que o tempo de vida (TTL) no pacote ICMP diferia entre ping (128) e Test-Connection ( 80). O último cmdlet inclui uma opção -TimeToLive , se isso for importante para qualquer pessoa; não fez diferença nos meus testes.

    
por 27.05.2016 / 14:15
1

Obrigado por compartilhar. Você me fez olhar para os documentos como eu estava tendo o mesmo erro.

Parece que esse é um "recurso" de Test-Connection ; eles parecem saber disso, pois fornecem uma solução alternativa.

A ajuda para Test-Connection diz que, se você quiser que ele retorne apenas um booleano, você deve usar a opção -Quiet quando estiver chamando, caso contrário ele tentará retornar um objeto. Aqui está o verbete:

When you use the AsJob parameter, the cmdlet returns a job object. When you use the Quiet parameter, it returns a Boolean. Otherwise, this cmdlet returns a Win32_PingStatus object for each ping.

https://technet.microsoft.com/en-us/library/hh849808.aspx

Então, -Quiet é para mim, em vez de -ErrorAction SilentlyContinue .

    
por 17.09.2016 / 18:31