postgresql 12版本存档恢复与目标恢复-完整实践

postgresql 12版本存档恢复与目标恢复

12版本与其他版本的区别
其他版本中recovery.conf作为标志文件,任何的操作都在该文件中进行参数修改
在12版本中发生了一些变化,标志文件为standby.signal,recovery.signal
通过pg_basebackup 搭建备库时会发现,备库中含有standby.signal作为标志,且为空文件
primary_conninfo 参数为指定备库的连接主库的信息,该参数在搭建备库是已经指向postgresql.auto.conf
restore_command 该参数为进行恢复时使用的参数,现在需要添加在postgresql.conf主配置文件中生效。

在上一期中,已经完成了主备搭建,在这里就不多赘述了,请参考postgresl部署与主备搭建

## 查看一下我们的数据及时间
pgtest1=# select * from pgtest1;
 id | age |         inserttime
----+-----+----------------------------
  1 |   1 | 2019-10-12 14:35:38.034883
 34 |   1 | 2019-10-12 15:02:07.928863
 35 |   1 | 2019-10-12 15:02:08.747575
 36 |   1 | 2019-10-12 15:02:09.322002
 37 |   1 | 2019-10-12 15:02:09.820686
 38 |   1 | 2019-10-12 15:02:52.227929
 39 |   1 | 2019-10-12 15:02:53.004496
(7 rows)
pgtest1=# select now();
              now
-------------------------------
 2019-10-12 15:04:18.920356+08
(1 row)
#### 这里是实验,所以我们进行手动备份,在生产中,拿出离我们故障之前的备份即可
-bash-4.2$ pg_basebackup -h 192.168.2.3 -p 5432 -U repl -w -Fp -Xs -Pv -R -D /data/pgdata/test

## 插入新数据,新数据的产生,看看之后能不能衔接
postgres=# \c pgtest1
You are now connected to database "pgtest1" as user "postgres".
pgtest1=#
insert into pgtest1(age) values (1);
INSERT 0 1
pgtest1=#
insert into pgtest1(age) values (1);
INSERT 0 1
pgtest1=#
insert into pgtest1(age) values (1);
INSERT 0 1
pgtest1=#
insert into pgtest1(age) values (1);
INSERT 0 1
pgtest1=#
insert into pgtest1(age) values (1);
INSERT 0 1
pgtest1=#
insert into pgtest1(age) values (1);
INSERT 0 1
pgtest1=#
insert into pgtest1(age) values (1);
INSERT 0 1
pgtest1=# \c pgtest1
You are now connected to database "pgtest1" as user "postgres".
pgtest1=# select * from pgtest1
pgtest1-# \e
pgtest1=# select * from pgtest1;
 id | age |         inserttime
----+-----+----------------------------
  1 |   1 | 2019-10-12 14:35:38.034883
 34 |   1 | 2019-10-12 15:02:07.928863
 35 |   1 | 2019-10-12 15:02:08.747575
 36 |   1 | 2019-10-12 15:02:09.322002
 37 |   1 | 2019-10-12 15:02:09.820686
 38 |   1 | 2019-10-12 15:02:52.227929
 39 |   1 | 2019-10-12 15:02:53.004496
 40 |   1 | 2019-10-12 15:07:45.596888
 41 |   1 | 2019-10-12 15:07:46.839594
 42 |   1 | 2019-10-12 15:07:47.847973
 43 |   1 | 2019-10-12 15:07:48.376398
 44 |   1 | 2019-10-12 15:07:48.900445

## 删除数据,并定位时间点,恢复该时间点之前,如果没有恢复到想要的时间,我们不停的向前调整时间即可
pgtest1=# delete FROM pgtest1 where id = 39;
DELETE 1
pgtest1=# select now();
              now
-------------------------------
 2019-10-12 15:11:12.855441+08
(1 row)

pgtest1=# delete FROM pgtest1 where id = 40;
DELETE 1

## t添加内容到postgresql.conf
restore_command = 'cp /data/pgdata/archivedir/%f %p'
recovery_target_time = ' 2019-10-12 15:11:00 '
recovery_target_timeline = 'latest'

## @@ 启动pg,并查看数据,查看到40已经恢复,修改time再次尝试

postgres=# \c pgtest1 
You are now connected to database "pgtest1" as user "postgres".
pgtest1=#                           
select * from pgtest1;
 id | age |         inserttime         
----+-----+----------------------------
  1 |   1 | 2019-10-12 14:35:38.034883
 34 |   1 | 2019-10-12 15:02:07.928863
 35 |   1 | 2019-10-12 15:02:08.747575
 36 |   1 | 2019-10-12 15:02:09.322002
 37 |   1 | 2019-10-12 15:02:09.820686
 38 |   1 | 2019-10-12 15:02:52.227929
 40 |   1 | 2019-10-12 15:07:45.596888
 41 |   1 | 2019-10-12 15:07:46.839594
 42 |   1 | 2019-10-12 15:07:47.847973
 43 |   1 | 2019-10-12 15:07:48.376398
 44 |   1 | 2019-10-12 15:07:48.900445
 45 |   1 | 2019-10-12 15:07:49.385489
 46 |   1 | 2019-10-12 15:07:49.896297
(13 rows)

## 调整时间后数据恢复
postgres=# \c pgtest1 
You are now connected to database "pgtest1" as user "postgres".
pgtest1=# select * from pgtest1;
 id | age |         inserttime         
----+-----+----------------------------
  1 |   1 | 2019-10-12 14:35:38.034883
 34 |   1 | 2019-10-12 15:02:07.928863
 35 |   1 | 2019-10-12 15:02:08.747575
 36 |   1 | 2019-10-12 15:02:09.322002
 37 |   1 | 2019-10-12 15:02:09.820686
 38 |   1 | 2019-10-12 15:02:52.227929
 39 |   1 | 2019-10-12 15:02:53.004496
 40 |   1 | 2019-10-12 15:07:45.596888
 41 |   1 | 2019-10-12 15:07:46.839594
 42 |   1 | 2019-10-12 15:07:47.847973
 43 |   1 | 2019-10-12 15:07:48.376398
 44 |   1 | 2019-10-12 15:07:48.900445
 45 |   1 | 2019-10-12 15:07:49.385489

错误

按照以上的做法,数据是恢复了,但并不是我们想要的效果,我通过状态等检查,依据postgresql连续归档与恢复-官网文档 发现上述实验有些小bug,并未达到效果
我在这里简单的描述一下进行的步骤:
首先服务出现故障,或者误删除数据,且想进行目标恢复
1,停止数据库,备份数据,以免进行操作时错误的发生,能够及时的还原
2,删除数据库目录下得所有子目录及文件,复制离故障时间最近的备份数据到数据库目录下,删除pg_wal下的所有目录及文件,以免其中过期的wal日志产生影响
3,如果没有pg_wal请创建,并copy步骤1中备份数据中的pg_wal中的文件,
4,配置postgresql.conf ,并在集群数据目录中创建recovery.signal
postgresql.conf 中添加,如果你进行归档恢复而非目标恢复,请省略recovery_target_time
restore_command = ‘cp /data/pgdata/archivedir/%f %p’
recovery_target_time = ’ 2019-10-14 18:11:43 ’
recovery_target_timeline = ‘latest’
######### 请注意这里,为何要添加standby_mode ############
小编刚开始也为添加,实验效果并未按照步骤5自动删除该文件,且通过状态检查为备库(前面已经讲过了备库的标志文件),添加此参数,启动服务器是,自动以主库身份运行,提供服务
cat recovery.signal
standby_mode = ‘off’

5.启动服务器。服务器将进入恢复模式,并继续读取所需的已归档WAL文件。如果恢复由于外部错误而终止,则只需重启服务器即可继续恢复。恢复过程完成后,服务器将删除recovery.signal(以防止以后意外重新进入恢复模式),然后开始正常的数据库操作。
6,检查数据库的内容,以确保您已恢复到所需状态。如果不是,请返回步骤1

francs.tan对于配置文件的描述
postgresql连续归档与恢复-官网
postgresql目标恢复-官网

你可能感兴趣的:(postgesql数据库)