重建表保护选项是什么
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,但要清楚这意味着冲突行被静默跳过。