实现Postgresql10基于wal日志的数据恢复


实现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查询起来特别麻烦,所以最好基于时间点回复,

可以参考的网站:https://www.cnblogs.com/cxy486/p/5140262.html


文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
索引失效的场景以及原因 索引失效的场景以及原因
索引失效的场景以及原因背景在日常sql优化的过程中,往往会发现一些索引失效的问题,例如预期中该sql应该使用索引,但使用Explain命令后发现并未使用,因此做下记录,记录下索引失效的场景以及原因 场景数据量小的时候,索引可能会失效在数据量
下一篇 
实现PHP和JavaScript的TripleDES加密解密(三) 实现PHP和JavaScript的TripleDES加密解密(三)
实现PHP和JavaScript的TripleDES加密解密(三)介绍这章节讲下在加密过程中遇到的一些坑。 内容因为前端页面请求的时候会将一个32位16进制字符串转为 CryptoJs 类库里独有的数据结构 WordArray 去参与加密,
2020-05-20
  目录