不能。mysql workbench 导入导出向导仅适用于结构简单、数据量小的场景,缺乏事务一致性保障、并发控制和错误恢复机制,无法满足生产库迁移的高可靠性与完整性要求。

MySQL Workbench 导入导出向导能直接迁移生产库吗?
不能。它只适合结构简单、数据量小(mysqldump + mysql 命令,不处理锁表、主从同步中断、字符集隐式转换、自增 ID 冲突等真实迁移风险。
常见错误现象:ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'(自增冲突)、ERROR 1215 (HY000): Cannot add foreign key constraint(外键顺序错乱)、中文变问号(character_set_client 和表定义不一致)。
- 使用场景:本地开发库同步、测试环境快速克隆、单表少量数据抽样导出
- 参数差异:向导默认勾选
Export to Self-Contained File→ 生成含CREATE DATABASE和SET FOREIGN_KEY_CHECKS=0的 SQL;若取消,则只导表结构+数据,不建库也不关外键检查 - 性能影响:导出时全表 SELECT 锁读,大表会阻塞业务写入;导入时默认逐条 INSERT,10 万行以上明显慢于
LOAD DATA INFILE
导出 SQL 文件后,用命令行导入为什么报错 “Unknown collation: 'utf8mb4_0900_ai_ci'”?
这是 MySQL 8.0 默认排序规则,但目标库是 5.7 或更早版本,不识别该 collation。向导导出时未降级兼容,直接照搬源库定义。
解决办法不是改目标库版本,而是导出时干预 collation 声明:
- 在 Workbench 向导“Advanced Options”里,勾选
Use compatible option for older MySQL servers(自动替换为utf8mb4_general_ci) - 或导出后手动替换:用文本编辑器批量把
COLLATE utf8mb4_0900_ai_ci替成COLLATE utf8mb4_unicode_ci(5.7 支持) - 更稳妥的做法:导出时不带
CREATE TABLE,只导数据(勾选Export table data only),再用SHOW CREATE TABLE在目标库重建表
怎么让 Workbench 向导跳过视图、存储过程、事件这些对象?
向导默认全量导出数据库对象,但视图依赖底层表权限,存储过程可能含硬编码 IP 或数据库名,直接导入常失败。
必须手动过滤:
- 在“Select Objects to Export” 页面,左侧树形列表展开后,**逐个取消勾选**
Views、Stored Procedures、Functions、Events节点(别信“Deselect All”按钮,它有时失效) - 如果已导出含视图的 SQL,导入前删掉所有
CREATE VIEW及其ALTER ALGORITHM行——否则可能因 DEFINER 用户不存在而卡住 - 注意触发器(Triggers):它和表绑定,若勾选了表又没关触发器导出,会连带导出;需在表节点右侧的齿轮图标里关闭
Export Triggers
导出的 SQL 文件里有 SET SQL_LOG_BIN=0,导入时要不要保留?
要看目标库是否在主从架构中。这个语句关闭二进制日志,意味着导入操作不会同步到从库——对主库执行时,从库数据立刻不一致。
绝大多数情况下应该删掉这一行:
- 本地开发/测试迁移:删掉无影响
- 生产主库迁移:必须删,否则从库丢失这批数据,后续主从延迟或复制中断
- 只有在“临时修复从库缺失数据”且明确知道后果时,才保留并配合
STOP SLAVE使用 - Workbench 向导默认不加这句,但如果你手动生成 dump 用了
--set-gtid-purged=OFF或其他高级参数,就可能混入——导入前用grep -n "SQL_LOG_BIN" file.sql检查
真正容易被忽略的是时间戳字段行为:向导导出的 TIMESTAMP 列默认带 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,但目标库若禁用 explicit_defaults_for_timestamp,导入会报错。得提前确认两边 SQL mode 是否一致,尤其关注 NO_ZERO_DATE 和 STRICT_TRANS_TABLES。










