MySQL root@localhost登录失败主因是认证插件不兼容,需查plugin字段(auth_socket或caching_sha2_password),改用mysql_native_password并显式指定@'localhost',新建用户后须FLUSH PRIVILEGES,且localhost与127.0.0.1账号独立。

这个报错几乎从不因为密码输错——而是 MySQL 根本没走密码验证流程。你输入的密码再对也没用,因为 root@'localhost' 的认证插件被设成了 auth_socket 或 caching_sha2_password,而你的客户端不支持。
查清楚 root@localhost 用的是什么认证插件
先用系统权限连进去:sudo mysql -u root(不用输密码)
然后执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看 plugin 字段是否为:
-
auth_socket→ Ubuntu/Debian 默认配置,只认系统用户身份,不验密码 -
caching_sha2_password→ MySQL 8.0+ 默认,但老版命令行、PyMySQL 0.9 以下、Navicat 12 以前都不支持 -
mysql_native_password→ 兼容性最好的选项,应优先切至此
ALTER USER 必须带 @'localhost' 显式指定
改错账号是高频翻车点。执行下面这句时漏掉 @'localhost',就会去改 root@'%' 或 root@'127.0.0.1',而 mysql -u root -p 默认走 Unix socket,只匹配 'localhost' 这一行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';
如果提示 ERROR 1396 (HY000): Operation ALTER USER failed,说明该记录根本不存在,得先创建:
CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
别忘了 FLUSH PRIVILEGES(尤其新建用户或改 host 后)
MySQL 5.7.6+ 改认证插件后不一定需要刷新,但以下情况必须执行:
- 用
CREATE USER新建了'root'@'localhost' - 用
GRANT授权后想立刻生效 - 你不确定当前会话是否已加载最新权限缓存
就一条命令:FLUSH PRIVILEGES;
不执行它,哪怕改完了,下次连接还是报错。
localhost 和 127.0.0.1 是两个完全不同的账号
这是最容易被忽略的底层逻辑:
-
mysql -u root -p→ 走 Unix socket → 匹配host = 'localhost' -
mysql -h 127.0.0.1 -u root -p→ 走 TCP/IP → 匹配host = '127.0.0.1'或host = '%'
所以如果你只修好了 'root'@'localhost',但测试时用了 -h 127.0.0.1,依然会失败。反过来也一样。
查全貌用:SELECT user, host FROM mysql.user WHERE user = 'root'; —— 看清到底有哪几条,再决定补哪条。








