windows下5.7→8.0升级不能依赖mysql_upgrade,必须用mysqld --upgrade=force触发内核级元数据重构;需彻底清理服务注册项、注册表、环境变量、隐藏配置及权限,并显式设置default_authentication_plugin=mysql_native_password。

Windows下不能靠mysql_upgrade完成5.7→8.0升级
直接运行mysql_upgrade不仅无效,还可能让服务起不来。MySQL 8.0.16+ 启动时会自动检测并升级数据字典(如mysql.component、mysql.role_edges),此时再手动调用mysql_upgrade,大概率报错ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded——本质是客户端协议与已升级实例不匹配。如果你用的是8.0.15或更早版本,mysql_upgrade仍需执行,但必须等新mysqld进程成功启动一次之后才可运行。
升级前必须清理干净5.7残留
Windows上“卸载程序”只删了安装目录,真正卡住升级的往往是以下五处残留:
- 服务注册项:旧服务名(如
MySQL)仍指向5.7的my.ini和路径,必须先sc delete MySQL,再用新bin目录下的mysqld --install重建 - 数据目录权限:复制
datadir后,新8.0进程可能因继承权限丢失无法写入ibdata1或日志,建议右键属性→安全→高级→启用“替换子容器及对象的所有者” - 注册表项:重点检查
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL,确认ImagePath指向8.0的mysqld.exe - 环境变量PATH:确保旧5.7的
bin路径已从系统PATH中移除,否则命令行里mysqld --version可能仍显示5.7.x - 隐藏配置文件:
C:\ProgramData\MySQL\是默认datadir,该目录为系统隐藏,需在资源管理器开启“显示隐藏的项目”才能看到并备份
关键配置项必须显式设置
8.0默认认证插件改为caching_sha2_password,而绝大多数5.7客户端(尤其老版PHP/Java驱动)不支持,连接会直接拒绝。必须在8.0的my.ini中强制回退:
[mysqld] default_authentication_plugin=mysql_native_password
此外,sql_mode也得收紧,删掉8.0已移除的NO_AUTO_CREATE_USER和ONLY_FULL_GROUP_BY(后者会导致GROUP BY隐式排序失效,分页结果突变),推荐设为:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
验证是否真升级成功,别只看--version
mysqld --version返回8.0.x只是第一步。真正要确认的是数据字典是否完成迁移:
- 连上实例后查
SELECT VERSION(), @@version_comment;,确认主版本号和编译信息 - 执行
SELECT * FROM mysql.innodb_table_stats LIMIT 1;,若返回结果,说明数据字典表已从5.7的.frm+.ibd结构转为8.0的原子化字典 - 检查错误日志里有没有
Upgrading system tables或Completed upgrade字样——这是mysqld自动升级流程跑完的唯一可靠信号 - 运行
SHOW VARIABLES LIKE 'default_authentication_plugin';,输出必须是mysql_native_password,否则应用层连接会静默失败
最容易被忽略的是:升级后首次启动时,mysqld会在后台默默执行元数据升级,这个过程可能耗时数分钟(尤其data目录大时),期间net start MySQL看似成功,但实际服务尚未就绪。务必盯住错误日志,等它明确打出“completed”再连应用。











