You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.7下mysqldump输出遗漏表排序规则,如何让所有表包含排序规则?

解决mysqldump导出不包含表排序规则的问题

原因分析

MySQL 5.7版本的mysqldump默认行为是:当表的排序规则(COLLATE)与所属数据库的默认排序规则一致时,导出的CREATE TABLE语句会省略COLLATE子句。恢复时,表会继承目标数据库的默认排序规则,导致与源库不一致。

解决方案

方法1:修改导出命令,强制输出所有表的排序规则

使用--skip-opt关闭默认的优化集合,再手动开启必要的导出选项,同时保留--create-options以强制输出完整的表创建参数(包括COLLATE):

mysqldump --defaults-file=.fmd-acdb-dev.cnf my-db-name --set-gtid-purged=OFF --skip-opt --create-options --add-drop-table --add-locks --lock-tables --disable-keys --extended-insert --single-transaction

说明:--skip-opt会关闭mysqldump默认的一系列优化选项,因此需要手动开启你需要的功能(如--add-drop-table用于导出前删除表、--single-transaction用于InnoDB的一致性导出等)。

方法2:导出后用sed补全排序规则

如果不想修改导出命令的核心参数,可以先正常导出,再用sed命令为缺少COLLATE的表创建语句添加指定排序规则:

  1. 正常导出数据库:
mysqldump --defaults-file=.fmd-acdb-dev.cnf my-db-name --set-gtid-purged=OFF > dump.sql
  1. 使用sed补全排序规则(以utf8mb4_general_ci为例):
sed -i '' '/CHARSET=utf8mb4/ { /COLLATE/! s/$/ COLLATE=utf8mb4_general_ci/ }' dump.sql

说明:该命令会匹配所有包含CHARSET=utf8mb4但未指定COLLATE的行,在末尾追加排序规则。如果你的表使用其他字符集,只需修改对应的字符集和排序规则即可。

方法3:先创建匹配源库排序规则的目标数据库

如果允许先创建目标数据库,可以在恢复前先创建与源库排序规则一致的数据库,再导入表:

  1. 导出时包含数据库创建语句(添加--databases参数):
mysqldump --defaults-file=.fmd-acdb-dev.cnf --databases my-db-name --set-gtid-purged=OFF > dump.sql
  1. 恢复前,确保目标库的CREATE DATABASE语句包含正确的排序规则(如果导出的语句中没有,手动修改):
CREATE DATABASE `my-db-name` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  1. 执行导入操作:
mysql --defaults-file=.fmd-acdb-dev-target.cnf < dump.sql

内容的提问来源于stack exchange,提问作者Marlin Pierce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:43:13