实战案例:利用PITR实现误删除的恢复

150 阅读1分钟

1.场景说明

每天2:00备份,第二天10:00误删除数据库,如何恢复?

2.环境准备和故障恢复过程

10.0.0.14 test PGserver
10.0.0.15 test2 备份服务器

备份数据和归档

还原流程

  • 还原完全备份
  • 归档日志恢复:
    • 备份中的归档
    • 恢复2:00到10:00之间的归档
    • 恢复在线redo

3.详细配置

3.1备份

#修改用户postgres密码

[root@rocky8 ~]#psql postgres=# ALTER USER postgres with password '123456';

#查看监听地址和端口,并修改

[root@rocky8 ~]#ss -ntl 

[root@rocky8 ~]#vim /pgsql/data/postgresql.conf 
listen_addresses = '*'  #修改此行中的localhost为 * 
#listen_addresses = '0.0.0.0' #或者修改为 0.0.0.0

#在postgreSQL服务器先授权

[postgres@gpserver ~]$vi /pgsql/data/pg_hba.conf 
host replication all 10.0.0.0/24 md5

[postgres@gpserver ~]$pg_ctl restart -D $PGDATA

#在PG服务器开启归档

[postgres@gpserver ~]# mkdir /archive/
[postgres@gpserver ~]# chown postgres.postgres /archive/

[postgres@pgserver ~]$ vim /pgsql/data/postgresql.conf 
archive_mode = on 
archive_command = 'test ! -f /archive/%f &&cp %p /archive/%f' 
[postgres@gpserver ~]$pg_ctl restart  -D $PGDATA

#在PG服务器上创建测试数据

postgres=#create database testdb; 
postgres=#\c testdb 
testdb=# create table t1(id int); 
testdb=# insert into t1 values(1);

#在备份服务器对PG数据库进行远程完全备份

[postgres@backup ~]mkdir -p /pgsql/backup/
[postgres@backup ~]$pg_basebackup -D /pgsql/backup/ -Ft -Pv -Upostgres -h 10.0.0.14 -p 5432 -R

[postgres@pgserver ~]# mkdir /archive/
[postgres@pgserver ~]# chown postgres.postgres /archive/

#在PG服务器上继续生成测试数据

testdb=# insert into t1 values(2);

#模拟数据库删除

postgres=# drop database testdb;

#发现故障,停止用户访问

#查看当前日志文件

postgres=# select pg_walfile_name(pg_current_wal_lsn());

image.png

#查看当前事务ID

postgres=# select txid_current();

image.png

3.2故障还原

#在PG服务器上切换归档日志

postgres=#select pg_switch_wal();

image.png

image.png

#在要还原的服务器停止服务,准备还原

[postgres@pgserver ~]$pg_ctl stop  -D $PGDATA
[postgres@pgserver ~]$rm -rf /pgsql/data/*

#在测试的还原服务器进行还原

[postgres@backup ~]$tar xf /pgsql/backup/base.tar -C /pgsql/data/ #此步可以不执行 [postgres@backup ~]$tar xf /pgsql/backup/pg_wal.tar -C /archive

#复制PG服务器的归档日志到还原的测试服务器

[postgres@pgserver ~]$rsync -a 10.0.0.200:/archive/ /archive/

#查看故障点事务ID

[postgres@backup ~]$pg_waldump /archive/000000010000000000000006 |grep -B 10
"DROP dir"

image.png

#查看此指令的事务ID为739,前一个事务为738

#修改配置文件postgresql.conf,或者postgresql.auto.conf文件也可以

[postgres@backup ~]$vi /pgsql/data/postgresql.conf
#加下面两行
restore_command = 'cp /archive/%f %p'
#指定还原至上面查到的事务ID
recovery_target_xid = '738'

#启动服务

 [postgres@backup ~]$pg_ctl start -D $PGDATA

#验证数据

 [postgres@backup ~]$psql

image.png

#当前无法写入,需要恢复正常模式

image.png

 postgres=# select pg_wal_replay_resume();

#恢复正常写入

testdb=# insert into t1 values(4);

image.png

image.png