[toc]

一.前期准备

1.开启WAL归档

  1. vim postgresql.conf
  2. wal_level='replica' #wal_level至少设置为replica
  3. archive_mode='on'
  4. archive_command='cp %p /backup/pgarch'
  5. #注意/backup/pgarch目录的属主属组都要为postgres(chown -R postgres:postgres /backup/pgarch )

2.备份

  1. pg_basebackup -Ft -Pv -Xf -z -Z5 -p5432 -D /pdback

3.进入数据库创建一张测试表并初始化测试数据

  1. create table test01(id int primary key,name varchar(20));
  2. insert into test01 values(1,'a'),(2,'b'),(3,'c');

4.备份完之后做一次WAL切换,保证最新的WAL日志归档到归档目录

  1. select pg_switch_wal();

二.恢复到某一时间点

模拟情景

1.test01表目前有四条数据

  1. select * from test01;
  2. id | name
  3. ----+------
  4. 1 | a
  5. 2 | b
  6. 3 | c
  7. 4 | d

2.误操作将数据删除

  1. delete from test01;
  2. select * from test01;
  3. id | name
  4. ----+------

3.数据恢复

  1. #先查看一下当前的时间戳
  2. select current_timestamp;
  3. current_timestamp
  4. -------------------------------
  5. 2018-09-10 09:54:55.794813+08
  6. select pg_switch_wal();
  7. pg_switch_wal
  8. ---------------
  9. 2/DA0003E0
  10. #删除操作大概是3分钟之前的操作,那么将这个时间戳往前推3分钟,切换一下wal日志,确保最新的wal日志同步到归档目录
  11. #思路是利用最新的备份+wal日志恢复数据

示例

1.现将之前的数据目录备份一下

  1. pg_ctl stop
  2. mv /pgdata /pgdata.bak

2.将最新的备份恢复到数据目录

  1. mkdir /pgdata
  2. vim recovery.done
  3. restore_command='cp /backup/pgarch/%f %p'
  4. recovery_target_time='2018-09-10 09:51:55.794813+08'
  5. recovery_target_timeline='latest'
  6. mv ./recovery.done ./recovery.conf
  7. chown -R postgres:postgres /pgdata
  8. chmod 700 /pgdata
  9. select * from test01;
  10. id | name
  11. ----+------
  12. 1 | a
  13. 2 | b
  14. 3 | c
  15. 4 | d
  16. #可以看到数据已恢复

3.解除暂停状态

  1. select pg_wal_replay_resume();

三.恢复到指定还原点

情景模拟

  1. select * from test01;
  2. id | name
  3. ----+------
  4. 1 | a
  5. 2 | b
  6. 3 | c
  7. 4 | d
  8. select pg_create_restore_point('rp1');
  9. pg_create_restore_point
  10. -------------------------
  11. 2/D90003B0
  12. #创建一个还原点
  13. drop table test01;
  14. select pg_switch_wal();
  15. pg_switch_wal
  16. ---------------
  17. 2/DA005700

恢复

思路:最新的备份+wal日志
1.将备份恢复,配置recovery.conf文件

  1. vim recovery.conf
  2. restore_command='cp /backup/pgarch/%f %p'
  3. recovery_target_name='rp1'
  4. recovery_target_timeline='latest'

2.启动并进入数据库,查看数据是否被恢复

  1. select * from test01 ;
  2. id | name
  3. ----+------
  4. 1 | a
  5. 2 | b
  6. 3 | c
  7. 4 | d
  8. #可以看到数据已经被恢复了
  9. #当前数据库状态为pause状态(recovery_target_action),我们可以判断当前的数据是否满足我们的预期值,如果不满足,那么可以继续向后推,直到达到我们的预期值

3.解除暂停状态

  1. select pg_wal_replay_resume();

四.恢复到指定事务

情景模拟

  1. select * from test01 ;
  2. id | name
  3. ----+------
  4. 1 | a
  5. 2 | b
  6. 3 | c
  7. 4 | d
  8. begin;
  9. select txid_current();
  10. txid_current
  11. --------------
  12. 342261
  13. drop table test01 ;
  14. end;
  15. select pg_switch_wal();

假设要恢复表test01的数据,示例

1.将最新的备份恢复后,配置recovery.conf文件

  1. vim recovery.conf
  2. restore_command='cp /backup/pgarch/%f %p'
  3. recovery_target_xid='342261'
  4. recovery_target_inclusive = false
  5. recovery_target_timeline='latest'

2.启动并进入数据库,检查test01数据是否恢复

  1. select * from test01 ;
  2. id | name
  3. ----+------
  4. 1 | a
  5. 2 | b
  6. 3 | c
  7. 4 | d
  8. #恢复成功

3.关闭数据库pause状态

  1. select pg_wal_replay_resume();
0 评论  
添加一条新评论