不能。mysqlcheck 仅检查表结构完整性与执行维护操作,不分析 SQL 语法或语义兼容性;真正检查 5.7→8.0 兼容性应使用 mysqlsh 的 util.checkForServerUpgrade()。

mysqlcheck 能否直接检查 MySQL 5.7 → 8.0 的兼容性?
不能。mysqlcheck 本身不分析 SQL 语法或语义兼容性,它只检查表结构完整性(如索引损坏、页校验失败)和执行 ANALYZE/OPTIMIZE 等维护操作。但它是升级前必做的一步——确保你不是在损坏的表上升级,否则 8.0 启动可能直接失败。
执行前确认:mysqld 正在运行,且你有 PROCESS 和 SELECT 权限:
mysqlcheck -u root -p --all-databases --check --extended
-
--check是默认行为,显式写出更清晰;--extended触发深度扫描(对大表耗时,但必要) - 若输出含
error或warning行(例如MyTable is marked as crashed),必须先修复:mysqlcheck -u root -p MyDB MyTable --repair - 跳过系统库可加
--ignore-database=mysql --ignore-database=information_schema,但sys库建议保留(它在 8.0 中是视图集合,结构变化大)
真正该用什么工具查 5.7→8.0 兼容性?
用官方 mysql_upgrade 的前置检查模式,或更推荐的 mysqlsh 的 util.checkForServerUpgrade() ——它才是专为跨大版本设计的兼容性扫描器。
以 mysqlsh 为例(需安装 MySQL Shell 8.0+):
mysqlsh --uri root@localhost:3306 --sql -e "util.checkForServerUpgrade({targetVersion: '8.0.33', outputFormat: 'JSON'})"- 它会报告具体问题:如使用了 8.0 废弃的
NO_AUTO_CREATE_USERsql_mode、utf8字符集(非utf8mb4)、CREATE TABLE ... TYPE=MyISAM语法等 - 关键项
isInnoDBCluster若为true,说明实例属于 InnoDB Cluster,升级需额外停集群、逐节点操作 - 输出中
summary段落末尾的overallStatus必须是OK才能继续;若为WARNING或ERROR,得按description逐条处理
备份必须包含哪些内容才够“平滑”?
只导出 SQL 不足以支撑回滚。MySQL 8.0 数据字典已改为事务型字典表(存于 mysql.ibd),且 redo log、undo tablespace 格式变更。因此备份必须分层:
-
逻辑备份:用
mysqldump(5.7 版本)导出,加参数--set-gtid-purged=OFF --skip-triggers --routines(触发器和存储过程需人工验证 8.0 兼容性) -
物理备份:停机后完整拷贝
datadir(含ibdata1,ib_logfile*,mysql/子目录),这是唯一能 100% 回滚到 5.7 原始状态的方式 -
配置备份:保存
my.cnf及所有include的配置文件,特别注意sql_mode、default_authentication_plugin(8.0 默认为caching_sha2_password,旧客户端可能连不上)
升级后第一个必须跑的命令是什么?
不是 mysql_upgrade ——在 MySQL 8.0.16+ 中,它已被弃用。启动 8.0 实例后,首次连接会自动触发数据字典升级,但你必须手动运行:
mysql -u root -p -e "SELECT * FROM performance_schema.table_statistics LIMIT 1;"
如果报错 Table 'performance_schema.table_statistics' doesn't exist,说明字典未完成迁移。此时应:
- 确认错误日志里有没有
Running in upgrade mode提示 - 检查
mysql.error_log中是否卡在Populating the INFORMATION_SCHEMA - 若卡住,杀掉 mysqld,删掉
mysql_upgrade_info文件(位于 datadir 下),再重启 —— 它会重试初始化
真正的风险点不在工具链,而在于应用层:8.0 默认开启 only_full_group_by,且 JSON 函数返回类型更严格,很多老业务查询会直接报错,这必须在升级前用慢日志 + explain 分析覆盖。


















