MySQL 客户端报错"Host name lookup failed",本质是操作系统无法将配置的主机名解析为 IP 地址。最直接的修复方式是暂时改用 IP 连接,或修正本地 DNS 配置。
先说结论:这是典型的 DNS 解析失败问题,客户端找不到对应的主机名,优先排查本地网络解析配置。
- 先确认:检查连接字符串中的主机名是否拼写正确,以及本地能否 ping 通。
- 先处理:在客户端机器上修改 hosts 文件或更换为 IP 地址连接。
- 再验证:使用 mysql 命令重新连接,确认不再报解析错误。
命令速用版
如果你需要立刻恢复业务,可以尝试直接用 IP 替代域名连接。假设数据库域名为 db.example.com,IP 为 192.168.1.100:
ping db.example.com
nslookup db.example.com
mysql -h 192.168.1.100 -u root -p如果 ping 不通或 nslookup 无返回,说明本地 DNS 解析有问题,优先修网络。
为什么会这样
MySQL 客户端在发起连接前,需要先通过操作系统的 DNS 服务将你在连接命令中填写的 host(例如 db.example.com)转换成 IP 地址。如果本地 DNS 服务器无响应、配置错误,或者 hosts 文件中没有记录,操作系统就会返回"主机名查找失败"。
这与 MySQL 服务端是否开启 skip-name-resolve 无关,那是服务端反查客户端 IP 的机制。这个报错明确发生在客户端发起连接之前的解析阶段。
分步处理
1. 检查并修改 hosts 文件
Linux 环境:
查看文件内容:
cat /etc/hosts如果没有对应记录,使用 vim 编辑(需要 root 权限):
sudo vim /etc/hosts或使用 echo 命令追加(以 192.168.1.100 映射 db.example.com 为例):
echo "192.168.1.100 db.example.com" | sudo tee -a /etc/hostsWindows 环境:
文件路径为 C:\Windows\System32\drivers\etc\hosts。需用管理员身份运行记事本打开该文件,添加相同映射记录。
修改后刷新 DNS 缓存:
ipconfig /flushdns2. 检查 DNS 配置文件
查看 Linux 下的 DNS 设置:
cat /etc/resolv.conf确认 nameserver 地址是否可达。如果是 Docker 容器内部,检查容器启动时的 dns 参数。
3. 临时改用 IP 连接
如果 DNS 一时修不好,修改应用程序的数据库配置,将 host 字段改为具体的 IP 地址。这是最快的止血方案。
4. 排查防火墙
确认本地出站规则没有拦截 UDP 53 端口,否则 DNS 请求发不出去也会报这个错。
怎么验证是否生效
在客户端机器上,直接使用 mysql 命令行工具尝试连接:
mysql -h 你的主机名或 IP -u 用户名 -p如果能进入 mysql 提示符,说明解析和连接都正常了。同时观察应用程序日志,确认不再出现 Connection error 相关的报错。
常见坑
- Docker 环境:容器内的 DNS 解析依赖宿主机或 Docker daemon 配置,容器内 ping 不通不代表宿主机不通,需在容器内调试。
- IPv6 干扰:有些系统优先解析 IPv6 地址,如果数据库只监听 IPv4,可能解析成功但连接失败,注意区分报错信息。
- 服务端反查混淆:不要看到这个错就去改服务端的 skip-name-resolve,那是解决连接后权限验证慢的问题,不是解决客户端解析失败的问题。