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());
#查看当前事务ID
postgres=# select txid_current();
3.2故障还原
#在PG服务器上切换归档日志
postgres=#select pg_switch_wal();
#在要还原的服务器停止服务,准备还原
[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"
#查看此指令的事务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
#当前无法写入,需要恢复正常模式
postgres=# select pg_wal_replay_resume();
#恢复正常写入
testdb=# insert into t1 values(4);