mysql 8.0首次登录失败应先查错误日志获取临时密码(linux用sudo grep 'temporary password' /var/log/mysqld.log,windows查c:\programdata\mysql\mysql server 8.0\data*.err),日志丢失则用--skip-grant-tables(windows需加--shared-memory)或--init-file方式重置,切勿直接改配置文件或客户端操作。

刚装好的 MySQL 8.0,mysql -u root -p 提示密码错误或拒绝访问,说明你遇到的是「初始密码未设/未知」或「默认插件不兼容」问题——不是输错密码,而是根本没被允许用密码登录。直接改密码行不通,必须先绕过验证、再适配新机制。
确认 root 用户当前认证方式
安装后首次登录失败,往往不是密码错了,而是 plugin 字段不是你预期的类型。比如在某些 Linux 发行版上,root 默认使用 auth_socket 插件(免密本地登录),而 Windows 安装器可能生成了临时密码但没提示你记下。
- 如果还能用
mysql -u root(无-p)直接进,说明是auth_socket或空密码,此时执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
- 如果提示
ERROR 1045 (28000)且你确定没设过密码,大概率是安装时生成了临时密码,需查日志:sudo grep 'temporary password' /var/log/mysqld.log(Linux)或查看 Windows 安装向导最后一页/MySQL Installer 日志 - 若已知临时密码但登录后无法执行
ALTER USER,报错ERROR 1820 (HY000),说明密码过期策略强制你先改密码
用 ALTER USER 修改密码(推荐,适用于已登录场景)
只要能进入 MySQL 命令行(哪怕靠临时密码或 auth_socket),就该优先走标准 SQL 流程,避免触碰系统表。
- 语法必须带主机名,
'root'@'localhost'和'root'@'%'是两个独立账户,生产环境建议只改前者 - MySQL 8.0+ 密码需满足策略:至少 8 位,含大小写字母、数字、特殊字符;若不想被拦,可临时调低:
SET GLOBAL validate_password.policy = LOW;
- 执行后无需
FLUSH PRIVILEGES——ALTER USER会自动生效;但如果你顺手执行了,也不会报错 - 若连接客户端仍报认证失败,大概率是客户端不支持
caching_sha2_password插件,加一步切换回兼容模式:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass123!';
忘记/无初始密码?必须用 --skip-grant-tables 启动
这是唯一能绕过所有验证的方案,但风险明确:启动期间任何本地用户都能无密码连库。务必配合 --skip-networking 防止远程访问,并控制操作时间在 2 分钟内。
- Linux 下停止服务后,用此命令启动(注意路径和用户):
sudo mysqld --user=mysql --skip-grant-tables --skip-networking &
- Windows 下需指定
--datadir和--shared-memory,否则常卡住:mysqld --skip-grant-tables --shared-memory --datadir="C:\ProgramData\MySQL\MySQL Server 8.0\Data"
- 新开终端执行
mysql -u root登录后,先FLUSH PRIVILEGES;(此时必须刷,因权限表未加载) - 然后分两步走:先清空旧认证字段(尤其当
authentication_string非空但插件不匹配时),再设新密码:UPDATE mysql.user SET authentication_string = '' WHERE user = 'root';<br>ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123!';
重置后连不上?检查客户端驱动和连接参数
改完密码还报 Access denied,90% 是客户端问题,不是数据库没生效。
- Java 应用用 Connector/J 8.0+ 默认启用
caching_sha2_password,但旧版 Tomcat 或 Spring Boot 可能未配置对应驱动类,需显式加参数:?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false - 命令行客户端若报
ERROR 2059 (HY000),说明服务端用了caching_sha2_password而客户端不支持,要么升级客户端,要么如前文用IDENTIFIED WITH mysql_native_password切换插件 - Navicat、DBeaver 等 GUI 工具需在连接设置里手动选择「MySQL 8.0+」协议,否则默认按老协议握手失败
真正容易被忽略的点是:MySQL 8.0 的 authentication_string 字段和插件绑定极紧,直接 UPDATE 值而不改 plugin,或改了 plugin 却没清空 authentication_string,都会导致“密码像改了,但就是登不上”。动手前先 SELECT 一眼当前值,比反复试错快得多。











