前置知识: MySQL

基于时间点恢复

1 minAdvanced2026/6/14

MySQL基于时间点恢复PITR:全量恢复+binlog重放、时间点定位与误操作恢复

1. PITR 概述

基于时间点恢复(Point-In-Time Recovery,PITR)将数据库恢复到任意时间点,通过全量备份 + binlog 重放实现。

2. 恢复流程

1. 恢复全量备份
2. 找到误操作的时间点
3. 重放 binlog 到误操作之前
4. 跳过误操作
5. 继续重放后续 binlog

3. 操作步骤

3.1 恢复全量备份

# 停止 MySQL
systemctl stop mysql

# 恢复全量备份
xtrabackup --copy-back --target-dir=/backup/full
chown -R mysql:mysql /var/lib/mysql

# 启动 MySQL
systemctl start mysql

3.2 定位误操作时间

# 查看 binlog 事件
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000123 | grep -A5 "DROP TABLE"

# 查看事件时间
mysqlbinlog --start-datetime="2026-06-14 10:00:00" \
            --stop-datetime="2026-06-14 12:00:00" \
            mysql-bin.000123 | head -100

3.3 重放 binlog

# 重放到误操作之前
mysqlbinlog --start-datetime="2026-06-14 10:00:00" \
            --stop-datetime="2026-06-14 10:59:59" \
            mysql-bin.000123 | mysql -u root -p

# 跳过误操作,继续重放
mysqlbinlog --start-datetime="2026-06-14 11:01:00" \
            mysql-bin.000123 | mysql -u root -p

4. 按位置恢复

# 查看事件位置
mysqlbinlog mysql-bin.000123 | grep -n "DROP TABLE"

# 按位置恢复
mysqlbinlog --start-position=154 --stop-position=1024 \
            mysql-bin.000123 | mysql -u root -p

# 跳过误操作后继续
mysqlbinlog --start-position=2048 \
            mysql-bin.000123 | mysql -u root -p

5. 最佳实践

-- 1. 定期全量备份
-- 2. 确保 binlog 开启且完整
-- 3. sync_binlog = 1 确保不丢失 binlog
-- 4. 保留足够长时间的 binlog
-- 5. 测试恢复流程