

pg_rman是一款专门为postgresql设计的在线备份恢复的工具。其支持在线(热备份)和基于时间点备份方式。
pg_rman的安装
1.1 安装依赖
yum install -y bison flex readline-devel zlib-deve1 zlib zlib-devel gcc
1.2 下载地址
1.3 编译安装
tar xf pg_rman-1.3.14-pg14.tar.gz
make && make install
1.4 创建备份目录
mkdir /pg_rman_backup/{fullbackup,walbackup,pg_srvlog} -p
chown -R postgres:postgres /pg_rman_backup
1.5 修改环境变量
vim etc/profile
export BACKUP_PATH=/pg_rman_backup/fullbackup
export ARCLOG_PATH=/pg_rman_backup/walbackup
export SRVLOG_PATH=/pg_rman_backup/pg_srvlog
1.6 开启postgres归档
vim postgresql.conf
archive_mode = on
archive_command = 'DATE=`date +%Y%m%d`; DIR="/pg_rman_backup/walbackup/"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f'
1.7 pg_rman初始化
pg_rman init

pg_rman -B pg_rman_backup/fullbackup -D postgres/data -A pg_rman_backup/walbackup init
pg_rman参数说明:
# 归档目录
ARCLOG_PATH='/home/postgres/arch' # 数据库错误日志目录
SRVLOG_PATH='/home/postgres/data/log' # 压缩数据
COMPRESS_DATA = YES # 保存归档文件个数
KEEP_ARCLOG_FILES = 10 # 保存归档的天数
KEEP_ARCLOG_DAYS = 10 # 备份冗余度
KEEP_DATA_GENERATIONS = 3 # 保存备份集时间
KEEP_DATA_DAYS = 10 # 保存日志文件个数
KEEP_SRVLOG_FILES = 10 # 保存日志文件天数
KEEP_SRVLOG_DAYS = 10
1)Usage
pg_rman OPTION init pg_rman OPTION backup pg_rman OPTION restore pg_rman OPTION show [DATE] pg_rman OPTION show detail [DATE] pg_rman OPTION validate [DATE] pg_rman OPTION delete DATE pg_rman OPTION purge
2)Common Options
# 数据库存储区域的路径位置 -D, --pgdata=PATH # 存档存储区的路径位置 -A, --arclog-path=PATH # 服务器日志存储区域的路径位置 -S, --srvlog-path=PATH # 检查一下,看看能做些什么 -c, --check
# 详细显示消息的详细信息 -v, --verbose # 显示已处理文件的进度 -P, --progress
# 备份模式=完全模式、增量模式或归档模式 -b, --backup-mode=full, incremental, or archive
# 使用serverlog,还可以备份服务器日志文件 -s, --with-serverlog
# 压缩数据使用zlib压缩数据备份 -Z, --compress-data
# 平滑检查点在备份之前平滑检查点 -C, --smooth-checkpoint
# 完全备份出错:切换到完全备份模式 -F, --full-backup-on-error
# NUM保留完整数据备份的NUM代 --keep-data-generations=NUM
# 保留足够的数据备份以恢复到N天前 --keep-data-days=NUM
# NUM保留归档文件的数量 --keep-arclog-files=NUM
# 以天为单位修改存档的WAL --keep-arclog-days=DAY
# NUM保留服务器日志数 --keep-srvlog-files=NUM
# 在DAY中修改服务器日志 --keep-srvlog-days=DAY
# 从备用主机进行备份时备用主机的主机名 --standby-host=HOSTNAME
# 从备用端口进行备份时的备用端口 --standby-port=PORT
# 恢复将继续的时间戳 --recovery-target-time
# 恢复目标xid事务ID --recovery-target-xid
# 恢复目标,包括我们是否在恢复后立即停止 --recovery-target-inclusive
# 恢复到特定时间线 --recovery-target-timeline
# 硬拷贝复制archivelog不是硬链接 --hard-copy
# 显示全部也显示已删除的备份 -a, --show-all
# 强制删除早于给定日期的备份 -f, --force
# 要连接的数据库 -d, --dbname=DBNAME
# 主机名、数据库服务器、主机或套接字目录 -h, --host=HOSTNAME
# 端口数据库服务器端口 -p, --port=PORT
# 要连接的用户名 -U, --username=USERNAME
# 无密码。从不提示输入密码 -w, --no-password
# 密码强制密码提示 -W, --password
# 安静,不显示任何信息或调试消息 -q, --quiet
# 调试显示调试消息 --debug
# 帮助显示此帮助,然后退出 --help
# 版本输出版本信息,然后退出 --version
pg_rman全量备份
2.1 创建数据
create database test;
create table t1 (id int);
insert into t1 values (1);
2.2 进行全量备份
pg_rman backup --backup-mode=full --with-serverlog –progress
pg_rman --backup-path pg_rman_backup/fullbackup --pgdata
/postgres/data --arclog-path pg_rman_backup/walbackup
backup -b full -s --srvlog-path=/pg_rman_backup/pg_srvlog -U
postgres -d postgres -h 127.0.0.1 -p 5432

pg_rman -B /pg_rman_backup/fullbackup -A
/pg_rman_backup/walbackup -D /postgres/data backup -b full -
s -S /pg_rman_backup/pg_srvlog -U postgres -d postgres -h
10.0.0.10 -p 5432 --standby-host=10.0.0.11 --standby-
port=5432
2.3 校验备份集
pg_rman validate

2.4 列出备份集
pg_rman show
增量备份
必须要有个对应的全库备份。 当全库备份后需要验证备份集。
3.1 插入一行数据
insert into t1 values (2);
pg_rman backup --backup-mode incremental --progress --compress-data
pg_rman --backup-path /pg_rman_backup/fullbackup --pgdata
/postgres/data --arclog-path /pg_rman_backup/walbackup
backup --backup-mode incremental --progress --compress-data
-U postgres -d postgres -h 127.0.0.1 -p 5432
pg_rman -B /pg_rman_backup/fullbackup -D /postgres/data -A
/pg_rman_backup/walbackup backup --backup-mode incremental -
-progress --compress-data -U postgres -d postgres -h
10.0.0.10 -p 5432 --standby-host=10.0.0.11 --standby-
port=5432
3.3 校验备份集
pg_rman validate
删除备份
4.1 强制删除比规定日期更旧的备份
pg_rman delete -f '2022-08-16 20:28:21'
pg_rman purge
4.2 指定备份删除
pg_rman delete '2022-08-16 20:28:21'
pg_rman purge
数据恢复
5.1 全量备份的恢复
1)删除数据库数据
drop database test;
2)停止数据库
pg_ctl stop
3)进行数据恢复:(EndTime)
pg_rman restore -B /pg_rman_backup/fullbackup/ --recovery-target-time "2022-08-16 20:14:58" --hard-copy
4)查看数据

提示:
--如果不指定recovery-target-time,则恢复到最新时间。 --如果不指定hard-copy,则归档日志目录里的归档日志是使用的硬连接指向备份目录中的归档日志,加了这个参数的话,则是直接把备份目录中的归档日志拷贝到归档日志目录。
5.2 增量备份的恢复
1)删除数据库数据
drop database test;
2)停止数据库
pg_ctl stop
3)进行数据恢复:(EndTime)
pg_rman restore -B /pg_rman_backup/fullbackup/ --recovery-target-time "2022-08-16 20:15:01" --hard-copy
4)查看数据

备份策略演练
说明:
以上我们演练了全量增量的备份,以及全量增量的恢复,除次之外pg_rman还可以指定备份的策略进行备份,例如备份以及归档备份的备份冗余度,备份以及归档备份保留的天数等,以下我们就以备份冗余度保存的份数进行演练:
6.1 修改配置文件
vi pg_rman.ini
KEEP_DATA_GENERATIONS = 3
6.2 进行备份
pg_rman -B /pg_rman_backup/fullbackup -A
/pg_rman_backup/walbackup -D /postgres/data backup -b full -
s -S /pg_rman_backup/pg_srvlog -U postgres -d postgres -h
10.0.0.10 -p 5432 --standby-host=10.0.0.11 --standby-
port=5432
pg_rman validate


