根本原因是客户端不支持caching_sha2_password插件,需先查SELECT user,host,plugin FROM mysql.user确认插件类型,再对'root'@'localhost'等具体host执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'并FLUSH PRIVILEGES。
MySQL 8.0 客户端无法用旧账号登录,根本不是账号密码错了,而是认证插件不匹配——caching_sha2_password协议旧客户端压根不认识,握手直接失败。
执行 ALTER USER 'user'@'host' IDENTIFIED BY 'xxx' 只改密码,不改插件,plugin 字段仍为 caching_sha2_password。Navicat、PHP mysqli、老版 JDBC 等会报 ER_NOT_SUPPORTED_AUTH_MODE 或 Authentication plugin 'caching_sha2_password' cannot be loaded,这不是网络或权限问题,是协议层拒认。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_pass';
host 必须和你实际连接时一致:用 mysql -h 127.0.0.1 连,就得改 'root'@'127.0.0.1',不是 'root'@'localhost'
FLUSH PRIVILEGES;,否则内存缓存没刷新,新插件不生效Linux 下 MySQL 8.0 默认给 root 配的是 auth_socket 插件,靠 Unix socket 认证,根本不读密码。你用 mysql -u root -p 输再多次密码都白搭。
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
auth_socket,必须切插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';
FLUSH PRIVILEGES;,然后新开终端重连(旧连接仍走老插件)'root'@'localhost' 和 'root'@'%' 是两条完全独立的用户记录。只改了前者,远程连 'root'@'%' 就等于在连一个没设密码、插件还是 caching_sha2_password 的空用户。
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'strong_pass';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
my.cnf 中 bind-address = 0.0.0.0,否则 MySQL 根本不监听外部请求3306 端口,否则客户端连都连不到,直接报 ERROR 2003
真正容易被忽略的点:MySQL 8.4+ 已默认不加载 mysql_native_password 插件,ALTER USER ... IDENTIFIED WITH mysql_native_password 会直接报错 Plugin 'mysql_native_password' is not loaded。降级插件只是临时解法,该升级客户端驱动的,绕不开。