必须用mysqldump做逻辑备份而非直接拷贝文件,因跨大版本物理文件不兼容;恢复时需禁用外键与唯一性校验;8.0.16前须运行mysql_upgrade,之后自动升级;默认字符集变为utf8mb4、排序规则更严格,需逐库验证。
mysqldump 做逻辑备份,而非直接拷贝文件MySQL 版本跨大版本升级(如 5.7 → 8.0)时,datadir 下的物理文件结构、系统表格式、字符集默认行为都可能不兼容。直接复制 ibdata1 或 .ibd 文件极大概率导致启动失败或数据损坏。必须使用 mysqldump 导出为 SQL 文本——它能自动适配源版本语法,并在恢复时由目标版本的 MySQL Server 解析执行。
实操建议:
--
single-transaction --routines --triggers --events 参数保证一致性与完整性--default-character-set=utf8mb4,避免 5.7 默认 utf8(即 utf8mb3)在 8.0 中被拒绝mysql 系统库:--ignore-table=mysql.user --ignore-table=mysql.db...,升级后应由 mysql_upgrade(8.0.16+ 已移除)或初始化流程重建权限表mysqldump -u root -p --databases db1 db2 > backup.sql
mysql 客户端恢复时要禁用外键检查和唯一性校验导入 dump 文件时,尤其是含大量关联表的场景,直接执行会因外键约束或唯一索引冲突中断。必须在恢复前临时关闭校验,否则常见错误如:ERROR 1215 (HY000): Cannot add foreign key constraint 或 ERROR 1062 (23000): Duplicate entry。
实操建议:
SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; SET AUTOCOMMIT=0;
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT;
mysqldump --skip-extended-insert 来规避问题——它只影响 INSERT 格式,不解决约束冲突source 命令导入,确保客户端连接时已设置 --init-command="SET NAMES utf8mb4",否则中文可能乱码mysql_upgrade(仅限 8.0.16 之前)或检查系统表兼容性MySQL 5.7 升级到 8.0.15 及更早版本时,mysql_upgrade 是强制步骤:它会检查并更新 mysql 系统库中的表结构(如 user 表字段变更)、修复权限视图、刷新帮助表。但自 8.0.16 起该工具已被移除,升级逻辑内建到服务启动流程中。
实操建议:
mysqld → 运行 mysql_upgrade -u root -p
Upgrading system tables. 和 Finished upgrading system tables.
SELECT VERSION();、SELECT COUNT(*) FROM mysql.user;、SHOW GRANTS FOR CURRENT_USER;
caching_sha2_password,老客户端(如 MySQL 5.7 客户端或旧版 JDBC)可能连不上,需在用户创建时显式指定 IDENTIFIED WITH mysql_native_password
MySQL 8.0 将默认字符集从 latin1(5.7)改为 utf8mb4,默认排序规则从 latin1_swedish_ci 改为 utf8mb4_0900_ai_ci。这不是简单配置变更,会影响索引长度、比较行为、JSON 字段解析等。
实操建议:
CREATE TABLE 语句,确认是否显式声明了 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;未声明的会继承库级设置,而库级设置又继承 server 级,容易层层覆盖出错utf8mb4_0900_ai_ci 对大小写不敏感且忽略重音,但比旧排序规则更严格——例如 'a' = 'A' 仍为 true,但某些特殊字符组合的比较结果可能不同,业务有精确匹配逻辑的需回归测试utf8mb4_unicode_ci(如 PHP 的 mb_strtolower() 行为),需在建表或连接时显式指定,不能依赖默认值SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='your_db'; 逐库确认