首页/数据/备份与容灾速查/MySQL 单表恢复实战

MySQL 单表恢复实战

生产库误删单表时:把备份恢复到临时实例,取出目标表数据再导回生产,用最小影响面完成恢复。

备份与容灾速查数据更新于 2026-10-13

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 传输表空间单表级且速度快步骤复杂,需版本与页格式匹配
导回生产库会覆盖该表的现有数据:务必先停写或安排维护窗口,并确认备份时间点是否符合预期,否则可能用更旧的数据覆盖了正确数据。

易错点

  • 忘记用 binlog 补齐:恢复完成却少了备份之后产生的交易记录
  • 直接在生产库做部分恢复:覆盖与锁表风险叠加,业务影响扩大
  • 不核对表结构与字符集:导回后出现乱码或约束冲突
  • 拿错备份文件:恢复到上一周期的时间点,数据倒退一期且难以察觉

数据来源与参考

  • MySQL 8.0 Reference Manual(mysqldump 单表导出)
  • 数据库恢复实践(单表恢复流程)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌