Windows 下 MySQL 5.7 升级到 8.0 的关键步骤是:先彻底停服并备份,再替换二进制文件、修改 my.ini(显式设 default_authentication_plugin=mysql_native_password)、确保 datadir 权限继承正确,最后以 mysqld 自动升级机制完成元数据更新;mysql_upgrade 在 8.0.16+ 已失效,仅用于旧版本补全,误用会导致服务异常。

Windows 下不能直接用 mysql_upgrade 完成 5.7 → 8.0 升级,它只负责系统表兼容性修复,不是升级工具本身。 真正的升级动作是替换二进制、启动新版本 mysqld 并由其自动触发元数据升级流程。误以为运行一遍 mysql_upgrade 就算升级完成,会导致服务无法启动或数据字典损坏。
为什么 mysql_upgrade 在 8.0 启动后就失效了
MySQL 8.0.16 起,mysqld 启动时会自动检测数据目录版本并执行必要的系统表更新(如 mysql.component、mysql.role_edges 等),不再依赖外部调用 mysql_upgrade。此时手动运行 mysql_upgrade 会报错 ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded 或直接退出——因为它试图连接已升级的实例,而客户端协议/插件可能不匹配。
- 8.0.16+ 版本中
--upgrade=FORCE仅补全缺失表,--upgrade=NONE才真正跳过所有升级逻辑 - 若你用的是 8.0.15 或更早,
mysql_upgrade仍需手动执行,但必须在新mysqld进程已成功启动一次之后 - Windows 下尤其要注意:服务名默认仍是
MySQL,替换 bin 后若未用sc delete MySQL && mysqld --install重建服务,旧服务配置会指向 5.7 的my.ini和路径,导致启动失败
升级前必须验证的三个 Windows 特定检查点
Windows 环境下容易因权限、路径、服务注册问题卡在第一步。以下检查缺一不可:
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
- 确认当前 5.7 实例关闭干净:
net stop MySQL后检查任务管理器无残留mysqld.exe进程 - 备份并重命名原
my.ini(如改为my.ini.57.bak),新配置文件中必须显式设置default_authentication_plugin=mysql_native_password,否则应用连接会因caching_sha2_password插件不兼容而中断 - 确保新 8.0 的
bin目录已加入系统PATH,且命令行中运行mysqld --version返回的是 8.0.x —— 否则后续所有操作都可能调用到旧版本
实际升级步骤:从停服到可用的最小闭环
不要跳过中间验证环节。Windows 下最常出问题的是数据目录权限继承丢失和 ibdata1 兼容性,必须分步确认:
- 停止服务:
net stop MySQL - 复制整个
data目录到安全位置(不只是mysqldump):robocopy "C:\ProgramData\MySQL\MySQL Server 5.7\Data" "D:\backup\mysql8_data" /E /Z /R:1 - 替换
bin目录为 MySQL 8.0 解压后的文件,修改新my.ini中的datadir指向原路径(如C:/ProgramData/MySQL/MySQL Server 5.7/Data) - 以最小化方式启动验证:
mysqld --no-defaults --datadir="C:/ProgramData/MySQL/MySQL Server 5.7/Data" --console --skip-grant-tables --shared-memory—— 若看到Server version: 8.0.x且无Table 'mysql.component' doesn't exist报错,说明数据字典可加载 - 正常安装服务:
mysqld --install MySQL8 --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini",再net start MySQL8
真正危险的不是升级动作本身,而是假设“只要没报错就是成功”。Windows 下常见静默失败场景:服务看似启动,但错误日志里持续刷 InnoDB: Operating system error number 5(权限拒绝),或客户端能连上却查不到任何库——这通常意味着 datadir 权限未继承给 NETWORK SERVICE 或新服务账户。每次替换 bin 后,务必右键 data 目录 → 属性 → 安全 → 编辑 → 添加对应服务账户并赋予完全控制权。










