淘先锋技术网

首页 1 2 3 4 5 6 7

1、环境

centos 7系统
postgresql 12
docker 20.10.6

2、整体思路

1)进行一个pg+data目录的全量备份

2)通过wal日志恢复到故障发生之前某个时间点

3、操作步骤

配置postgresql.conf文件

#日志级别
wal_level = replica
#归档开关
archive_mode = on
#归档命令
archive_command = 'cp %p /home/archive/%f && echo %f >> /home/archive/archive.list' 
#用于指定pg_wal目录中保存的过去的wal文件(wal 段)的最小数量
wal_keep_segments=1024

重启pg

4、查看归档目录

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

ls /home/archive/
000000010000000000000001  000000010000000000000002  000000010000000000000003  000000010000000000000004  archive.list

如果归档目录中没有内容,需要执行强制日志归档命令

select pg_switch_wal();

如果还是没有,查看数据库日志
如果报错cp:can not create XXX permission denied
给创建的归档目录授权777 然后再次重启 并查看 日志 看该报错是否消失
如果消失则再去查看归档目录 看是否有上面类似内容
如果没有 则执行强制归档命令select pg_switch_wal();

chmod 777 /home/archive

5、使用pg_basebackup进行基础备份

pg_basebackup

/usr/local/pgsql/bin/pg_basebackup -h 127.0.0.1 -U postgres -p 5432 -Ft -Pv -Xf -z -Z5 -D /home/pgdata_bk

备份完成后,对应备份目录会出现基础备份 是一个压缩包

准备试验数据

在2022-03-10 16:40:00 创建表dog 并随意插入几条数据
等待适当时间,在16:43:00创建表cat 并随意插入几条数据
恢复时间点 2022-03-10 16:42:00 (创建两张表之间的时间点就行)
如果恢复后数据库中存在dog表,不存在cat表 则试验成功

模拟数据库故障

模拟数据库故障,停掉数据库

备份原来的data目录

cp -r _data data_bk  ##备份目录

rm -rf _data/*   #删除原来data目录内容

cp /home/pgdata_bk/base.tar.gz _data/  #将备份的压缩包复制到data目录中并解压
tar -zxvf base.tar.gz

rm -rf base.tar.gz  #删除备份

修改postgresql.conf

设置归档命令和恢复时间点
设置恢复时间点的时候要注意时区问题

restore_command = 'cp /home/archive/%f %p > /home/archive/recovery.log 2>&1  '
recovery_target_time = '2022-03-10 16:42:00'

添加空白文件recovery.signal文件

data目录添加文件 提醒postgresql要做recovery

touch recovery.signal

重启查看数据

查看数据是否符合预期
恢复后的数据库为只读模式 需要执行

select pg_wal_replay_resume()

可能遇到的问题

1)pg_basebackup 操作FATAL: no pg_hba.conf entry for replication connection from host

在pg_hba.cnf中 单单指明 local all postgres  127.0.0.1/32 md5 不够
还需添加 host replication all 127.0.0.1/32 md5
参考:
https://www.cnblogs.com/zhenren001/p/15956270.html
链接:https://www.jianshu.com/p/a492706238a6