mysql 8.0 远程连接失败主因是 host 字段、bind-address、防火墙三者至少一个未正确配置,且必须按“先改用户权限、再改 bind-address、最后开防火墙”顺序操作;直接 update user 表会报错,须用 alter user 或 create user 指定 mysql_native_password 插件,并重启服务、刷新权限、验证监听地址及安全组。

MySQL 8.0 远程连不上,基本不是“权限没给”,而是 host 字段、bind-address、防火墙三者中至少一个没对上——而且顺序不能乱:先改用户,再改监听,最后开防火墙。
修改 root 或新建用户时必须用 ALTER USER 或 CREATE USER
MySQL 8.0 不允许直接 UPDATE mysql.user SET host = '%',会报 ERROR 1396 (HY000)。你看到的 host = 'localhost' 是死值,删不掉、改不了,只能重命名或重建。
- 已有 root 用户:执行
ALTER USER 'root'@'localhost' RENAME TO 'root'@'%'; - 或新建专用用户(更安全):
CREATE USER 'remote_app'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass!2026'; - 接着必须授权:
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'remote_app'@'%';(别无脑GRANT ALL) - 最后强制刷新:
FLUSH PRIVILEGES;,否则内存缓存不会更新
bind-address = 0.0.0.0 必须出现在 [mysqld] 段且不能被覆盖
默认配置里 bind-address = 127.0.0.1 是硬性限制,外部流量根本进不到 MySQL 进程,防火墙再放行也白搭。
- 配置文件路径:Ubuntu/Debian 是
/etc/mysql/mysql.conf.d/mysqld.cnf,CentOS/RHEL 或 Windows 是/etc/my.cnf或C:\ProgramData\MySQL\MySQL Server 8.0\my.ini - 确认
[mysqld]下有且仅有一处bind-address = 0.0.0.0(不要写成0.0.0.0:3306) - 同时检查有没有
skip-networking = 1,有就删掉或注释 - 改完必须重启服务:
sudo systemctl restart mysql(Ubuntu)或net stop mysql80 && net start mysql80(Windows) - 验证是否生效:
ss -tlnp | grep :3306输出里得有*:3306或0.0.0.0:3306,不是127.0.0.1:3306
防火墙规则要匹配实际网络路径,ufw/firewalld/iptables 逻辑完全不同
很多人执行了 ufw allow 3306 却仍连不上,是因为没确认 MySQL 是否真在监听公网地址,或规则未持久化、未重载。
- Ubuntu(ufw):
sudo ufw allow 3306/tcp(全放开),或限制来源:sudo ufw allow from 192.168.10.55 to any port 3306 - CentOS/RHEL(firewalld):
sudo firewall-cmd --permanent --add-port=3306/tcp+sudo firewall-cmd --reload - Windows 防火墙:必须新建「入站规则」→「端口」→「TCP 3306」→ 勾选「域」「私有」「公共」所有配置文件
- 注意:云服务器(如阿里云、腾讯云)还有安全组策略,得单独在控制台放行 3306 入方向
最容易被忽略的是认证插件:MySQL 8.0 默认用 caching_sha2_password,但很多旧客户端(尤其是某些 Python 驱动、Navicat 旧版)只认 mysql_native_password。如果连接时报 Authentication plugin 'caching_sha2_password' cannot be loaded,就得在 CREATE USER 或 ALTER USER 时显式指定 IDENTIFIED WITH mysql_native_password。











