结论是临时密码未写入预期日志文件,因log-error配置被注释或拼错,或初始化未成功执行;应先确认实际日志路径并检查初始化是否完成,再用--initialize--console重新生成密码。

直接说结论:不是密码丢了,是它根本没写进你正在看的日志文件里——要么 log-error 配置被注释或拼错,要么 MySQL 启动时压根没成功初始化,临时密码只在 mysqld --initialize 成功执行的那一刻输出一次,且默认不显示在终端,也不写进配置文件。
为什么 grep "temporary password" 没结果?
常见原因不是日志被删了,而是 MySQL 根本没把密码写进去:
-
log-error在my.cnf或my.ini中被注释(如#log-error=...)或拼错(如log_erro),导致输出全流向控制台;关掉 CMD/PowerShell 就彻底丢失 - data 目录非空(比如残留旧版 MySQL 数据),
mysqld --initialize会静默跳过初始化,不生成密码也不报错 - Windows 下日志路径其实是
C:\ProgramData\MySQL\MySQL Server 8.0\Data\你的主机名.err,不是localhost.err或mysql.err;ProgramData是隐藏目录,资源管理器默认不显示 - Linux 上用包管理器(apt/yum)安装但没启动服务,
/var/log/mysqld.log根本没创建,grep当然为空
怎么确认 MySQL 实际用了哪个 error.log?
别猜路径,用命令查真实配置:
- Linux/macOS:
sudo mysqld --verbose --help | grep "log-error"—— 输出的路径才是唯一可信来源 - Windows:任务管理器 → 详细信息 → 找
mysqld.exe→ 右键“属性” → “详细信息” → 看“命令行”字段里有没有--log-error= - 如果没显式指定:
/var/log/mysqld.log(RHEL/CentOS)、/var/log/mysql/error.log(Debian/Ubuntu)、C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err(Windows)是 fallback 路径
找不到就重跑 --initialize --console
这是最干净、最可控的兜底方式,比折腾 --skip-grant-tables 更安全:
- 先停服务:
sudo systemctl stop mysql(Linux)或net stop MySQL80(Windows) - 删掉整个 data 目录(备份前务必确认!):
sudo rm -rf /var/lib/mysql(Linux)或手动删C:\ProgramData\MySQL\MySQL Server 8.0\Data(Windows) - 以管理员权限重跑:
sudo mysqld --initialize --console --user=mysql(Linux)或mysqld --initialize --console(Windows) - 密码会直接打印在终端最后一行,格式为:
A temporary password is generated for root@localhost: xxxxxxxx—— 复制冒号后全部字符,包括末尾!或&,但不要带换行
用临时密码登录后立刻卡住怎么办
登录成功后马上执行 ALTER USER 却报 ERROR 1820 或 ERROR 1819,说明 MySQL 强制改密机制已触发:
-
ERROR 1820:必须立刻改密,否则连SELECT DATABASES;都被拦,执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123!'; -
ERROR 1819:密码强度不够,默认策略要求 ≥8 位 + 大小写字母 + 数字 + 特殊字符;本地开发可先UNINSTALL PLUGIN validate_password;再改 - 改完建议补一句
FLUSH PRIVILEGES;,某些插件组合下仍需它生效
真正容易被忽略的是:日志路径和初始化是否真正发生,这两点没确认清楚就盲目重装或删库,反而会丢数据。宁可花两分钟查 --log-error 和 ps aux | grep mysqld,也别靠运气翻错日志文件。











