MySQL 连接报错 Host name lookup failed 如何快速修复?

文章导读
MySQL 客户端报错"Host name lookup failed",本质是操作系统无法将配置的主机名解析为 IP 地址。最直接的修复方式是暂时改用 IP 连接,或修正本地 DNS 配置。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

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 的机制。这个报错明确发生在客户端发起连接之前的解析阶段。

MySQL 连接报错 Host name lookup failed 如何快速修复?

分步处理

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/hosts

Windows 环境:
文件路径为 C:\Windows\System32\drivers\etc\hosts。需用管理员身份运行记事本打开该文件,添加相同映射记录。

修改后刷新 DNS 缓存:

ipconfig /flushdns

2. 检查 DNS 配置文件

查看 Linux 下的 DNS 设置:

MySQL 连接报错 Host name lookup failed 如何快速修复?
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,那是解决连接后权限验证慢的问题,不是解决客户端解析失败的问题。