数据库查找期间发生不可恢复的错误

数据库查找期间发生不可恢复的错误

简洁版本:为什么Test-Connection对于不同子网上的离线主机,会报告“数据库查找期间发生不可恢复的错误”?


我正在使用 PowerShell 通过以下 cmdlet ping 远程主机Test-Connection

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

我收到以下错误消息:

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.

我的 DNS 服务器都是运行 DNS 服务的 Windows AD 控制器。我可以使用以下命令将主机名解析为 IP 地址nslookup

Name:    computer01.domain.com
Address:  192.168.2.153

MS 网站内容如下:

这是一个不可恢复的错误。这表示在数据库查找过程中发生了某种不可恢复的错误。这可能是因为找不到数据库文件(例如,与 BSD 兼容的 HOSTS、SERVICES 或 PROTOCOLS 文件),或者服务器返回了包含严重错误的 DNS 请求。

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

问题:哪些“数据库查找”可能失败?


故障排除 pt. 1

我尝试过ping同一个主机,也失败了,但是出现了更熟悉的消息:

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.

tracert针对目标 IP 地址运行可证实这一点:

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.

此消息表明存在以下两个问题之一:本地系统没有到达所需目的地的路由,或者远程路由器报告它没有到达目的地的路由...

如果消息为“回复自 < IP 地址 >:目标主机无法访问”,则路由问题发生在远程路由器上,其地址由“< IP 地址 >”字段指示。使用适当的实用程序或工具检查分配了 IP 地址 < IP 地址 > 的路由器的 IP 路由表。

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


故障排除第 2 部分

我使用 WireShark 查看了 ICMP 数据包。我可以看到来自此路由器的响应是:

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

无法到达目的地由主机或其入站网关生成,以通知客户端由于某种原因无法访问目标...无法访问的 TCP 端口特别以 TCP RST 进行响应,而不是如预期的那样以“目标无法访问类型 3”进行响应。

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

最后

我还单独/独立地确认目标主机已脱离网络,这解释了路由器无法“到达”目标的原因。我仍然想知道为什么 cmdlet 会Test-Connection抛出(对我来说)如此误导性的异常消息。

答案1

谢谢分享。你让我看了文档,因为我遇到了同样的错误。

看起来这是的一个“功能” Test-Connection;他们似乎知道这一点,因为他们提供了一种解决方法。

的帮助中Test-Connection说,如果您希望它仅返回布尔值,则应-Quiet在调用时使用 switch,否则它会尝试返回一个对象。以下是逐字逐句的:

使用 AsJob 参数时,此 cmdlet 将返回一个作业对象。使用 Quiet 参数时,它将返回一个布尔值。否则,此 cmdlet 将为每个 ping 返回一个 Win32_PingStatus 对象。

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

-Quiet对我来说也是如此-ErrorAction SilentlyContinue

答案2

在我对此进行故障排除后,我的结论很简单,它Test-Connection返回了一个非常无用的错误消息和/或误解了从路由器收到的“目标主机不可达”响应。

如果其他人看到此情况,我建议运行tracert以确认路由中是否有任何设备可能返回对 ping 请求的响应。

如果您有除了 ping 之外的其他任何方法来确定主机是否在线,那么这将进行良好的健全性检查,并帮助您确定是否可以-ErrorAction在假设主机处于离线状态的情况下忽略这些错误(使用):

$Computer = "COMPUTER01"

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

顺便提一下,ping和之间似乎唯一的区别Test-Connection在于 ICMP 数据包的生存时间 (TTL) 在ping(128) 和Test-Connection(80) 之间有所不同。如果这对任何人来说都很重要,那么后一个 cmdlet 确实包含一个-TimeToLive开关;在我的测试中,它没有任何区别。

相关内容