mysql 8.0 远程连接失败主因是 host 字段、认证插件(caching_sha2_password 不兼容旧客户端)、bind-address=127.0.0.1 限制监听、防火墙/安全组未放行四者至少一个未配置正确,且必须按“先改用户权限与插件、再改 bind-address、最后开防火墙及安全组”顺序操作。

MySQL 8.0 远程连不上,先看 host 字段和认证插件是否匹配
直接 UPDATE mysql.user SET host = '%' 会报 ERROR 1396 (HY000),这是 MySQL 8.0 的硬性限制——'root'@'localhost' 是保留条目,不能改,只能重建或重命名。
更关键的是,默认认证插件 caching_sha2_password 不被很多旧客户端(如 Navicat 旧版、某些 Python pymysql 版本)支持,连接时可能静默失败或提示 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 新建用户时必须显式指定插件:
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass!2026'; - 已有用户需重置认证方式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 别用
GRANT ALL PRIVILEGES,按需授权:GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'%'; - 执行完必须
FLUSH PRIVILEGES;,否则权限不生效
bind-address = 0.0.0.0 必须出现在 [mysqld] 段且唯一
默认配置里 bind-address = 127.0.0.1 是死锁项,哪怕防火墙全开、用户权限全给,外部请求也根本进不到 MySQL 进程——流量在内核层就被拦住了。
检查配置文件路径(Ubuntu 常见):/etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/mysql/my.cnf;确认只有一处 bind-address,且值为 0.0.0.0(不是 127.0.0.1,也不是空格或逗号分隔)。
- 编辑后保存,重启服务:
sudo systemctl restart mysql - 验证监听地址:
ss -tlnp | grep :3306输出中必须含*:3306或0.0.0.0:3306,而非127.0.0.1:3306 - 如果用 Docker 或 Snap 安装的 MySQL,
bind-address可能被封装在启动参数里,需额外处理
ufw/firewalld/云平台安全组,三者缺一不可
很多人执行了 sudo ufw allow 3306/tcp 却仍连不上,是因为只开了系统防火墙,忘了云服务商的安全组(如阿里云、腾讯云控制台)或 Windows 防火墙本身没放行。
Ubuntu(ufw)示例:
- 确保 ufw 已启用:
sudo ufw enable(首次启用会提示是否继续) - 放行端口:
sudo ufw allow from 192.168.10.55 to any port 3306 proto tcp(比全放开更安全) - 重载规则:
sudo ufw reload,然后sudo ufw status verbose确认规则已生效
CentOS/RHEL(firewalld):
sudo firewall-cmd --permanent --add-port=3306/tcpsudo firewall-cmd --reload
Windows Server:必须在「高级安全 Windows 防火墙」中新建入站规则,协议选 TCP、端口填 3306、配置文件勾选「域」「私有」「公共」——少一个就可能不通。
测试连接前,先用 telnet 或 nc 排查网络层
不要一上来就用 mysql -h x.x.x.x -u user -p 报错就怀疑权限或密码。先确认 TCP 层是否通:
- 从客户端机器执行:
telnet your-server-ip 3306或nc -zv your-server-ip 3306 - 如果超时或拒绝连接(Connection refused),说明要么 MySQL 没监听公网地址,要么防火墙/安全组没放行
- 如果能连上但立即断开,才是认证或权限问题,此时再查 MySQL 日志:
sudo tail -n 20 /var/log/mysql/error.log - 注意:本地
localhost和远程 IP 的连接走的是不同路径,mysql -u root -p成功 ≠ 远程成功
实际配置中最容易被跳过的环节是认证插件与客户端兼容性校验,以及云平台安全组的独立配置——这两项不解决,前面所有操作都白做。











