必须停服、检查、清理、迁移,否则大概率启动失败或连接中断;MySQL 5.7→8.0是跨大版本升级,数据字典、认证机制、默认字符集全部重构,无热升级路径,需用mysqlcheck --all-databases --check-upgrade扫描MyISAM等不兼容项,并清理废弃参数、显式配置字符集与认证插件。

不能“无缝”,必须停服、检查、清理、迁移,否则大概率启动失败或连接中断。所谓“无缝”是误解,MySQL 5.7 到 8.0 是跨大版本升级,数据字典结构、认证机制、默认字符集全部重构,没有热升级路径。
为什么 mysqlcheck --check-upgrade 必须在 5.7 上先跑
这是唯一能提前暴露表级不兼容项的手段。Windows 下直接调用 5.7 自带的 mysqlcheck,它会扫描存储引擎、分区定义、字段类型等底层结构问题。
- 常见错误现象:
error : The storage engine for the table is not supported in this version of MySQL—— 说明存在 MyISAM 表,8.0 不允许系统库用 MyISAM,业务库也建议转InnoDB - 该检查不覆盖 SQL Mode 或字符集隐式转换,所以它只是第一关,不是全部
- 必须加
--all-databases和--check-upgrade参数,缺一不可:mysqlcheck -u root -p --all-databases --check-upgrade - 发现 MyISAM 表后,别手写 ALTER 逐个改:用脚本批量生成语句:
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM';
my.cnf 配置里哪些参数 Windows 用户最容易留错
Windows 下的 my.ini(不是 my.cnf)若照搬 5.7 配置,8.0 启动时会直接退出,错误日志里只有一行:Unknown variable。
- 必须删掉的废弃项:
query_cache_type、expire_logs_days、innodb_file_format、explicit_defaults_for_timestamp -
sql_mode中若含NO_AUTO_CREATE_USER,启动失败,报错类似:Unknown system variable 'NO_AUTO_CREATE_USER' - 认证插件必须显式设为兼容模式:
default_authentication_plugin=mysql_native_password,否则旧版 Navicat、PHP mysqli、JDBC 5.x 连接时静默报Access denied - 字符集建议显式锁定:
character_set_server=utf8mb4和collation_server=utf8mb4_0900_ai_ci,避免新建库表行为漂移
mysqldump 导出时 Windows 路径和编码怎么避坑
Windows 命令行默认编码是 GBK,而 MySQL 8.0 默认 utf8mb4,不指定字符集会导致 emoji 存储失败、中文乱码,且 dump 文件本身可能损坏。
- 导出命令必须加
--default-character-set=utf8mb4,且不能只写utf8(那是utf8mb3,8.0 已弃用) - 绝对不要用
mysqldump --all-databases:5.7 的mysql系统库结构与 8.0 完全不兼容,导入后mysqld启动直接崩溃 - 只导业务库:
mysqldump --default-character-set=utf8mb4 -u root -p --databases db1 db2 --single-transaction --routines --triggers --events > backup.sql - 导出后用记事本另存为 UTF-8 编码(无 BOM),再导入;否则
mysql -u root -p 可能报错 <code>Invalid utf8mb4 character string
升级后连不上?先查这三处 Windows 特有盲区
Windows 下升级失败,90% 和 Linux 不同——根源在服务注册、权限继承和路径硬编码。
- 旧版 MySQL 服务名可能仍是
MySQL57,新安装的 8.0 若没手动指定服务名,会注册成MySQL80,但应用仍连MySQL57,导致“连接被拒绝” - Windows 服务账户权限未重置:原 5.7 用
LocalSystem,8.0 安装向导可能默认用当前用户,导致C:\ProgramData\MySQL\MySQL Server 8.0\Data目录访问被拒,错误日志显示Can't start server: Bind on TCP/IP port - my.ini 中的
basedir和datadir路径必须用正斜杠或双反斜杠:basedir="C:/Program Files/MySQL/MySQL Server 8.0",单反斜杠会被解释为转义符 - SELinux 不存在,但 Windows Defender 或第三方杀软可能拦截 mysqld.exe 初始化,临时禁用测试
最易被忽略的是:Windows 下升级后首次启动会自动执行数据字典升级,这个过程不写 slow log,也不输出进度,卡住时只会不断往 error log 写 Starting MySQL —— 实际可能是磁盘空间不足(需要 2 倍 datadir 空间)或某张表触发了隐藏的保留字冲突(比如叫 rank 或 json 的表),必须盯紧 error log 最后 200 行。


















