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