MySQL远程连接失败需依次检查五环节:bind-address配置、user表host权限、MySQL 8.0认证插件兼容性、云安全组策略、系统防火墙规则。

bind-address 限制了谁也连不上
MySQL 默认只监听 127.0.0.1,哪怕你改了用户权限、开了防火墙,远程连接照样失败——因为请求根本没进 MySQL 进程。关键配置在 /etc/mysql/my.cnf(或 /etc/my.cnf)里,找到这一行:
bind-address = 127.0.0.1
把它注释掉(加 #),或者改成 bind-address = 0.0.0.0(监听所有 IPv4 地址)。改完必须重启服务:systemctl restart mysql(Ubuntu/Debian)或 systemctl restart mysqld(CentOS/RHEL)。
user 表 host 字段决定“能不能登录”
即使网络通了,MySQL 还会查 mysql.user 表:只有 user 和 host 同时匹配,才允许登录。默认的 'root'@'localhost' 只认本机,远程来的 'root'@'192.168.1.100' 或 'root'@'%' 是完全不同的账号。
- 不要直接
UPDATE user SET host='%' WHERE user='root'—— 这会覆盖原有记录,可能引发权限混乱 - 推荐用
GRANT创建新账号或扩权:GRANT ALL ON *.* TO 'admin'@'%' IDENTIFIED BY 'your_strong_password'; - 执行后务必
FLUSH PRIVILEGES;,否则变更不生效
MySQL 8.0 的 plugin 加密方式导致 Navicat 报 2059 错误
MySQL 8.0 默认用 caching_sha2_password 插件,但很多客户端(Navicat、旧版 JDBC 驱动)只认 mysql_native_password。现象是:密码没错,但报 ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded。
解决方法是显式指定插件并重设密码:
ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
FLUSH PRIVILEGES;
注意:不是改 authentication_string 字段,而是用 IDENTIFIED WITH 语法;如果用户不存在,先 CREATE USER 再 ALTER。
别忘了云服务器的安全组和本地防火墙
本地改完,远程还是连不上?大概率卡在中间层:
-
腾讯云/阿里云/AWS 等都有「安全组」,默认关闭
3306端口,必须手动放行(源 IP 可设为0.0.0.0/0或限定具体 IP 段) - Linux 本机防火墙也要开:
firewall-cmd --permanent --add-port=3306/tcp+firewall-cmd --reload - 检查是否误启了
skip-grant-tables(配置文件里有这行就全关权限校验,但也会导致授权失效)
真正能连上的链路是:远程客户端 → 云安全组 → 服务器防火墙 → MySQL bind-address → user 表 host+plugin+密码校验。漏掉任意一环,都是 “Access denied” 或 “Connection refused”。










