MySQL 8远程访问认证失败求助:本地连接正常
解决MySQL 8.x远程连接"Authentication failed"问题
我之前帮好几个开发者排查过和你一模一样的问题——在MySQL 8.x上配置远程访问时,明明加了bind-address 0.0.0.0、给用户开了%权限,却还是报认证失败,但本地连接完全正常。核心原因其实是MySQL 8.x对默认认证插件做了关键改动,具体解决步骤如下:
先搞清楚问题根源
MySQL 5.7及之前的版本默认使用mysql_native_password作为认证插件,而MySQL 8.x默认换成了caching_sha2_password。很多旧版远程客户端(比如低版本的Navicat、旧JDBC驱动)还不支持这个新的加密认证方式,这就是你遇到认证失败的核心原因。
你可以先本地登录MySQL,执行这条命令确认用户的认证插件:
SELECT user, host, plugin FROM mysql.user;
看看你授权了%的那个用户,plugin字段是不是caching_sha2_password。
解决方案(二选一)
方法一:修改用户为兼容性更好的认证插件(推荐)
这个方法能快速解决大多数客户端不兼容的问题,把用户的认证方式改回旧版的mysql_native_password:
- 本地登录MySQL后,执行:
ALTER USER '你的用户名'@'%' IDENTIFIED WITH mysql_native_password BY '你的用户密码';
- 刷新权限使配置生效:
FLUSH PRIVILEGES;
改完之后再尝试远程连接,大概率就能成功了。
方法二:保留新认证插件,更新客户端
如果你想使用MySQL 8.x的新认证机制,需要确保你的远程客户端支持caching_sha2_password:
- GUI工具:比如Navicat要升级到12.1及以上版本,DataGrip等IDE要更新到最新版
- 编程驱动:比如JDBC驱动要用8.0.x版本,Python的
mysql-connector-python也要安装最新版
另外还要确认你的MySQL配置没有其他限制:
- 检查
mysqld.cnf里有没有skip_networking配置项,如果有要注释掉 - 有些MySQL 8的发行版可能把配置分散在多个文件里,比如
/etc/mysql/my.cnf.d/server.cnf,要确保所有相关配置文件里的bind-address都是0.0.0.0
额外排查点
如果上面的方法还不行,再检查这两个点:
- 服务器防火墙有没有放行3306端口:比如Ubuntu用
ufw allow 3306,CentOS用firewall-cmd --permanent --add-port=3306/tcp然后重启防火墙 - 用
telnet 你的服务器IP 3306或者nc -zv 你的服务器IP 3306测试端口是否能正常访问,排除网络层面的问题
内容的提问来源于stack exchange,提问作者sHaDeoNeR
相关产品推荐
相关产品推荐

