首页/数据/数据库速查/mysqldump 重建表保护(--add-drop-table)
备份与恢复56 条

mysqldump 重建表保护(--add-drop-table)

默认每个表前带 DROP TABLE IF EXISTS,保证恢复时结构干净重建;--skip-add-drop-table 用于把数据追加进已有表或合并多份备份。

数据库速查数据更新于 2026-10-13

重建表保护选项是什么

mysqldump 默认带 --add-drop-table:每个表在 CREATE 之前先写一条 DROP TABLE IF EXISTS,保证恢复到目标库时结构是干净重建的,不会与已有表结构混在一起。当目标是「往已有表里追加数据」或「合并多份备份」时,就要用 --skip-add-drop-table 去掉这条删除语句,否则恢复时旧表会被先删掉,已有数据全部丢失。

基本信息

默认行为--add-drop-table 开启,恢复时先删同名表
关闭方式--skip-add-drop-table
常配套参数--no-create-info(只导数据)、--insert-ignore(忽略主键冲突)
适用场景追加合并、多分片汇总、向已有库补数据
风险等级带 DROP 的备份在生产库执行属于重大操作

典型使用场景

  • 空库恢复:默认选项最合适,结构干净重建
  • 数据追加:把某天的增量数据追加到已有表,需要关闭 DROP 并只导数据
  • 多分片合并:多个分片的数据汇总到同一张表,必须关闭 DROP
  • 环境对照:把生产表结构导出后与测试环境比对差异
  • 备份预检:导出后先看文件里有没有 DROP 语句,判断这次恢复是否安全

追加合并场景

追加合并场景
# 只导数据并关闭 DROP,避免恢复时清掉线上表
mysqldump -uroot -p --skip-add-drop-table --skip-add-locks \
  --no-create-info appdb orders > orders_append.sql
# 导出后先确认文件里没有 DROP TABLE
head -30 orders_append.sql | grep -i 'drop table' || echo 'no drop statement'
# 恢复时若担心主键冲突,可配合忽略重复(按需使用)
mysql -uroot -p appdb < orders_append.sql
# 恢复后核对行数是否按预期增长
mysql -uroot -p -e 'SELECT COUNT(*) FROM appdb.orders;'

参数组合对照

场景推荐参数原因
空库恢复默认结构干净重建
追加数据到已有表--skip-add-drop-table --no-create-info不删表、不建表,只插数据
合并多份备份关闭 DROP 并分别导入避免互相清空
仅导结构--no-data用于比对 DDL
在生产库执行带 DROP TABLE 的备份文件,等于先删表再重建:执行前必须核对连接实例与库名,并确认这句 DROP 的存在是否符合本次操作预期。
关闭 DROP 后往已有表追加数据,主键或唯一键冲突会直接报错。按业务需要可配合 --insert-ignore,但要清楚这意味着冲突行被静默跳过。

易错点

  • 带 DROP 的备份在错误实例上恢复:直接清掉线上表,属于最典型的灾备事故,执行前必须双重核对连接参数
  • 追加数据时忘记关闭 DROP:旧数据被删除后只剩本次备份的内容,恢复成本极高
  • 关闭 DROP 后叠加已有数据不处理主键冲突:导入中途报错中断,需要先明确冲突处理策略
  • 忽略锁语句相关参数:--add-locks 会加写锁,恢复到在线实例时可能阻塞业务写入
  • 恢复脚本忽略错误输出:批量导入中途失败但脚本继续执行,事后看到的表状态与预期不符

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump --add-drop-table

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌