问题背景

主机 Windows 系统使用 Navicat 远程连接 VMware 虚拟机 Ubuntu 环境下的 MySQL 时,一直报错:2003 - Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (10061)反复修改授权、重启服务都无法解决,经过一步步深度排查,最终彻底搞定。


一、报错现象总结

  1. Navicat 连接虚拟机 MySQL 失败,2003 错误
  2. 虚拟机内本地登录 MySQL 正常
  3. 主机能 ping 通虚拟机 IP,但连不上 3306 端口
  4. 多次执行授权、创建用户语句报语法错误 / 用户已存在

二、根本原因定位

经过排查,核心原因只有三点

  1. MySQL 默认只监听 127.0.0.1,不允许外部 IP 连接
  2. root 用户未开启远程权限(只允许 localhost 登录)
  3. 防火墙 / 端口拦截,或 MySQL 配置文件路径不熟悉导致修改失败

三、完整解决方案(一步到位,直接复制执行)

1. 查看 MySQL 端口监听状态(关键)

sudo netstat -anptu | grep 3306
  • 如果显示:127.0.0.1:3306 → 仅本地监听,外部无法连接
  • 如果显示:0.0.0.0:3306 → 正常,允许所有 IP 连接

2. 修改 MySQL 监听地址(最核心步骤)

Ubuntu 旧版本 MySQL 配置文件路径:/etc/mysql/my.cnf

执行一键修改命令:

sudo sed -i 's/bind-address.*=.*127.0.0.1/bind-address = 0.0.0.0/g' /etc/mysql/my.cnf

如果没有 bind-address 配置,直接追加:

echo "bind-address = 0.0.0.0" | sudo tee -a /etc/mysql/my.cnf

3. 重启 MySQL 服务

sudo service mysql restart

4. 授权 root 用户远程访问(旧版 MySQL 兼容语法)

mysql -uroot -p123456 -e "
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
"

5. 关闭防火墙(测试环境)

sudo ufw disable

6. 最终验证(必须执行)

sudo netstat -anptu | grep 3306

出现 0.0.0.0:3306 说明配置成功!

mysql -uroot -p123456 -e "SELECT user, host FROM mysql.user WHERE user='root';"

出现 root | % 说明远程权限开通成功!


四、Navicat 连接配置

  • 连接方式:MySQL
  • 主机 IP:虚拟机 IP(如:192.168.176.10)
  • 端口:3306
  • 用户名:root
  • 密码:123456

点击测试连接 → 连接成功!


五、踩坑总结(避坑指南)

  1. 不要只改权限不改监听地址
  2. 旧版 MySQL 不支持新版 CREATE USER 语法,直接用 GRANT 最稳
  3. Ubuntu 不同版本 MySQL 配置文件路径不同,优先改 /etc/mysql/my.cnf
  4. 监听地址必须是 0.0.0.0,不能是 127.0.0.1
  5. 防火墙一定要关闭或放行 3306 端口

六、结束语

Navicat 连接虚拟机 MySQL 2003 错误,本质就是 MySQL 没对外开放 + 权限没开

下面是一键执行命令虚拟机中运行:

#!/bin/bash
# 适配Ubuntu 14.04,仅操作存在的my.cnf配置文件
# 1. 停止MySQL服务
sudo service mysql stop

# 2. 修改my.cnf中的bind-address(核心配置文件)
sudo sed -i 's/bind-address.*=.*127.0.0.1/bind-address = 0.0.0.0/g' /etc/mysql/my.cnf

# 3. 若my.cnf中无bind-address配置,直接添加
if ! grep -q "bind-address = 0.0.0.0" /etc/mysql/my.cnf; then
    echo "bind-address = 0.0.0.0" | sudo tee -a /etc/mysql/my.cnf
fi

# 4. 启动MySQL服务
sudo service mysql start

# 5. 授权root用户远程访问(替换123456为你的MySQL密码)
sudo mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;"

# 6. 关闭防火墙,放行3306端口
sudo ufw disable

# 7. 验证3306端口监听状态(关键检查)
echo -e "\n===== 3306端口监听状态(需显示0.0.0.0:3306) ====="
sudo netstat -anptu | grep 3306

# 8. 验证root用户远程权限
echo -e "\n===== root用户权限(需显示root | %) ====="
sudo mysql -uroot -p123456 -e "SELECT user, host FROM mysql.user WHERE user = 'root';"

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐