mysql在版本迁移过程中使用数据迁移工具

mysqldump在5.7→8.0或8.0→8.4跨大版本迁移中基本可靠,但需加–skip-strict-mode、指定utf8mb4字符集、跳过不兼容对象;mysqlpump支持并行但DEFINER更严格;须处理字符集、权限、语法等兼容性问题。

mysql在版本迁移过程中使用数据迁移工具

MySQL 版本迁移时,mysqldump 是否可靠

对于 5.7 → 8.0 或 8.0 → 8.4 这类跨大版本迁移,mysqldump 在多数场景下仍可用,但必须配合显式参数规避默认行为变更。MySQL 8.0+ 默认启用 sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,而 5.7 的 dump 可能含隐式类型转换或无默认值的 NOT NULL 字段,直接导入会报错 ERROR 1364 (HY000): Field doesn't have a default value

实操建议:

  • 导出时加 --skip-strict-mode(仅限 mysqldump 8.0.28+)或手动在目标库临时设 SET sql_mode=''; 再导入
  • 强制指定字符集:mysqldump --default-character-set=utf8mb4 -h old_host ...,避免 utf8(即 utf8mb3)被 8.0 拒绝
  • 跳过不兼容对象:用 --ignore-table=db.old_view 屏蔽视图、存储过程等,后续单独处理

mysqlpump 与 mysqldump 的关键差异点

mysqlpump 是 MySQL 5.7 引入的并行替代工具,但默认行为更“严格”——它会尝试导出 DEFINER 子句,若源库用户不存在于目标库,导入时直接失败 ERROR 1449 (HY000): The user specified as a definer ('u'@'%') does not exist;而 mysqldump 默认不带 DEFINER(除非加 --dump-definer)。

使用场景判断:

  • 需要并行导出(尤其大库):用 mysqlpump --default-parallelism=4,但务必加 --skip-definer
  • 含大量视图/函数:mysqlpumpALGORITHM=TEMPTABLE 视图支持更好,mysqldump 可能导出为空
  • 目标库权限受限:mysqldump --no-create-info + --no-data 分离结构与数据,比 mysqlpump 的粒度更可控

MySQL 8.0+ 中不可忽略的兼容性陷阱

从 5.7 升级到 8.0 后,部分语法和元数据格式已废弃。例如:mysql.user 表结构彻底重构,password 字段改为 authentication_stringGRANT 语句不再隐式创建用户,必须显式 CREATE USER

NopCommerce 基于ASP.NET4.0

NopCommerce 基于ASP.NET4.0

本次版本没有大的新功能,因为我们主要重点放在ASP.NET 4.0迁移,更多的功能维护和修改漏洞,但我们有做出以下修改亮点:移到ASP.NET4.0(需要装VS2010用于源代码编辑)简化数据访问。目前使用ORM(Entity framework 4.0)集成QuickBook性能优化以下方面有提升:USA EPAY(集成)支付模块(感谢Chris Curtis)QuickPay支付方式中添加了退

下载

迁移前必须检查:

  • 执行 SELECT User,Host,plugin FROM mysql.user;,确认所有用户 plugin 是 caching_sha2_password 还是 mysql_native_password,后者需在目标库重置密码:ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';
  • 检查存储过程中的 TYPE=InnoDB(旧写法),8.0 要求改用 ENGINE=InnoDB,否则 mysqldump 导出的建表语句会失效
  • 触发器中引用 OLD/NEW 的字段若为保留字(如 rank),8.0 要求反引号包裹,否则导入报错 ERROR 1064

真正需要工具链协同的环节

纯 SQL 导出导入无法解决字符集升级、权限模型变更、JSON 字段校验增强等底层问题。例如:5.7 的 utf8 列在 8.0 中会被识别为 utf8mb3,而 8.0.28+ 默认禁用该编码,必须提前执行 ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

复杂迁移建议分三步走:

  • 结构迁移:用 mysqldump --no-data --skip-triggers --skip-routines 导出 DDL,人工替换 TYPE=ENGINE=、补全 COLLATE
  • 数据迁移:用 mysqlpump --compress-output=LZ4 加速传输,但导入前先 SET GLOBAL local_infile = ON; 并启动客户端时加 --local-infile
  • 权限同步:用 SELECT CONCAT('CREATE USER ''',User,'''@''',Host,''' IDENTIFIED WITH ',plugin,' AS ''',authentication_string,''';') FROM mysql.user; 生成用户语句,再手工调整

最易被跳过的一步是统计信息重建——迁移后立即执行 ANALYZE TABLE,否则查询计划可能严重劣化,尤其涉及分区表或隐藏主键场景。

https://www.php.cn/faq/1996160.html

发表回复

Your email address will not be published. Required fields are marked *