[toc]
一.前期准备
1.开启WAL归档
vim postgresql.confwal_level='replica' #wal_level至少设置为replicaarchive_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 | a2 | b3 | c4 | d
2.误操作将数据删除
delete from test01;select * from test01;id | name----+------
3.数据恢复
#先查看一下当前的时间戳select current_timestamp;current_timestamp-------------------------------2018-09-10 09:54:55.794813+08select pg_switch_wal();pg_switch_wal---------------2/DA0003E0#删除操作大概是3分钟之前的操作,那么将这个时间戳往前推3分钟,切换一下wal日志,确保最新的wal日志同步到归档目录#思路是利用最新的备份+wal日志恢复数据
示例
1.现将之前的数据目录备份一下
pg_ctl stopmv /pgdata /pgdata.bak
2.将最新的备份恢复到数据目录
mkdir /pgdatavim recovery.donerestore_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.confchown -R postgres:postgres /pgdatachmod 700 /pgdataselect * from test01;id | name----+------1 | a2 | b3 | c4 | d#可以看到数据已恢复
3.解除暂停状态
select pg_wal_replay_resume();
三.恢复到指定还原点
情景模拟
select * from test01;id | name----+------1 | a2 | b3 | c4 | dselect 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.confrestore_command='cp /backup/pgarch/%f %p'recovery_target_name='rp1'recovery_target_timeline='latest'
2.启动并进入数据库,查看数据是否被恢复
select * from test01 ;id | name----+------1 | a2 | b3 | c4 | d#可以看到数据已经被恢复了#当前数据库状态为pause状态(recovery_target_action),我们可以判断当前的数据是否满足我们的预期值,如果不满足,那么可以继续向后推,直到达到我们的预期值
3.解除暂停状态
select pg_wal_replay_resume();
四.恢复到指定事务
情景模拟
select * from test01 ;id | name----+------1 | a2 | b3 | c4 | dbegin;select txid_current();txid_current--------------342261drop table test01 ;end;select pg_switch_wal();
假设要恢复表test01的数据,示例
1.将最新的备份恢复后,配置recovery.conf文件
vim recovery.confrestore_command='cp /backup/pgarch/%f %p'recovery_target_xid='342261'recovery_target_inclusive = falserecovery_target_timeline='latest'
2.启动并进入数据库,检查test01数据是否恢复
select * from test01 ;id | name----+------1 | a2 | b3 | c4 | d#恢复成功
3.关闭数据库pause状态
select pg_wal_replay_resume();
本站文章,未经作者同意,请勿转载,如需转载,请邮件customer@csudata.com.
0 评论
添加一条新评论