必须清理MyISAM表,否则升级后大概率启动失败或报“Storage engine 'MyISAM' does not support system tables”错误;MySQL 8.0强制系统库用InnoDB,且内核已放弃优化MyISAM元数据路径,遗留表会导致information_schema查询变慢、高并发下易卡死。

MySQL 5.7 升级 8.0 前必须清理 MyISAM 表
不能跳过这步直接升级,否则大概率启动失败或出现 Storage engine 'MyISAM' does not support system tables 错误。MySQL 8.0 强制系统库(mysql、sys 等)使用 InnoDB,且内核已放弃优化 MyISAM 元数据路径——遗留表越多,information_schema 查询越慢,ANALYZE TABLE 或高并发下极易触发 Waiting for table flush。
- 先用
mysqlcheck -u root -p --all-databases --check-upgrade在 5.7 环境下扫描,这是唯一能提前暴露 MyISAM 表的手段 - 重点关注
TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')的业务库表,系统库表在 5.7 中若仍是 MyISAM,升级前必须手动转 - 别信“8.0 还支持 MyISAM 就能留着”的想法:它只是语法兼容,不是运行友好;尤其混在大量 InnoDB 表中时,文件锁和 OPEN TABLE 开销会指数放大
批量转换 MyISAM 表为 InnoDB 的安全写法
手写 ALTER TABLE ... ENGINE=InnoDB 容易漏、易错、不可复现。必须用脚本生成语句,并注意三处关键约束:
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 执行前确认
innodb_file_per_table=ON(8.0 默认开启,但老配置可能覆盖),否则所有表会挤进ibdata1,后续无法收缩 - 生成语句时排除系统库:
SELECT CONCAT('ALTER TABLE `', table_schema,'`.`', table_name,'` ENGINE=InnoDB;') FROM information_schema.tables WHERE engine ='MyISAM' AND table_schema NOT IN ('mysql','information_schema','performance_schema','sys'); - 转换后立刻验证:
SHOW CREATE TABLE tbl_name必须含ROW_FORMAT=DYNAMIC,否则 utf8mb4 索引可能建失败(尤其含 emoji 或四字节字符的字段)
升级后发现 MyISAM 表加载变慢怎么办
这不是缓存没调好,而是 MySQL 8.0 内核层面不再为 MyISAM 做元数据路径优化。每次查 information_schema 都可能触发隐式 OPEN TABLE,且没有事务保障,高并发下容易卡死。
-
SET SESSION information_schema_stats_expiry = 86400只缓元数据,不改 MyISAM 打开逻辑,属于临时止痛,不能替代转换 - 如果已升级完成才发现有残留,仍要立即执行转换——但需停写或选低峰期,因为
ALTER TABLE会锁表(MyISAM 是表级锁,InnoDB 在 8.0 下默认支持 ALGORITHM=INPLACE,但老版本表结构可能不兼容) - 转换后务必运行
mysql_upgrade --skip-sys-schema,防止因mysql.user等系统表引擎与权限表不一致引发连接认证失败
my.ini 里哪些 MyISAM 相关参数必须删
Windows 下用的是 my.ini,不是 my.cnf。照搬 5.7 配置会导致 8.0 启动直接退出,错误日志只有一行:Unknown variable。
- 必须删除的废弃项:
query_cache_type、expire_logs_days、innodb_file_format、explicit_defaults_for_timestamp -
key_buffer_size可保留(MyISAM 缓冲仍被读取),但若已无 MyISAM 表,建议清零以释放内存 - 禁用
innodb_data_file_path的手动配置——除非你真要管理共享表空间,否则留空即可;误配会导致ibdata1暴涨且无法回收
SHOW CREATE TABLE 输出,结果 utf8mb4 索引建不全,应用一写入就报错。

















