postgre 任意时间点备份恢复(阿里云)

       简介&思路

           阿里云的RDS for PostgreSQL目前提供的备份为物理备份,备份粒度可以自己设置,最频繁的基础备份可以做到一天一次。有了这个备份和归档日志,我们可以做到基于任意时间点(实际上是事务提交或回滚点的粒度)的恢复。   

          归档文件规律:采用从1开始顺序记录的16进制

          备份集起始归档:默认记录 第一份归档的序号。

         postgre engine 创建后 第一份备份集和第一份归档便同时开始备份记录,可以恢复 任意备份集 开始时间后的任意时间点。(给够足量的归档便可,否则恢复至最后的归档文件)

       简图:

postgre 任意时间点备份恢复(阿里云)_第1张图片

          为了使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 恢复默认端口。

postgre 任意时间点备份恢复(阿里云)_第2张图片

       启动过程中遇到FATAL:  could not access file "pg_stat_statements": No such file or directory ,解决方法为 删除 /pgdata/postgresql.conf  中的shared_preload_libraries里的内容

postgre 任意时间点备份恢复(阿里云)_第3张图片    

     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 任意时间点备份恢复(阿里云)_第4张图片

        从进程查看 该postgre正处于恢复任务,使用0000^3在恢复。

    登录验证

          启动服务后使用postgre 客户端  navicat for postgreSQL 验证。使用用户replicator或aurora登录 并导出数据

postgre 任意时间点备份恢复(阿里云)_第5张图片postgre 任意时间点备份恢复(阿里云)_第6张图片

     通过修改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
启动恢复效果

postgre 任意时间点备份恢复(阿里云)_第7张图片

postgre 任意时间点备份恢复(阿里云)_第8张图片

恢复时间设置
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
启动恢复效果postgre 任意时间点备份恢复(阿里云)_第9张图片

postgre 任意时间点备份恢复(阿里云)_第10张图片

恢复时间设置
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
启动恢复效果

postgre 任意时间点备份恢复(阿里云)_第11张图片

 postgre 任意时间点备份恢复(阿里云)_第12张图片

 

postgre 任意时间点备份恢复(阿里云)_第13张图片

postgre 任意时间点备份恢复(阿里云)_第14张图片

 

 

 

你可能感兴趣的:(postgre 任意时间点备份恢复(阿里云))