PostgreSQL12中实现增量备份与任意时间点恢复

在postgres中,能够使用简单的逻辑备份工具pg_dump做某个数据库的完整备份

问题

如果数据库在运行过程中发生故障, 使用逻辑备份只能将数据库还原到备份时刻, 无法恢复到故障发生前的那个时刻;

由于误操作修改或删除了重要数据, 需要还原到误操作前的那个时刻

解决方案

增量备份和任意时间点恢复

实现增量备份的思路是
1. 记录数据库系统的操作记录(WAL归档)
2. 在某一时刻进行一次完整的数据库备份
3. 需要恢复时,还原上一次完整的数据库备份,根据操作记录恢复数据库至指定的某个时刻(即可以实现PITR 时间点恢复)

操作

1、配置数据库、vim postgresql.conf

wal_level = replica
archive_mode = on
archive_command = 'cp %p /home/test/archive/%f && echo %f >> /home/test/archive/archive.list' 
wal_keep_segments
=1024

2、重启数据库

pg_ctl -D /home/test/data/ -l /home/test/log restart

3、此后数据库的操作都会记录wal日志文件到/home/test/archive目录下

[test@localhost bin]$ ls /home/test/archive/
000000010000000000000001  000000010000000000000002  000000010000000000000003  000000010000000000000004  archive.list

4、创建基础备份,可以使用pg_basebackup

pg_basebackup -D /home/test/back -Fp -v -P -Upostgres -R

5、测试数据准备

postgres=# create table t2(a int);
CREATE TABLE
postgres=# insert into t2 values (generate_series(1,1000000));
INSERT 0 1000000
记录时间:
2020年 05月 09日 星期六 21:46:57 CST

postgres=# create table t3(a int);
CREATE TABLE
postgres=# insert into t3 values (generate_series(1,1000000));
INSERT 0 1000000

6、假定数据库故障,停止数据库,备份故障data并将基础备份的back替换为新data

mv data data_back
mv back data

7、修改data目录下postgresql.auto.conf

restore_command = 'cp /home/test/archive/%f %p > /home/test/archive/recovery.log 2>&1  '
recovery_target_time = '2020-05-09 21:46:57'
recovery_target_time表示要恢复到的时间点

8、启动数据库

 /usr/pgsql-12/bin/./pg_ctl -D data/ start

9、查看数据,可知t3未被恢复

[test@localhost ~]$ psql -Upostgres
psql (12.2)
输入 "help" 来获取帮助信息.

postgres=# \dt
              关联列表
 架构模式 | 名称 |  类型  |  拥有者
----------+------+--------+----------
 public   | t1   | 数据表 | postgres
 public   | t2   | 数据表 | postgres
(2 行记录)

日志信息:

2020-05-09 21:40:15.638 CST [13422] 日志:  数据库上次关闭时间为 2020-05-08 23:24:35 CST
2020-05-09 21:40:15.686 CST [13420] 日志:  数据库系统准备接受连接
2020-05-09 22:05:18.986 CST [23055] 日志:  数据库系统中断;上一次的启动时间是在2020-05-09 21:53:25 CST
2020-05-09 22:05:19.003 CST [23055] 日志:  正在进入备用模式
2020-05-09 22:05:19.019 CST [23055] 日志:  从归档中恢复日志文件 "000000010000000000000009"
2020-05-09 22:05:19.040 CST [23055] 日志:  redo 在 0/9000060 开始
2020-05-09 22:05:19.041 CST [23055] 日志:  在0/9000138上已到达一致性恢复状态
2020-05-09 22:05:19.042 CST [23053] 日志:  数据库系统准备接受只读请求的连接
2020-05-09 22:05:19.055 CST [23055] 日志:  从归档中恢复日志文件 "00000001000000000000000A"
2020-05-09 22:05:19.384 CST [23055] 日志:  从归档中恢复日志文件 "00000001000000000000000B"
2020-05-09 22:05:19.837 CST [23055] 日志:  从归档中恢复日志文件 "00000001000000000000000C"
2020-05-09 22:05:20.343 CST [23055] 日志:  从归档中恢复日志文件 "00000001000000000000000D"
2020-05-09 22:05:20.986 CST [23055] 日志:  恢复停止在事物 494 提交之前, 时间 2020-05-09 21:47:16.174754+08
2020-05-09 22:05:20.986 CST [23055] 日志:  恢复操作已暂停
2020-05-09 22:05:20.986 CST [23055] 提示:  执行 pg_wal_replay_resume() 以继续.

 the end;

 

posted @ 2020-05-09 23:22  明矾  阅读(4738)  评论(0编辑  收藏  举报