MySQL 8.0 启动卡在“Starting MySQL”超30秒的根本原因是sha256_password插件首次启动时调用Windows RtlGenRandom生成RSA密钥对失败,因熵源不足导致阻塞;可通过skip-grant-tables+--initialize-insecure绕过并后续安全加固。

MySQL 8.0 启动卡在「Starting MySQL」超过30秒
根本原因通常是 mysql.sys 系统表初始化 + Windows 随机数生成器(RtlGenRandom)阻塞导致的。MySQL 8.0 默认启用 sha256_password 认证插件,该插件在首次启动时需调用系统级随机数接口生成 RSA 密钥对;而 Windows 上该调用在某些环境(如无硬件 RNG、虚拟机、低负载空闲态)下可能超时等待。
- 典型现象:
mysqld --console启动后长时间停在Starting MySQL...,日志无报错,任务管理器中mysqld.exeCPU 占用接近 0% - 验证方法:在命令行运行
mysqld --console --skip-grant-tables,若秒级启动,则基本确认是认证插件初始化阻塞 - 临时绕过:添加启动参数
--secure-file-priv=(空值)或--skip-ssl无效;真正起效的是禁用 RSA 密钥生成
如何跳过 MySQL 8.0 的 RSA 密钥自动生成
不是禁用加密,而是跳过首次启动时的密钥生成环节,让服务先起来再手动处理——这是最安全且立即生效的实操路径。
- 编辑
my.ini(通常位于C:\ProgramData\MySQL\MySQL Server 8.0\),在[mysqld]下添加:skip-grant-tables loose-default-authentication-plugin= mysql_native_password
- 删除或重命名
data\public_key.pem和data\private_key.pem(若存在),避免 mysqld 尝试加载旧密钥 - 以管理员身份运行命令行,执行:
mysqld --initialize-insecure --user=mysql(不生成 root 密码,也不触发 RSA 初始化) - 再运行
net start mysql,通常 2–5 秒内完成
启动后必须补上的安全配置
跳过初始密钥生成只是应急手段,不代表可以长期裸奔。Windows 下尤其要注意权限继承和证书路径问题。
- 启动成功后,立刻连接:
mysql -u root --skip-password(因用了--initialize-insecure) - 执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
- 退出后,从
my.ini中移除skip-grant-tables,并确保default_authentication_plugin=mysql_native_password保留 - 如果后续仍需
sha256_password(如对接某些 Java 客户端),可手动运行:ALTER INSTANCE ROTATE INCREMENTAL RECOVERY KEY;,但务必在系统有稳定熵源(如开启 Hyper-V 虚拟机时启用 “Integration Services → Security Services”)后再操作
Windows 服务注册与自动启动的隐藏陷阱
用 mysqld --install 注册的服务默认不读取当前目录下的 my.ini,而是优先找 C:\my.ini 或 C:\Windows\my.ini,极易导致配置未生效。
- 检查实际加载的配置文件:
mysqld --verbose --help | findstr "Default options" - 注册服务时显式指定配置:
mysqld --install MySQL80 --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" - 修改注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL80\ImagePath,确认路径末尾包含--defaults-file=... - 若使用 Docker Desktop for Windows 的 WSL2 后端,MySQL 8.0 建议直接部署在 WSL2 Linux 中——Windows 原生版的熵池问题在 WSL2 内核里基本不存在


















