MySQL 8.0远程连接失败主因是bind-address=127.0.0.1限制监听+默认caching_sha2_password认证插件不兼容,须同步修改为0.0.0.0、创建指定mysql_native_password的'用户'@'%'、放行3306端口并重启服务。

MySQL 8.0 远程连不上,99% 是 bind-address 和用户认证插件双重限制没解——光改权限或光开监听都不够,必须同步处理。
确认 MySQL 当前监听地址是否为 127.0.0.1
这是连接失败的第一道关卡。如果 netstat -tlnp | grep :3306 只显示 127.0.0.1:3306,说明 MySQL 拒绝外部网络接入,客户端发包根本到不了服务端。
- 配置文件位置因发行版而异:
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或/etc/my.cnf(CentOS/RHEL) - 找到
bind-address = 127.0.0.1行,改为bind-address = 0.0.0.0或直接注释掉整行 - 改完必须重启服务:
sudo systemctl restart mysql(Ubuntu)或sudo systemctl restart mysqld(CentOS) - 云服务器(如阿里云、腾讯云)还需检查安全组规则是否放行
3306/tcp
创建远程用户时必须指定 mysql_native_password 插件
MySQL 8.0 默认用 caching_sha2_password,但 Navicat、TablePlus、旧版 JDBC 驱动等不兼容,会报 ERROR 2059 (HY000) 或连接后立即断开。
- 不要直接改
root@localhost:它只对本地 socket 有效,GRANT对它加@'%'不生效 - 必须新建用户并显式声明插件:
CREATE USER 'devuser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!'; - 授权后务必执行
FLUSH PRIVILEGES;,否则权限不加载 - 生产环境禁用
'%',改用具体 IP 段,例如'192.168.10.%'或客户端固定公网 IP
防火墙和 SELinux 常被忽略但实际拦截连接
即使 MySQL 监听在 0.0.0.0:3306、用户也建好了,ufw 或 firewalld 仍会静默丢弃请求,现象是 ERROR 2003 (HY000): Can't connect to MySQL server。
- Ubuntu:
sudo ufw allow 3306/tcp,别用allow 3306(默认是 udp) - CentOS/RHEL:
sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - SELinux 启用时(
sestatus查看),需运行:sudo setsebool -P mysqld_connect_any on,否则连接会被拒绝 - 切勿为“省事”把
/var/run/mysqld/mysqld.sock权限设成777——这会破坏本地mysql -u root登录
最易踩的坑是以为改了 host = '%' 就万事大吉,却没意识到 caching_sha2_password 和防火墙是两个独立关卡;还有人重启 MySQL 后忘了 reload 防火墙规则,导致调试半天发现只是端口没放开。


















