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的表创建语句添加指定排序规则:
- 正常导出数据库:
mysqldump --defaults-file=.fmd-acdb-dev.cnf my-db-name --set-gtid-purged=OFF > dump.sql
- 使用sed补全排序规则(以
utf8mb4_general_ci为例):
sed -i '' '/CHARSET=utf8mb4/ { /COLLATE/! s/$/ COLLATE=utf8mb4_general_ci/ }' dump.sql
说明:该命令会匹配所有包含
CHARSET=utf8mb4但未指定COLLATE的行,在末尾追加排序规则。如果你的表使用其他字符集,只需修改对应的字符集和排序规则即可。
方法3:先创建匹配源库排序规则的目标数据库
如果允许先创建目标数据库,可以在恢复前先创建与源库排序规则一致的数据库,再导入表:
- 导出时包含数据库创建语句(添加
--databases参数):
mysqldump --defaults-file=.fmd-acdb-dev.cnf --databases my-db-name --set-gtid-purged=OFF > dump.sql
- 恢复前,确保目标库的
CREATE DATABASE语句包含正确的排序规则(如果导出的语句中没有,手动修改):
CREATE DATABASE `my-db-name` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- 执行导入操作:
mysql --defaults-file=.fmd-acdb-dev-target.cnf < dump.sql
内容的提问来源于stack exchange,提问作者Marlin Pierce
相关产品推荐
相关产品推荐

