模拟场景
场景:每天凌晨02:00,开始做全备(PBK),到了第二天,如果有人14:00分将数据做了误删,希望将数据恢复到14:00分误删之前的状态?
1、恢复全备数据,使用PBK的全备数据恢复到凌晨02:00的数据。(数据会丢失很多)
2、归档恢复:备份中的归档,有02:00~14:00之间的数据信息,可以基于归档日志将数据恢复到指定的事务id或者是指定时间点,从而实现数据的完整恢复。
准备场景和具体操作
1、构建一张t3表查询一些数据
-- 构建一张表
create table t3 (id int);
insert into t3 values (1);
insert into t3 values (11);
2、模拟凌晨2点开始做全备操作
pg_basebackup -D /pg_basebackup -Ft -Pv -Upostgres -h 192.168.11.32 -p 5432 -R
3、再次做一些写操作,然后误删数据
-- 凌晨2点已经全备完毕
-- 模拟第二天操作
insert into t3 values (111);
insert into t3 values (1111);
-- 误删操作 2023年3月20日20:13:26
delete from t3;
4、恢复数据(确认有归档日志)
将当前服务的数据全部干掉,按照之前的全备恢复的套路先走着
然后将全备的内容中的base.tar扔data目录下,归档日志也扔到/archive位置。
5、查看归档日志,找到指定的事务id
查看归档日志,需要基于postgresql提供的一个命令
# 如果命令未找到,说明两种情况,要么没有这个可执行文件,要么是文件在,没设置环境变量
# 咱们这是后者
pg_waldump
# 也可以采用全路径的方式
/usr/pgsql-12/bin/pg_waldump
6、修改data目录下的恢复数据的方式
修改postgresql.auto.conf
文件
将之前的最大恢复,更换为指定的事务id恢复
基于提供的配置例子,如何指定事务id
修改postgresql.auto.conf文件指定好事务ID
7、启动postgreSQL服务,查看是否恢复到指定事务ID
8、记得执行会后的函数,避免无法执行写操作
select pg_wal_replay_resume();