--no-data是唯一可靠方案,因mysqldump布尔参数仅支持--no-data或--skip-no-data形式,--no-data=false会被忽略而默认导出数据+结构,且必须置于数据库名前、顺序正确、不可缺库名。

--no-data 是唯一可靠、开箱即用的方案。其他写法(如 --no-data=false、--skip-insert)要么被忽略,要么报错,最终仍会导出数据。
为什么必须用 --no-data,不能加 =false
mysqldump 的布尔参数只识别两种形式:--no-data(启用)或 --skip-no-data(禁用),不支持 =true/=false 语法。--no-data=false 会被命令行解析器当作无效参数直接丢弃,等价于没写,结果默认导出结构 + 全量数据。
-
-d是它的合法短选项,效果完全等同--no-data -
--nodata(少横线)、--no_data(下划线)均非法,报错Unknown argument
单表导出时数据库名和表名顺序不能错
mysqldump 要求严格按 数据库名 表名 顺序书写,中间无逗号或分隔符。漏掉数据库名会报错 No database selected;把表名放前面,mysqldump 会误将其当数据库名,导致空输出或权限错误。
- ✅ 正确:
mysqldump -u root -p --no-data mydb users > users.sql - ❌ 错误:
mysqldump -u root -p --no-data users mydb > users.sql(users被当库名) - ❌ 错误:
mysqldump -u root -p --no-data users > users.sql(缺库名) - ⚠️ 特殊字符表名需用反引号:
mysqldump -u root -p --no-data mydb `user-log` > user_log.sql
导出结果里为什么还有 AUTO_INCREMENT=123 和 ENGINE=InnoDB
--no-data 只跳过 INSERT 语句,不修改 CREATE TABLE 本身的定义。所有元数据——包括当前 AUTO_INCREMENT 值、存储引擎、字符集、排序规则、外键约束——都会原样保留。
- 想清空自增值?导出后用
sed -i 's/AUTO_INCREMENT=[0-9]*//g'替换,或导入前执行ALTER TABLE users AUTO_INCREMENT = 1 - 想统一字符集?加
--default-character-set=utf8mb4,但注意它只影响连接层,不一定改写建表语句里的CHARSET - 想去掉
DEFINER避免权限失败?必须显式加--skip-definer
最容易被忽略的是兼容性问题:导出命令跑通 ≠ 导入能成功。目标 MySQL 版本若不支持源库的 SQL 模式(如 STRICT_TRANS_TABLES),或启用了 column_statistics,恢复时大概率报错。建议导出时固定加上 --set-gtid-purged=OFF --column-statistics=0。这些参数不显眼,但一漏就卡在恢复环节。











