mysql 5.5→5.7升级前必须将所有业务myisam表转为innodb,因5.7已完全移除myisam复制兼容性,残留会导致主从中断、mysql_upgrade报错及不可预测崩溃;mysqldump不能跳过转换,因其导出语句仍含engine=myisam,需人工替换并验证清零。

MySQL 5.5 → 5.7 升级前必须转换 MyISAM 表
不能跳过 MyISAM 到 InnoDB 的转换。MySQL 5.6 起默认仅支持 InnoDB 主从同步(GTID 模式强制要求),而 5.7 完全移除了对 MyISAM 表的复制兼容保障;若保留 MyISAM 表,升级后主从复制大概率中断,SHOW SLAVE STATUS 中会持续报 Unknown table engine 'MyISAM' 或 Table definition has changed 类错误。
- 用
SELECT table_schema, table_name, engine FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('mysql', 'information_schema', 'performance_schema');扫描所有业务库中的 MyISAM 表 - 逐表执行
ALTER TABLE tbl_name ENGINE = InnoDB;—— 注意:该操作会锁表,生产环境需在低峰期执行,或使用pt-online-schema-change在线转换 - 转换后检查外键约束是否生效:
SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE table_schema = 'db_name' AND constraint_name != 'PRIMARY';,MyISAM 不支持外键,转完需补建 - 确认
innodb_file_per_table = ON已启用(5.6+ 默认开启),避免所有 InnoDB 表挤进 ibdata1 导致后续无法收缩空间
为什么 mysqldump --all-databases 不能跳过 MyISAM 转换?
逻辑导出看似“绕过引擎问题”,但实际埋雷:mysqldump 默认不带 --compatible=mysql56 或 --skip-create-options,导出的 CREATE TABLE 语句仍含 ENGINE=MyISAM;导入到 5.7 时,若未显式指定 default-storage-engine=InnoDB(5.7 已废弃该参数),MySQL 会按配置 fallback 到 MyISAM,结果仍是 MyISAM 表——只是换了个方式重建而已。
- 导出时务必加
--compatible=mysql56 --default-character-set=utf8mb4,并人工替换 dump 文件中所有ENGINE=MyISAM为ENGINE=InnoDB - 导入前在目标 5.7 实例的
my.cnf中临时添加sql_mode = '',避免因 MyISAM 表缺失某些 5.7 新字段(如page_checksum)导致CREATE TABLE报错 - 导入后立即运行
SELECT COUNT(*) FROM information_schema.tables WHERE engine = 'MyISAM';验证是否清零
升级后 MyISAM 相关功能彻底失效的典型表现
5.7 不再维护 MyISAM 的复制、崩溃恢复和元数据一致性能力,残留 MyISAM 表会导致不可预测行为,不是“还能用”,而是“随时崩”。
-
mysqldump --single-transaction对 MyISAM 表无效,会触发全局读锁,阻塞写入 -
FLUSH TABLES WITH READ LOCK后执行SHOW MASTER STATUS可能返回空,因 MyISAM 表不参与 binlog position 计算 - 使用
mysql_upgrade时若检测到 MyISAM 系统表(如mysql.columns_priv),会直接报错退出,提示Table 'mysql.columns_priv' doesn't exist(实为引擎不识别) - 云数据库厂商(如阿里云 RDS)在 5.6+ 版本中已屏蔽 MyISAM 创建权限,
CREATE TABLE t1 (...) ENGINE=MyISAM会返回ERROR 1286 (42000): Unknown storage engine 'MyISAM'
真正安全的过渡路径只有一条
不要尝试“先升 5.6 再转引擎”,也不要用 INSERT INTO ... SELECT 手动迁移——5.5 的 MyISAM 表可能含损坏索引或页校验异常,直接读取会触发 5.6/5.7 启动时的严格校验失败。唯一可靠路径是:在 5.5 环境中完成全部 MyISAM → InnoDB 转换,并验证 CHECK TABLE 全部通过,再启动 5.6 升级流程。这步省不得,也快不了。











