pg_rman 的编译和使用

一、编译

下载地址:

ossc-db/pg_rman: Backup and restore management tool for PostgreSQL (github.com)icon-default.png?t=N7T8https://github.com/ossc-db/pg_rman代码由日本电信的运维团队维护。

针对不同的PostgreSQL版本,使用不同的分支编译,我的PG版本试12.6,对应的分支为REL_12_STABLE。

pg_rman的编译要依赖PG的源码,或者是包含PG头文件和库文件的PG安装包,我之前从源码编译安装了PG,所以只要设置了PATH和LD_LIBRARY_PATH就行,本质上,编译pg_rman时,是使用了PG安装文件中的pg_config,来设置头文件和库文件的编译选项。

git clone https://github.com/ossc-db/pg_rman.git

cd pg_rman

git co -b rel_12_stable origin/REL_12_STABLE

make

make install

# make install 将pg_rman安装到PostgreSQL安装目录的bin目录下

二、使用

1、初始化

如果是第一次用,要初始化,使用pg_rman有个前提,就是要求PG服务端要开启归档日志,即archive_mode要设为on或always, 同时设置archive_command,这是必须的。

对于Oracle DBA,大多数情况,pg_rman中的概念,可以对比Oracle的RMAN。

pg_rman init \

-B /mnt/disk01/debug-PostgreSQL/bkp-dir \

-D /mnt/disk01/debug-PostgreSQL/_pg_root \

-S /mnt/disk01/debug-PostgreSQL/log \

-A /mnt/disk01/debug-PostgreSQL/arcdir

INFO: ARCLOG_PATH is set to '/mnt/disk01/debug-PostgreSQL/arcdir'
INFO: SRVLOG_PATH is set to '/mnt/disk01/debug-PostgreSQL/log'

-B 是设置pg_rman的工作目录,要求绝对路径,存储的是pg_rman的元数据、备份的数据,对应的环境变量是 BACKUP_PATH。

-D 是PG数据目录,要求绝对路径,是PG初始化时创建的那个目录,对应的环境变量是 PGDATA。

-S 是PG的运行日志所在目录,即postgresql.conf中log_directory参数指向的路径,要求绝对路径,注意这个不是WAL目录或归档日志目录,对应的环境变量是 SRVLOG_PATH。

-A 是PG的归档日志所在目录,即postgresql.conf中archive_command中保存归档日志命令的目的路径,要求绝对路径,对应的环境变量是 ARCLOG_PATH。

这些参数最好设置环境变量,不然每个命令都要带着。

pg_rman和Oracle的RMAN不同的是,并不是执行pg_rman后进入一个命令行环境,而是pg_rman后面紧接着子命令,一个pg_rman + 子命令,完成一个任务。

pg_rman支持下面一些子命令:

2、 备份

假设已经设置了下面的环境变量

export BACKUP_PATH=/mnt/disk01/debug-PostgreSQL/bkp-dir
export SRVLOG_PATH=/mnt/disk01/debug-PostgreSQL/log
export ARCLOG_PATH=/mnt/disk01/debug-PostgreSQL/arcdir
export PGDATA=/mnt/disk01/debug-PostgreSQL/_pg_root

PG服务器已经启动,并且使用默认端口5432,pg_man和PG服务器在同一台机器上

pg_rman backup -b full

# 之后还要执行validate,这样这个备份才可用,才能用来恢复

pg_rman validate

# 增量备份

pg_rman backup -b incremental

pg_rman validate

# 查看备份

pg_rman show

[postgres@qinh154 debug-PostgreSQL]$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2023-10-07 17:14:18  2023-10-07 17:14:20  INCR    33MB     1  OK
2023-10-07 17:06:46  2023-10-07 17:06:49  FULL    84MB     1  OK

# 备份归档日志也很有用,缺点是太占空间

pg_rman backup -b archive

pg_rman validate

pg_rman show

=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2023-10-07 17:17:01  2023-10-07 17:17:02  ARCH    16MB     1  OK
2023-10-07 17:14:18  2023-10-07 17:14:20  INCR    33MB     1  OK
2023-10-07 17:06:46  2023-10-07 17:06:49  FULL    84MB     1  OK

pg_rman的备份以时间作为id,所以选择备份用来恢复时,通过选择StartTime或EndTime,删除备份也是如此。

3、恢复

 恢复需要先停PG服务器,假设已经设置了下面的环境变量:

export BACKUP_PATH=/mnt/disk01/debug-PostgreSQL/bkp-dir
export SRVLOG_PATH=/mnt/disk01/debug-PostgreSQL/log
export ARCLOG_PATH=/mnt/disk01/debug-PostgreSQL/arcdir
export PGDATA=/mnt/disk01/debug-PostgreSQL/_pg_root

1)完全恢复

# 恢复到最新的备份。

pg_rman restore

2)PITR

可以通过--recovery-target-time和--recovery-target-timeline 指定恢复到时间点附近:

pg_rman restore --recovery-target-time='2023-10-07 17:14:18' --recovery-target-timeline=2 

注意,pg_rman的备份恢复时基于pg_basebackup的,因此备份其实是在做basebackup,而恢复时用备份的basebackup覆盖当前的数据目录,因此postgresql.conf都会恢复为备份时的设置。

恢复其实分两步:

第一步是PG服务器停机时restore,即用备份的数据目录覆盖当前的数据目录。

第二步是recovery,即利用PG自己的恢复机制,pg_rman在PGDATA目录下创建recovery.signal,并且创建 pg_rman_recovery.conf 并包含在postgresql.conf中,设置下面的参数:

restore_command = 'cp /mnt/disk01/debug-PostgreSQL/arcdir/%f %p'
recovery_target_time = '2023-10-07 17:14:18'
recovery_target_timeline = '2'

然后,启动PG服务器,PG服务器就按照配置自动恢复了。如果是完全恢复,PG服务器恢复到最新状态,会自动删除 recovery.signal,管理员不需要再做什么了。

如果是PITR,PG有意设计了这样的机制:PG服务器启动后,恢复到recovery_target_time指定的时间点后,并不会删除recovery.signal,此时服务器状态是只读,管理员可以查看服务器状态是否达到要求,如果没有,还可以向后调整恢复时间,方法是修改recovery_target_time然后重启PG服务器。如果管理员确定,恢复状态达到期望,则执行select pg_wal_replay_resume(),之后PG服务器可以读写,recovery.signal被删除,PITR完成。

还有,就是恢复完成后,要记得手动删除这三个参数!
这里有个细节要注意:在recovery时,postgresql.conf 中开启归档日志的参数archive_mode,最好是on,如果是always,那么在recovery时也会产生归档日志,这样会与归档日志目录下原有的归档日志,在文件名上有冲突,而用on,在recovery时就不会产生归档日志。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值