MySQL 单表恢复
生产库误删或误改一张表时,把最近的全量备份恢复到临时实例,从临时库把目标表导出再导回生产,其余数据不动。相比整库回滚,这种做法把影响面限制在一张表上,停写窗口更短。需要注意的是恢复出来的是备份时点的数据,备份之后的新增与变更必须靠 binlog 补齐。
基本信息
| 适用平台 | MySQL 5.7/8.0、MariaDB(命令基本通用) |
|---|---|
| 权限要求 | 建库导出的账号需有 CREATE/DROP/INSERT 等权限 |
| 前置条件 | 有一份可用的全量备份,并确认备份时间点 |
| 补齐手段 | binlog(ROW 格式更利于按行筛选与重放) |
典型使用场景
- 误删单表或大批行:只恢复目标表,避免整库回滚影响其他业务
- 误改数据:从备份取回历史版本覆盖,或按 binlog 反向回滚
- 表结构调整出错:从备份恢复原表结构再重做变更
- 数据核对:把备份表导入临时库,与生产表逐行比对差异
- 审计取证:确认某个时间点表内的真实数据状态
临时实例恢复单表
临时实例恢复单表
# 1) 把全量备份恢复到临时库(不影响生产)
mysql -u root -p -e "CREATE DATABASE appdb_rescue"
mysql -u root -p appdb_rescue < /backup/appdb-full.sql
# 2) 只导出目标表结构与数据
mysqldump -u root -p --single-transaction appdb_rescue orders > /tmp/orders-rescue.sql
# 3) 确认生产表结构一致后导回(先停写目标表或安排窗口)
mysql -u root -p appdb < /tmp/orders-rescue.sql
# 4) 用 binlog 补齐备份之后的新增与变更
mysqlbinlog --start-datetime='2026-10-12 02:00:00' mysql-bin.000123 | mysql -u root -p appdb方案取舍
| 做法 | 影响面 | 注意点 |
|---|---|---|
| 临时实例 + 单表导出 | 只动目标表,风险可控 | 备份时点之后的数据要单独补齐 |
| 直接在生产库部分恢复 | 覆盖与锁表风险落在生产 | 通常不推荐,除非能安排完整停机窗口 |
| XtraBackup 传输表空间 | 单表级且速度快 | 步骤复杂,需版本与页格式匹配 |
导回生产库会覆盖该表的现有数据:务必先停写或安排维护窗口,并确认备份时间点是否符合预期,否则可能用更旧的数据覆盖了正确数据。