[toc]
一.前期准备
1.开启WAL归档
vim postgresql.conf
wal_level='replica' #wal_level至少设置为replica
archive_mode='on'
archive_command='cp %p /backup/pgarch'
#注意/backup/pgarch目录的属主属组都要为postgres(chown -R postgres:postgres /backup/pgarch )
2.备份
pg_basebackup -Ft -Pv -Xf -z -Z5 -p5432 -D /pdback
3.进入数据库创建一张测试表并初始化测试数据
create table test01(id int primary key,name varchar(20));
insert into test01 values(1,'a'),(2,'b'),(3,'c');
4.备份完之后做一次WAL切换,保证最新的WAL日志归档到归档目录
select pg_switch_wal();
二.恢复到某一时间点
模拟情景
1.test01表目前有四条数据
select * from test01;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
2.误操作将数据删除
delete from test01;
select * from test01;
id | name
----+------
3.数据恢复
#先查看一下当前的时间戳
select current_timestamp;
current_timestamp
-------------------------------
2018-09-10 09:54:55.794813+08
select pg_switch_wal();
pg_switch_wal
---------------
2/DA0003E0
#删除操作大概是3分钟之前的操作,那么将这个时间戳往前推3分钟,切换一下wal日志,确保最新的wal日志同步到归档目录
#思路是利用最新的备份+wal日志恢复数据
示例
1.现将之前的数据目录备份一下
pg_ctl stop
mv /pgdata /pgdata.bak
2.将最新的备份恢复到数据目录
mkdir /pgdata
vim recovery.done
restore_command='cp /backup/pgarch/%f %p'
recovery_target_time='2018-09-10 09:51:55.794813+08'
recovery_target_timeline='latest'
mv ./recovery.done ./recovery.conf
chown -R postgres:postgres /pgdata
chmod 700 /pgdata
select * from test01;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
#可以看到数据已恢复
3.解除暂停状态
select pg_wal_replay_resume();
三.恢复到指定还原点
情景模拟
select * from test01;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
select pg_create_restore_point('rp1');
pg_create_restore_point
-------------------------
2/D90003B0
#创建一个还原点
drop table test01;
select pg_switch_wal();
pg_switch_wal
---------------
2/DA005700
恢复
思路:最新的备份+wal日志
1.将备份恢复,配置recovery.conf文件
vim recovery.conf
restore_command='cp /backup/pgarch/%f %p'
recovery_target_name='rp1'
recovery_target_timeline='latest'
2.启动并进入数据库,查看数据是否被恢复
select * from test01 ;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
#可以看到数据已经被恢复了
#当前数据库状态为pause状态(recovery_target_action),我们可以判断当前的数据是否满足我们的预期值,如果不满足,那么可以继续向后推,直到达到我们的预期值
3.解除暂停状态
select pg_wal_replay_resume();
四.恢复到指定事务
情景模拟
select * from test01 ;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
begin;
select txid_current();
txid_current
--------------
342261
drop table test01 ;
end;
select pg_switch_wal();
假设要恢复表test01的数据,示例
1.将最新的备份恢复后,配置recovery.conf文件
vim recovery.conf
restore_command='cp /backup/pgarch/%f %p'
recovery_target_xid='342261'
recovery_target_inclusive = false
recovery_target_timeline='latest'
2.启动并进入数据库,检查test01数据是否恢复
select * from test01 ;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
#恢复成功
3.关闭数据库pause状态
select pg_wal_replay_resume();
本站文章,未经作者同意,请勿转载,如需转载,请邮件customer@csudata.com.
0 评论
添加一条新评论