mysql 5.7+首次安装后必须用错误日志中的临时密码登录并强制重设,该密码12位以上、含大小写字母数字标点,仅对root@localhost有效,登录后须用alter user修改且满足复杂度策略。

这是 MySQL 5.7 及之后版本强制启用的安全机制,不是 bug,也不是疏忽——它直接关掉“空密码 root 可登录”这个最危险的入口。
临时密码是初始化阶段自动生成的,不是配置项或可开关功能
只要用官方包(RPM/DEB/tar.gz)执行 mysqld --initialize 或服务首次启动,就会触发生成逻辑。密码写入错误日志,且只出现一次;不查日志、不登录、不改密,后续所有 mysql -u root -p 都会报 Access denied。
- 生成规则固定:12 位以上,含大小写字母、数字、标点(如
2Rn,s-qTiRRu),不可预测 - 仅对
root@localhost生效,不涉及其他用户或主机名 - MySQL 8.0 起默认认证插件为
caching_sha2_password,密码哈希方式与旧版不同,不能复用老脚本直接 UPDATE
为什么不能跳过或禁用?
因为绕过它等于主动降级安全水位。你可能试过在 my.cnf 加 skip-grant-tables 启动,但那只是应急手段,不是安装设计意图——它会让整个实例在无权限校验下运行,一旦暴露在公网或内网未隔离环境,等同于裸奔。
-
mysql_secure_installation脚本依赖这个初始密码流程,跳过会导致它卡在“Enter current password”环节 - 某些云厂商镜像或 Docker 官方镜像会把临时密码输出到容器日志,但本地安装仍需自己查日志,没捷径
- 如果初始化时加了
--init-file,临时密码依然生成,只是后续 SQL 会覆盖它——但前提是你知道路径、有写权限、且服务能正常启动
查不到临时密码日志怎么办?
别重装,也别删 data 目录——数据还在,只是密码丢了。优先确认日志路径是否被轮转或权限限制:
- Linux:
/var/log/mysqld.log或/var/log/mysql/error.log,用sudo grep 'temporary password' /var/log/mysqld.log - macOS(Homebrew):
grep 'temporary password' /usr/local/var/mysql/*.err - Windows:
C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err(注意ProgramData是隐藏文件夹) - 若日志清空,就只能走
--skip-grant-tables或--init-file方式重置,但必须严格按步骤停服务、避免端口冲突、改完立刻删掉临时配置
真正容易被忽略的是:临时密码只对首次登录有效,且修改后必须执行 FLUSH PRIVILEGES;而很多人输错一次就以为密码错了,其实可能是复制时多了一个空格或换行符——特殊字符在终端里经常看不见。











