mysql 8.0默认root@localhost无法远程登录,必须显式创建root@'%'用户并授权;同时需修改bind-address=0.0.0.0、放行3306端口、将认证插件改为mysql_native_password,四者缺一不可。

root@localhost 不能直接远程登录,必须显式创建或修改 host 为 %
MySQL 8.0 安装后默认只有 root@localhost 用户,这个用户在权限表中 host 字段固定为 localhost,意味着它**只接受来自本机 Unix socket 或 127.0.0.1 的连接**,对任何外部 IP 都会返回 Access denied for user 'root'@'xxx.xxx.xxx.xxx'。
不能靠“改密码”或“重连”绕过——这是权限模型层面的硬限制。必须新增或更新用户记录:
- 先用本地命令登录:
mysql -u root -p - 执行:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的强密码'; - 再授权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - 最后刷新:
FLUSH PRIVILEGES;
注意:'root'@'%' 和 'root'@localhost 是两条独立记录,共存无冲突;生产环境应避免开放 %,改用具体网段如 'app_user'@'192.168.10.%'。
bind-address=127.0.0.1 会让 MySQL 拒绝所有远程 TCP 连接
即使你创建了 'root'@'%',如果 MySQL 配置里还锁着 bind-address = 127.0.0.1,服务进程本身就不会监听外部网络接口,客户端连都连不上,直接报 ERROR 2003 (HY000): Can't connect to MySQL server。
检查方式:sudo ss -tlnp | grep :3306 —— 若输出中 Local Address 是 127.0.0.1:3306,说明没生效。
修复步骤:
- 编辑配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf - 找到
bind-address行(通常在第 43 行附近),改为:bind-address = 0.0.0.0 - 同时确认
mysqlx-bind-address也注释掉或设为0.0.0.0 - 重启服务:
sudo systemctl restart mysql
改完务必再跑一次 ss 命令,确保看到的是 0.0.0.0:3306。
ufw/firewalld/云安全组三者缺一不可,3306 端口必须显式放行
Linux 系统防火墙(ufw 或 firewalld)和云平台安全组是两层独立网关。哪怕 MySQL 已监听 0.0.0.0:3306,只要其中任一关卡没放行,客户端 telnet 就会超时。
排查顺序必须是:客户端 → 云安全组 → 系统防火墙 → MySQL 监听状态。
常见操作:
- Ubuntu + ufw:
sudo ufw allow 3306/tcp,然后sudo ufw status numbered确认规则存在 - CentOS + firewalld:
sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - 阿里云/腾讯云:进控制台 → 安全组 → 入方向规则 → 添加端口 3306,源地址建议限定 CIDR 而非
0.0.0.0/0
验证是否通:从客户端执行 telnet your-server-ip 3306。能连上但报错认证失败?说明网络和防火墙 OK;连不上?优先查安全组和 ufw。
caching_sha2_password 插件导致 Navicat/旧客户端报错 1251
MySQL 8.0 默认用 caching_sha2_password 认证插件,但很多 GUI 工具(尤其 Navicat 15 及更早版本)不支持该协议,会直接弹出 Client does not support authentication protocol requested by server 或错误码 1251。
这不是权限或网络问题,而是握手阶段就失败了。解决方法只有两个:
- 升级客户端(Navicat 16+、MySQL Workbench 8.0+ 支持)
- 降级认证插件(推荐临时开发用):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
执行后记得 FLUSH PRIVILEGES;。注意:不要对 'root'@localhost' 做此操作,否则可能影响本地管理脚本。
真正容易被忽略的点是:这四个环节(用户 host、bind-address、防火墙、认证插件)必须全部满足,缺一不可。很多人改完一个就以为好了,结果卡在下一个环节,反复折腾。建议按“网络 → 监听 → 权限 → 认证”顺序逐项验证,别跳步。











