mysqldump备份单表或多表时必须省略--databases,直接写“数据库名 表名1 表名2”,否则报错;含特殊字符的表名需用反引号包裹;默认导出结构+数据,加--no-data仅导结构,加--quick和--skip-extended-insert可提升大表稳定性。

mysqldump 备份单个或多个表时,不加 --databases 是关键
直接在 mysqldump 命令末尾跟上表名,而不是用 --databases,否则会把整个库当做一个“数据库名”处理,导致语法错误或备份内容异常。正确写法是:mysqldump -u root -p database_name table1 table2 > backup.sql。
常见错误现象:执行 mysqldump -u root -p --databases mydb users 后报错 mysqldump: Couldn't find table: 'users' —— 因为 --databases 后面只认库名,表名会被忽略或误解析。
- 必须指定数据库名(
database_name),不能省略 - 多个表名之间用空格分隔,不能用逗号或引号包裹
- 若表名含特殊字符(如短横线、中文),需用反引号包裹:
`my-table` - 该方式默认导出表结构 + 全量数据,不带索引/触发器等元数据的额外选项(如
--routines)对单表无效
只导出表结构(不含数据),用 --no-data
调试建表语句、比对 schema 差异、生成初始化脚本时常用。它和 --databases 无关,可安全用于单表场景。
示例命令:mysqldump -u root -p --no-data mydb users > users_schema.sql。生成的 SQL 文件里只有 CREATE TABLE,没有 INSERT。
-
--no-data和--no-create-info不同:后者会跳过建表语句,只剩数据,不适合“仅结构”需求 - 如果目标是空表但保留主键、自增、注释等完整定义,这个参数足够;但不会复制外键约束(除非原表用
FOREIGN_KEY_CHECKS=0导出) - 注意权限:用户需有对目标表的
SELECT权限(即使不导数据,mysqldump仍会尝试访问表元信息)
大表备份卡住或内存溢出,加 --quick 和 --skip-extended-insert
默认情况下,mysqldump 会把整张表查出来缓存在内存里再拼成 INSERT,百万级以上行数容易 OOM 或超时。加上这两个参数能显著改善稳定性。
示例:mysqldump -u root -p --quick --skip-extended-insert mydb large_log_table > log_backup.sql。
-
--quick强制逐行读取,避免客户端内存堆积 -
--skip-extended-insert让每行数据生成独立INSERT,便于编辑、恢复部分数据,也降低导入时单语句失败影响范围 - 二者不冲突,可同时使用;但会略微增大输出文件体积(因多了重复的
INSERT INTO ...前缀) - 如果后续要压缩传输,建议先加
| gzip,再加这两个参数,顺序不影响
备份时过滤特定数据,靠 --where 而不是应用层 WHERE
想只备份近 7 天日志、某个状态的订单,不用先 SELECT 导出再手动建表——mysqldump 原生支持条件导出。
示例:mysqldump -u root -p mydb orders --where="status='paid' AND created_at >= '2026-08-06'" > paid_orders.sql。
-
--where的值必须是合法 SQL 表达式,字符串要用单引号,且整体用双引号包裹(Shell 下防空格截断) - 不支持子查询、JOIN、函数调用(如
NOW()),时间建议用字面量 - 该参数仅作用于数据行,表结构仍完整导出;若只想导某几列,
mysqldump不支持,得换SELECT ... INTO OUTFILE或应用层处理 - 注意字符集:如果表用
utf8mb4,确保终端环境LANG设置正确,否则中文条件可能失效
SELECT 权限,且不能在事务中执行(mysqldump 自身会开新连接);另外,--where 过滤和 --quick 组合时,MySQL 服务端的 sort_buffer_size 和 read_buffer_size 若太小,仍可能触发磁盘临时表,拖慢速度。


















