MySQL 8.0 root@localhost登录失败主因是认证插件不兼容,需查plugin字段是否为auth_socket或caching_sha2_password,改用mysql_native_password并显式指定@'localhost',缺则新建用户并FLUSH PRIVILEGES。

不是密码错了,是 MySQL 8.0 重启后根本没走你预期的密码验证流程——root@'localhost' 的认证插件可能被设成了 auth_socket 或 caching_sha2_password,而你的客户端不支持或没匹配上。
查 plugin 值是否为 auth_socket(Linux/macOS 常见)
Ubuntu/Debian 系统默认安装的 MySQL 8.0 会把 root@'localhost' 的 plugin 设为 auth_socket。它压根不验密码,只认系统用户身份,所以输对密码也报 Access denied for user 'root'@'localhost'。
- 先用系统权限连进去:
sudo mysql -u root - 执行:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root'; - 如果看到
plugin = 'auth_socket',就是它在拦你 - 别直接
UPDATE mysql.user SET plugin = 'mysql_native_password'—— MySQL 8.0 会拒绝这种写法,甚至让账号不可用 - 必须用:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; - 注意:必须显式写
'root'@'localhost',漏掉@'localhost'就会改错账号(比如改到@'%')
确认有没有 'root'@'localhost' 这一行(重置后常丢)
有些重置操作只改了 'root'@'127.0.0.1' 或 'root'@'%',但没补 'root'@'localhost'。而 mysql -u root -p 默认走 Unix socket,只匹配 localhost 这个 host。
- 执行:
SELECT Host, User FROM mysql.user WHERE User = 'root'; - 结果里没有
localhost?那就得手动创建:CREATE USER 'root'@'localhost' IDENTIFIED BY '密码'; - 再授权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; - 最后别忘:
FLUSH PRIVILEGES;
临时密码没拿到 or 拼错了(Windows/macOS 初始化常见)
MySQL 8.0 初始化时生成的临时密码只写进数据目录下的错误日志(比如 /var/lib/mysql/hostname.err 或 C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err),不会出现在 /var/log/mysql/error.log 这类“常规路径”里。
- 先确认数据目录:
mysqld --verbose --help | grep "datadir"或查my.cnf - 进该目录,执行:
grep "temporary password" *.err - 如果没结果,说明初始化失败或用了
--initialize-insecure - 复制冒号后面完整字符串(包括末尾的
!、&等字符),粘贴时别带空格或换行 - 登录别用:
mysql -uroot -p'xxx'—— 特殊字符会被 shell 解析掉;改用:mysql -uroot -p然后手动输入
老客户端连不上 caching_sha2_password(PHP/Navicat 旧版典型)
MySQL 8.0 默认用 caching_sha2_password 插件,但 PHP 7.4 的 mysqli、Navicat 旧版等不支持,一连就报 ERROR 1045。
- 临时绕过:登录时加参数
--default-auth=mysql_native_password - 例如:
mysql -uroot -p --default-auth=mysql_native_password - 登录后立刻执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; - 否则下次还连不上
最易忽略的一点:改完 plugin 或密码后,必须执行 FLUSH PRIVILEGES; 才生效;而很多人以为 ALTER USER 自动刷了,其实没刷,导致重启后一切照旧。


















