MySQL 8.0远程连接失败的六大根因:密码策略拦截、bind-address限制、GRANT后未FLUSH PRIVILEGES、用户host/plugin配置错误、防火墙未放行、客户端认证插件不匹配,任一环节断裂均导致静默拒绝。

CREATE USER 必须显式指定密码强度和认证插件
MySQL 8.0 默认启用 validate_password 插件,CREATE USER 'u'@'%' IDENTIFIED BY '123' 会直接报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。这不是语法问题,而是策略拦截。
实操建议:
- 先查策略:
SHOW VARIABLES LIKE 'validate_password%';,重点关注validate_password.policy(0=LOW, 1=MEDIUM, 2=STRONG) - 测试环境可临时设为 LOW:
SET GLOBAL validate_password.policy = LOW;(仅限非生产) - 密码必须含大小写字母 + 数字 + 至少一个特殊字符,例如:
'Abc123!@#' - 必须显式指定插件:
IDENTIFIED WITH mysql_native_password BY 'Abc123!@#',否则客户端(如 Navicat、PyMySQL)会卡在握手阶段或报ERROR 2059
bind-address 不是权限问题,是连接能否到达的第一道关
即使用户创建成功、GRANT 全部执行完毕,外部仍连不上——大概率是 MySQL 根本没监听外部地址。默认 bind-address = 127.0.0.1,所有远程请求在 TCP 层就被丢弃了。
实操建议:
- 编辑配置文件:
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或/etc/my.cnf(CentOS),在[mysqld]段下修改:bind-address = 0.0.0.0或限定内网段如bind-address = 192.168.10.0 - 改完必须重启服务:
sudo systemctl restart mysql - 验证是否生效:
ss -tlnp | grep :3306,输出中应含*:3306或0.0.0.0:3306,不能只有127.0.0.1:3306 - 云服务器(阿里云、腾讯云等)还需在安全组中放行
3306入方向端口
GRANT 后不执行 FLUSH PRIVILEGES 就等于没授权
MySQL 8.0 的 GRANT 命令不再隐式刷新权限缓存。漏掉这步,现象是:用户能登录,但 SHOW DATABASES; 只看到 information_schema,自己被授的库完全不可见。
实操建议:
- 授权后必须紧跟:
FLUSH PRIVILEGES; - 不要用
UPDATE mysql.user SET host = '%'这种方式“改用户”,MySQL 8.0 会报ERROR 1396 (HY000),且破坏系统表结构 - 推荐按最小权限原则授权,例如:
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.10.%';,避免用GRANT ALL ON *.* - 授权后验证插件是否生效:
SELECT user, host, plugin FROM mysql.user WHERE user = 'app_user';,返回的plugin字段必须是mysql_native_password
防火墙和客户端插件不匹配是最后两个常见断点
本地防火墙(ufw 或 firewalld)未放行 3306,或客户端未适配 caching_sha2_password,都会导致连接失败,但错误提示往往误导人去查权限。
实操建议:
- Ubuntu/Debian:
sudo ufw allow 3306;CentOS:sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - 客户端连接时若报
ERROR 2059,说明认证插件不兼容,不是密码错——此时应确认服务端用户已用mysql_native_password创建,而非靠ALTER USER ... IDENTIFIED WITH ...事后修改(易遗漏FLUSH PRIVILEGES) - Navicat 等工具连接时,务必在连接设置里显式选择认证方式为
MySQL 5.x或勾选“使用旧版认证协议” - 生产环境禁用
'%',优先用具体 IP 或 CIDR 段,如'192.168.10.%'
远程权限生效链条很短:bind-address → 用户 host + plugin → GRANT → FLUSH → 防火墙 → 客户端插件。任一环断裂,表现都是“连不上”,但根因完全不同。最容易被跳过的是 FLUSH PRIVILEGES 和客户端插件适配,这两处出问题时,日志里几乎不报错,只静默拒绝。


















