mysqldump --no-data 是导出纯表结构(仅 CREATE TABLE 语句)的标准方法,跳过数据但保留索引、字符集、外键等元数据;--skip-insert 非法,正确短选项为 -d;需注意字符集兼容性、AUTO_INCREMENT 值及分区支持。

用 mysqldump --no-data 导出纯表结构最直接
想只导出 CREATE TABLE 语句、不带任何 INSERT,--no-data 是标准解法。它会让 mysqldump 跳过所有数据行,只保留建表逻辑(含索引、注释、字符集等)。
常见误操作是写成 --nodata(少短横)或 --no-data=false(误以为可关),实际它是个开关型参数,不带值,出现即生效:
mysqldump -u root -p --no-data mydb users > users_schema.sql
- 必须显式指定数据库名和表名(或省略表名导出库中全部表结构)
- 如果目标表用了
ROW_FORMAT=COMPRESSED或KEY_BLOCK_SIZE等引擎特有属性,--no-data仍会保留——它不删元数据,只过滤数据 - 导出结果里不会包含
USE `mydb`或SET NAMES,如需兼容导入,建议加--databases或手动补
--no-data 和 --skip-insert 的区别在哪
--skip-insert 看起来像替代方案,但它不是 mysqldump 的合法参数,运行会报错:Unknown argument: --skip-insert。这是常被搜错的关键词,源于混淆了其他工具(如 pg_dump)的命名习惯。
真正可用的等效选项只有:--no-data、-d(它的短选项),以及组合技 --skip-triggers --skip-routines --skip-events --no-data(当你要彻底剥离所有非结构内容时)。
-
--no-data本身不跳过视图、存储过程,只跳数据;若库中有视图,它们仍会被导出(因视图本质无“数据”) - 如果导出含外键的表,
--no-data仍会输出FOREIGN KEY定义,但不会导出SET FOREIGN_KEY_CHECKS=0—— 这个由--add-locks或--single-transaction控制,和--no-data无关
导出结构时容易漏掉的三个细节
只跑通命令不等于拿到可用结构。这三个点不检查,后续 DDL 执行可能失败:
- 字符集与排序规则:默认导出语句含
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci,但如果目标 MySQL 版本低于 8.0,utf8mb4_0900_ai_ci不存在,需手动替换为utf8mb4_unicode_ci - 自增初始值:
--no-data会保留AUTO_INCREMENT=123,若只想建空表且重置自增,得在导出后删掉这行,或加--skip-auto-increment(MySQL 8.0.29+ 支持) - 分区表:对
PARTITION BY表,--no-data仍导出完整分区定义,但若目标实例禁用分区(have_partitioning=NO),导入会报错,需提前确认
替代方案:用 SHOW CREATE TABLE 手动拼接
当只要一两张表、或需要精细控制输出(比如去掉注释、压缩空行),比 mysqldump 更轻量:
mysql -u root -p -N -s -e "SHOW CREATE TABLE mydb.users\G" | grep -E "^CREATE|^ENGINE="
-N 去除列名,-s 禁用表格格式,\G 换行显示便于读取。但注意:
- 它不导出索引独立语句(
CREATE INDEX),所有索引都揉在CREATE TABLE里 - 不会自动处理反引号转义,如果表名含特殊字符,
SHOW CREATE TABLE输出里的反引号必须保留,否则语法错误 - 无法一次导出多表结构,得写 shell 循环或用
INFORMATION_SCHEMA查表名再遍历
复杂度上来后,还是回到 mysqldump --no-data 更稳——它经过大量生产验证,边界情况覆盖全,手动拼容易漏掉 /*!50100 ... */ 这类条件注释。


















