Skip to content

PostgreSQL 时间点恢复

时间点恢复(Point-In-Time Recovery,PITR)是PostgreSQL的重要恢复功能,通过结合基础备份和WAL归档,可以将数据库恢复到任意时间点的状态。PITR适用于需要恢复到特定时间点而非完整备份时刻的场景,如误删除数据恢复、修复逻辑错误等。

PITR的工作原理是:首先恢复到基础备份的时刻,然后重放WAL归档中的事务日志,直到达到指定的恢复目标。恢复目标可以是时间点、事务ID或命名还原点。PITR支持恢复到任意状态,但不能恢复到比基础备份更早的时间点。

配置WAL归档

ini
# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'cp %p /mnt/wal_archive/%f'

恢复操作

bash
# 1. 停止PostgreSQL服务
systemctl stop postgresql

# 2. 备份当前数据目录
cp -r /var/lib/postgresql/14/main /var/lib/postgresql/14/main.backup

# 3. 清空数据目录
rm -rf /var/lib/postgresql/14/main/*

# 4. 恢复基础备份
cd /var/lib/postgresql/14/main
tar -xzf /path/to/base/backup.tar.gz

# 5. 创建恢复配置文件
cat > /var/lib/postgresql/14/main/postgresql.auto.conf << EOF
restore_command = 'cp /mnt/wal_archive/%f %p'
recovery_target_time = '2024-01-15 10:30:00'
recovery_target_action = 'promote'
EOF

# 6. 创建恢复信号文件
touch /var/lib/postgresql/14/main/recovery.signal

# 7. 启动PostgreSQL
systemctl start postgresql

恢复目标设置

sql
-- 设置恢复时间点
ALTER SYSTEM SET recovery_target_time = '2024-01-15 10:30:00';

-- 设置恢复事务ID
ALTER SYSTEM SET recovery_target_xid = 12345;

-- 设置恢复名称
ALTER SYSTEM SET recovery_target_name = 'before_update';

-- 设置恢复后执行操作
ALTER SYSTEM SET recovery_target_action = 'promote';

恢复验证

sql
-- 检查恢复是否完成
SELECT pg_wal_replay_resume();

-- 验证恢复的数据
SELECT COUNT(*) FROM your_table;
SELECT MAX(id) FROM your_table;

-- 查看恢复时间点
SELECT pg_last_xact_replay_timestamp();

常见问题(FAQ)

Q1: 如何找到正确的恢复时间?

A1: 查看WAL归档目录,使用pg_waldump查看WAL文件内容,根据业务日志确定恢复时间点。

Q2: 恢复后如何验证数据?

A2: 检查关键业务数据,验证数据完整性,与备份时刻的状态对比。

Q3: 可以恢复到多个时间点吗?

A3: 每次恢复都需要从基础备份重新开始,不支持在同一次恢复中多次更改恢复目标。

Q4: 恢复目标如何选择?

A4: 可以选择时间点(recovery_target_time)、事务ID(recovery_target_xid)或命名还原点(recovery_target_name)。

Q5: 恢复过程中可以取消吗?

A5: 可以取消恢复操作,但数据目录可能处于不一致状态,需要重新开始恢复过程。

Q6: 如何处理恢复后的残留WAL?

A6: 恢复完成后,PostgreSQL会自动处理剩余的WAL文件,不需要手动清理。