首页/数据/备份与容灾速查/MySQL 时间点恢复 PITR
数据库与云备份56 条

MySQL 时间点恢复 PITR

把数据恢复到故障或误操作前的某一时刻:先还原全量备份(含位点记录),再从该位点回放归档 binlog,停止点选择决定丢失窗口。

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

MySQL PITR 是什么

时间点恢复(Point-in-Time Recovery)把实例还原到过去的某一时刻:先恢复一份全量逻辑备份,再从该备份记录的 binlog 位点开始顺序回放日志,停在误操作发生之前的瞬间。停止点选在哪里,直接决定丢失窗口有多大,因此恢复前的信息收集比恢复动作本身更关键。

基本信息

前提全量备份含位点记录,且备份之后的 binlog 完整归档
关键参数mysqlbinlog 的 --start-position、--stop-datetime、--stop-position
停止点选择误操作发生前的时刻或位点,宁早勿晚
推荐做法恢复到新实例验证无误后再切换

PITR 流程

PITR 流程
# 1) 还原全量备份
mysql -u root -p < /backup/full-2026-10-11.sql
# 2) 从备份位点开始回放,到误操作前一秒停止
mysqlbinlog --start-position=<备份位点> \
  --stop-datetime='2026-10-12 10:29:59' \
  /backup/binlog/binlog.000123 /backup/binlog/binlog.000124 | mysql -u root -p
# 3) 核对关键表行数并做业务抽检

停止点选择对照

停止方式适用情形风险
--stop-datetime知道误操作发生的大致时刻时区不一致会恢复错时间
--stop-position已从日志中定位到具体事务坐标坐标算错会连带重放误操作
--stop-never边追日志边供只读查询属于持续同步,不是恢复

恢复前的准备动作

  • 确认误操作类型与时间:DROP、DELETE、UPDATE 对应的停止点不同,需要先查清再由业务方确认
  • 核对日志连续性:确认备份位点到目标时刻之间的 binlog 文件一个不少
  • 确认日志格式:ROW 格式下 DML 记录为行事件,回放结果与 STATEMENT 格式不同
  • 准备独立环境:恢复到新实例比对,避免在故障库上反复试验造成二次损失
  • 演练脚本化:把回放命令写成可重复执行的脚本,减少现场手写出错
停止点取在误操作之后会把错误一并重放;恢复完成后立刻核对关键表行数与业务抽检,确认无误再对外提供服务。
日志过期时间要长于备份周期:若 binlog 在下次备份之前就被清理,恢复链会在中途断档,时间点恢复能力随之失效。

易错点

  • 备份位点记录缺失时只能恢复到备份完成时刻,精细恢复能力大打折扣
  • 归档 binlog 被日志清理策略覆盖时,恢复链中途断档
  • 目标时间未标注时区,实例时区与操作时区不一致会恢复到错误时间点
  • 直接在原库上反复试验,一旦回放过头会连当前数据一并破坏

数据来源与参考

  • MySQL 8.0 Reference Manual(Point-in-Time Recovery)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌