用 SHOW CREATE TABLE 生成 DDL 最稳,因其输出服务端实际执行语句,避免 GUI 工具漏导 ENGINE、CHARSET、外键等元信息;需校验存储引擎、字符集、排序规则三要素,并在生产库建临时表 DESCRIBE 对比验证。
用 SHOW CREATE TABLE 生成 DDL 最稳,别信图形化工具自动导出的“完整脚本”
很多同学直接在 navicat / dbeaver 里右键“导出表结构”,结果上线报错:缺 engine、没 charset、外键约束被截断。原因是 gui 工具默认关掉部分元信息,或对分区表、虚拟列、注释处理不全。show create table 是 mysql 原生命令,输出的就是服务端实际执行的建表语句,兼容性最高。
实操建议:
- 连上目标库(开发/测试环境),运行
SHOW CREATE TABLE `user_profile`;,复制整段输出 - 注意检查末尾是否有分号 —— MySQL 客户端要求必须有,否则
source执行会卡住 - 如果表名含特殊字符(如横线、中文),确保被反引号
`包裹,比如`order_log_2024` - 若涉及
JSON字段或GENERATED COLUMN,MySQL 5.7+ 才支持,低版本需手动降级写法
同步前必须手工校验 CREATE TABLE 里的三个关键字段
DDL 脚本看着一样,但生产环境一跑就崩,大概率栽在这三处:存储引擎、字符集、排序规则。它们不显眼,却决定数据能否写入、中文是否乱码、索引是否生效。
实操建议:
- 比对
ENGINE=InnoDB—— 生产库禁用MyISAM,否则无法支持事务和行锁 - 确认
DEFAULT CHARSET=utf8mb4——utf8是 MySQL 的假 utf8,存 emoji 或四字节生僻字必丢数据 - 检查
COLLATE=utf8mb4_0900_ai_ci(MySQL 8.0)或utf8mb4_unicode_ci(5.7)—— 不匹配会导致ORDER BY或GROUP BY结果异常 - 如果生产库是只读实例或主从架构,还需确认
sql_mode是否一致,否则STRICT_TRANS_TABLES缺失会让默认值插入失败
mysqldump --no-data 适合批量导出,但默认不带 IF NOT EXISTS
一次性同步几十张表时,手敲 SHOW CREATE TABLE 太慢。mysqldump 是更高效的方案,但它默认生成的是“强行覆盖”语句,线上误执行会直接删表重来。
实操建议:
- 加参数
--no-data --skip-triggers --skip-routines --compact,避免混入触发器和存储过程 - 务必补上
--add-drop-table并手动替换为CREATE TABLE IF NOT EXISTS—— 直接删表风险太高,宁可建表失败也不动存量数据 - 若表依赖外键,
mysqldump默认按字母序输出,可能违反依赖顺序;建议先用SELECT table_name FROM information_schema.KEY_COLUMN_USAGE WHERE referenced_table_name IS NOT NULL拿出依赖链再排序 - 导出后用
grep -E "CREATE TABLE|ENGINE="快速扫一遍,确认没有漏掉的COMMENT或ROW_FORMAT=COMPRESSED等定制配置
执行 DDL 前,在生产库做最小化验证:建临时表 + DESCRIBE 对比
哪怕脚本校验过了,也别跳过最后一步验证。生产库的 MySQL 版本、插件、配置可能和开发库不同,导致某些语法被静默降级或拒绝。
实操建议:
- 在生产库建一张临时表:
CREATE TABLE _tmp_test LIKE user_profile;(前提是原表存在),然后DESCRIBE _tmp_test;和你的 DDL 逐字段比对 - 重点看
Null列是否一致(NOT NULL被忽略?)、Default值是否被转成字符串、Extra里有没有意外多出auto_increment - 如果原表不存在,用
CREATE TABLE _tmp_test (id BIGINT PRIMARY KEY) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;测试基础语法是否通过 - 别在高峰期执行,
ALTER TABLE类操作虽没动,但CREATE TABLE仍会锁表元数据(MDL),阻塞后续查询
最常被忽略的是字符集继承逻辑:即使你在 DDL 里写了 DEFAULT CHARSET=utf8mb4,如果数据库级别 CREATE DATABASE 时没指定,MySQL 会 fallback 到编译时默认值,而这个值在不同安装包里可能不同。

















