实现Postgresql10基于wal日志的数据恢复
介绍
之前讲过百度里的一些帖子和资源是比较古老的,在后面的发展一些流程或者函数发生变化,因此在使用过程中会有一些问题。而在之前的业务中有用到基于postgresql的wal日志恢复,但百度上的帖子都是基于postgresql10以下的。而postgresql10则针对内部函数有进行优化,部分函数名发生了改变,因此记录下。
wal日志
wal日志就是预写式日志,是日志的标准实现方式,简单而言就是将对数据库的变动记录到日志 中,而后在将具体的新数据刷新到磁盘。PostgreSQL将该日志维护在数据文件夹下的子文件夹pg_xlog中。当数据库崩溃后,可以通过“重放”日志中的“动作”,将数据库恢复。也就是说,只要拥有一个基础备份和完整的日志文件,理论上可以将数据库库恢复到任意基础备份以来的任意时刻点。不仅如此,如果在另一个实例上将这些日志不停的“重放”,那么就拥有了一个完整的在线备份,也就是“复制”。
pg_xlog下日志文件不会无限制增多,也就是说并不用担心日志的增多使得磁盘空间捉襟见肘。默认每个日志文件为16M大小,即当增长到16M时,就会切换到别的文件,并复用之前的文件 。因此,为了保证有个完整的日志链,必须将写满的文件复制保存到一个特定的文件 夹。对于最后一个还未满16M的日志文件,可以手动触发一次切换。
配置过程
修改配置文件开启wal日志
vim /etc/postgresql/10/main/postgresql.conf
wal_level = replica
archive_mode = on
archive_command = ' test ! -f /var/lib/postgresql/archive/%f && cp %p /var/lib/postgresql/archive/%f'`
archive_command是归档命令
然后创建归档目录
cd /usr/lib/postgres
su postgres
mkdir archive
切记,是切换到postgres用户再去创建,因为pgsql是以postgres用户去操控的
然后重启服务
/usr/lib/postgresql/10/bin/pg_ctl restart -D /var/lib/postgresql/10/main/ -o "-c config_file=/etc/postgresql/10/main/postgresql.conf"
然后创建数据库,数据表啥的填充数据啥的,
接着创建基础备份
psql -c "SELECT pg_start_backup('base', true)"
cd /var/lib/postgresql/10/
tar -cvf main.tar main
psql -c "SELECT pg_stop_backup()"
正常情况下,main文件夹以及wal日志文件夹archive都要备份,因为wal日志会记录你后面的操作
这时候创建几张新表,关闭数据库,模拟数据库宕机,此时,数据库test中应该有3张表,其中1张表在基础备份前,也就是恢复完数据文件即可找回,而另2张表则需恢复相应的日志文件。模拟恢复到testPITR2创建时刻点。
notice:在postgresql10版本开始手动触发归档命令由pg_switch_xlog()变为pg_switch_wal(),
最好手动设置下环境变量PGDATA
然后关闭服务器,删除main文件夹,然后重新解压main.tar
进入main文件夹,生成recovery.conf文件,该文件生成目录在PGDATA目录里,目录地址可以在postgresql.conf文件里找到
vim recovery.conf
写入以下参数
restore_command = 'cp /var/lib/postgresql/archive/%f %p'
recovery_target_time = '2016-01-18 10:02:15'
wal日志可以基于时间点回复,或者事务id,但是事务id查询起来特别麻烦,所以最好基于时间点回复,