简介&思路
阿里云的RDS for PostgreSQL目前提供的备份为物理备份,备份粒度可以自己设置,最频繁的基础备份可以做到一天一次。有了这个备份和归档日志,我们可以做到基于任意时间点(实际上是事务提交或回滚点的粒度)的恢复。
归档文件规律:采用从1开始顺序记录的16进制
备份集起始归档:默认记录 第一份归档的序号。
postgre engine 创建后 第一份备份集和第一份归档便同时开始备份记录,可以恢复 任意备份集 开始时间后的任意时间点。(给够足量的归档便可,否则恢复至最后的归档文件)
简图:
为了使java层代码对备份恢复的可控性,我们采用docker技术。整体思路:使用centos基础镜像安装postgre服务。下载全集备份和归档备份,分别解压对应的postgre/wal 目录。挂载docker对应 postgre:/pgdata wal:/pgwal(pgwal为新建目录,commit到docker images中的) 通过修改对应配置文件pg_hba.conf 、postgresql.conf、 recovery.conf 来实现任意时间点恢复。
操作过程&&摸索实践
为了保证postgre服务的版本兼容性,最好使用阿里公有云使用的版本。版本下载请转官方:https://www.postgresql.org/ftp/source/ 具体安装过程参考:https://blog.csdn.net/qq_33854781/article/details/81782323
安装成功后会生成 pgdata 和postgresql 目录。我们主要操作pgdata。
pgdata目录结构:
.
|-- base
| |-- 1
| |-- 12998
| |-- 13003
| `-- 16398
|-- global
|-- pg_clog
|-- pg_dynshmem
|-- pg_log
|-- pg_logical
| |-- mappings
| `-- snapshots
|-- pg_multixact
| |-- members
| `-- offsets
|-- pg_notify
|-- pg_replslot
|-- pg_serial
|-- pg_snapshots
|-- pg_stat
|-- pg_stat_tmp
|-- pg_subtrans
|-- pg_tblspc
|-- pg_twophase
`-- pg_xlog
`-- archive_status
我们主要关注 :
pg_xlog:用户存放归档日志的目录,通过配置文件recovery.conf 中的restore_command配置从那里cp归档日志到该目录,用于恢复到用户的指定时间点。
pg_log : postgre 产生postgre日志的目录 可以根据postgresql.conf来配置产生的日志格式和目录。
配置文件:
pg_hba.conf:该文件主要用于对postgre访问的acl配置 ,配置如下:
local all all trust
host all all 0.0.0.0/0 trust
host all all ::1/128 trust
具体配置含义详见其他文章,该配置类似没有规则,全部信任全部放过。原因在于 我们提供恢复的数据用于其他线程链接dump出数据即可删除该容器,服务也就消失了,没有花心思的必要。
postgresql.conf:
需要修改阿里解压文件/pgdata/postgresql.conf 中port 为5432 恢复默认端口。
启动过程中遇到FATAL: could not access file "pg_stat_statements": No such file or directory ,解决方法为 删除 /pgdata/postgresql.conf 中的shared_preload_libraries里的内容
recovery.conf配置:
restore_command='cp /pgwal/%f "%p"'
recovery_target_time = '2019-05-29 07:00:44 UTC'
recovery_target_inclusive = false
recovery_target_time:触及这个时间后的XLOG中的第一个事务结束位置作为停止点。
restore_command上文已经讲解:指定恢复时间点内恢复需要用到下一个归档文件如00000^3,该配置会从/pgwal目录cp该归档日志到/pgdata/pg_xlog下,用于恢复使用。
recovery_target_inclusive (boolean):指定是否在指定的恢复目标之后停止(true),或者在恢复目标之前停止 (false);适用于recovery_target_time或者recovery_target_xid被指定的情况;这个设置分别控制事务是否有准确的目标提交时间或 ID 是否将被包括在该恢复中;默认值为 true
常用命令如下:
pgsql 快速启动 postgres -D /pgdata >logfile 2>&1 &
pgsql 快速关闭 kill -INT `head -1 /pgdata/postmaster.pid`
pg_ctl start -l /postgresql/log/pg_server.log
直接登录
psql -U postgres -d postgres -h 127.0.0.1 -p 5432
psql -U postgres -h 127.0.0.1 -p 5432
查看服务是否启动 ps -ef | grep postgres netstat -an | grep 5432
从进程查看 该postgre正处于恢复任务,使用0000^3在恢复。
登录验证
启动服务后使用postgre 客户端 navicat for postgreSQL 验证。使用用户replicator或aurora登录 并导出数据
通过修改recovery.conf来验证任意时间点恢复:
wal归档挂载目录
bash-4.2# ls -al /opt/fengxinzi/
total 1081352
drwx------ 2 postgres postgres 4096 May 29 08:50 .
drwxr-xr-x 11 root root 4096 May 29 03:19 ..
-rwx------ 1 postgres postgres 16777216 May 28 02:07 000000010000000000000001
-rwx------ 1 postgres postgres 16777216 May 28 02:07 000000010000000000000002
-rwx------ 1 postgres postgres 16777216 May 28 06:02 000000010000000000000003
-rwx------ 1 postgres postgres 16777216 May 29 07:39 000000010000000000000004
-rwx------ 1 postgres postgres 16777216 May 29 07:39 000000010000000000000005
-rwx------ 1 postgres postgres 16777216 May 29 07:39 000000010000000000000006
-rwx------ 1 postgres postgres 16777216 May 29 07:39 000000010000000000000007
-rwx------ 1 postgres postgres 16777216 May 29 07:39 000000010000000000000008
-rwx------ 1 postgres postgres 16777216 May 29 07:39 000000010000000000000009
-rwx------ 1 postgres postgres 16777216 May 29 07:39 00000001000000000000000A
-rwx------ 1 postgres postgres 16777216 May 29 07:39 00000001000000000000000B
-rwx------ 1 postgres postgres 16777216 May 29 07:39 00000001000000000000000C
恢复时间设置
bash-4.2# more /opt/back/recovery.conf
restore_command='cp /opt/fengxinzi/%f "%p"'
recovery_target_time = '2019-05-29 07:00:44 UTC'
recovery_target_inclusive = false
启动恢复效果
恢复时间设置
bash-4.2# more /opt/back/recovery.conf
restore_command='cp /opt/fengxinzi/%f "%p"'
recovery_target_time = '2019-05-29 07:30:44 UTC'
recovery_target_inclusive = false
启动恢复效果
恢复时间设置
bash-4.2# more /opt/back/recovery.conf
restore_command='cp /opt/fengxinzi/%f "%p"'
recovery_target_time = '2019-05-29 07:43:44 UTC'
recovery_target_inclusive = false
启动恢复效果