使用--no-create-info可跳过建表语句仅导出INSERT,但默认仍含USE和SET语句;需搭配--skip-comments等参数并确保目标表已存在,否则报错1146。

用 --no-create-info 备份数据但跳过建表语句
直接加 --no-create-info 就行,它会让 mysqldump 不输出 CREATE TABLE 和 DROP TABLE 这类 DDL 语句,只保留 INSERT 数据行。
常见错误是以为加了这个参数就自动“只导数据”,其实它默认仍会导出 USE database 和 SET 语句——这些不算表结构,但可能在目标库不存在时导致报错。
- 必须搭配
-t(即--no-create-info的简写)或显式写全--no-create-info - 如果不想带
USE `db_name`,得额外加--skip-comments --skip-triggers --skip-routines,并手动去掉开头的USE行 - 注意:视图、存储过程、触发器默认不导出,除非显式加
--routines或--triggers
mysqldump 导出纯 INSERT 语句的最小安全组合
只想要干净的 INSERT,不带任何结构、注释、上下文,推荐这个组合:
mysqldump -u root -p --no-create-info --skip-extended-insert --compact db_name table_name
--skip-extended-insert 把多值插入拆成单条 INSERT,方便排查和部分导入;--compact 去掉默认的注释和空行。但要注意:--compact 也会隐藏警告,调试时可临时去掉。
-
--skip-extended-insert会让文件变大、导入变慢,大数据量慎用 - 如果表有自增主键,且想保留原 ID,确保没加
--insert-ignore或--replace,否则可能冲突或覆盖 - 字符集问题常被忽略:加上
--default-character-set=utf8mb4,避免乱码或截断
导入时提示 ERROR 1146 (42S02): Table 'xxx' doesn't exist
这是最典型的“只导数据没导结构”引发的报错。不是命令错了,而是你试图把纯 INSERT 导入一个空库或没有对应表的库。
- 确认目标库中表已存在,且字段名、类型、顺序与源表一致(尤其注意
TIMESTAMP默认值、生成列等隐式差异) - 如果只是补数据,别用
mysql -u user -p db_name 直接执行,先检查 <code>dump.sql开头有没有USE;有就删掉,或者改成mysql -u user -p target_db - 若目标表已有数据,又想避免主键冲突,加
--insert-ignore或--replace到导出命令里(但它们会改变语义,不是“纯备份”)
替代方案:用 SELECT ... INTO OUTFILE 导纯数据
如果连 INSERT 都不想要,只要原始值(比如给其他系统做 ETL),SELECT ... INTO OUTFILE 更轻量,也天然不含结构。
SELECT * FROM table_name INTO OUTFILE '/tmp/table_data.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
但注意:INTO OUTFILE 路径是 MySQL 服务端本地路径,不是客户端;且需要 FILE 权限;导出的是文本,不带字段名,NULL 显示为 \N,时间戳按服务器时区格式化。
- 无法跨库导出,也不能指定编码,需靠
SET NAMES控制连接层字符集 - 导出大表时容易锁表或超时,建议加
LIMIT分批,或用pt-archiver类工具 - 这个方式完全绕过
mysqldump,所以不涉及--no-create-info是否生效的问题
导出纯数据看着简单,真正卡住人的往往是目标环境缺失表、字符集错位、或是误把 INSERT 当成“可直接重放”的操作——其实它依赖上下文完整性。










