能正常登录时应直接用ALTER USER修改密码:先从错误日志(如/var/log/mysqld.log)提取临时密码,再执行ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码',密码须满足复杂度要求且host必须匹配,无需FLUSH PRIVILEGES。

能正常登录,就别绕权限系统——直接用 ALTER USER 改,这是最安全、最符合 MySQL 5.7 设计意图的方式。其他方法(比如加 skip-grant-tables)只该用于“完全登不进去”的紧急恢复场景。
怎样从错误日志里准确提取初始临时密码
MySQL 5.7 安装后首次启动会自动生成一个一次性 root 密码,写进错误日志,但路径因系统而异:
- CentOS/RHEL(RPM 安装):
/var/log/mysqld.log - Ubuntu/Debian:
/var/log/mysql/error.log或/var/log/syslog,需grep 'temporary password' - Windows(ZIP 解压版):在
data目录下找主机名命名的.err文件,如DESKTOP-ABC123.err
执行命令时注意空格和引号,例如:
sudo grep 'temporary password' /var/log/mysqld.log
输出类似:2026-06-08T10:22:34.123456Z 1 [Note] A temporary password is generated for root@localhost: YdsGaxOq>2n!,后面那段就是密码。
登录后必须立刻执行 ALTER USER,否则多数操作报 ERROR 1820
用临时密码登录后,MySQL 会强制要求你重置密码,此时任何非密码修改类语句(如 SHOW DATABASES、SELECT)都会失败:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
只能做两件事:改密码,或退出。正确命令是:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123!';
注意三点:
-
'root'@'localhost'中的host必须和日志里提示的一致(通常是localhost,不是127.0.0.1) - 新密码需满足
validate_password插件策略(默认要求 ≥8 位 + 大小写字母 + 数字 + 特殊字符),否则报ERROR 1819 - 不需要再手动执行
FLUSH PRIVILEGES,ALTER USER自动生效
为什么不能用 UPDATE user 表直接改 authentication_string
在能正常登录的前提下,硬写 UPDATE mysql.user SET authentication_string = PASSWORD('xxx') WHERE user = 'root' 是错的,原因有三:
- 它绕过了密码策略校验,可能设出弱密码,后续被插件拒绝使用
- 不会自动更新
password_expired和password_last_changed字段,导致下次登录仍被拦在ERROR 1820 -
PASSWORD()函数在 MySQL 5.7.6+ 已被标记为废弃,未来版本会移除,兼容性差
真正需要改表的场景,仅限于“连临时密码都丢了”且无法启动服务的情况,那才轮到 --skip-grant-tables 模式。
最容易被忽略的是 host 匹配和密码复杂度——很多人复制了日志里的密码却输错大小写或特殊字符,或者把 'root'@'localhost' 写成 'root'@'127.0.0.1',结果改完还是登不进去。


















