1.简介
pg_rman 是类似于 oracle 的 rman 备份工具,它实现了全量、增量、归档等类型的备份,可以很灵活的管理 PostgreSQL 数据库的备份。pg_rman 是一款开源的 PostgreSQL 的备份恢复插件,支持在线备份和基于 PITR 的恢复方式。
2.pg_rman特点
使用简单,一个命令即可完成备份和恢复.
支持在线全备,增量备份,归档备份.
支持备份压缩,通过 gzip 工具实现页内压缩.
自动备份维护,自动删除过期的 WAL 备份文件.
支持备份验证.
恢复期间无事务丢失,支持基于 PITR 的恢复
pg_rman 注意事项:
pg_rman 基于 pg_start_backup,copy,pg_stop_backup()的备份模式,因为是文
件拷贝模式,而不是流复制协议,所以 pg_rman 必须在数据库节点上运行。
pg_rman 需要在本地安装,不能远程备份
pg_rman 需要下载对应的版本
3.pg_rman命令选项
命令选项: -D, --pgdata=PATH # 数据目录
-A, --arclog-path=PATH # 归档 wal 目录 -S, --srvlog-path=PATH # 数据库服务器日志路径 -B, --backup-path=PATH # 备份目录 -c, --check # 检查 -v, --verbose # 显示详细消息 -P, --progress # 显示处理进度
备份选项: -b, --backup-mode=MODE # 备份模式:全备,增备,归档 -s, --with-serverlog # 备份服务器日志文件 -Z, --compress-data # 使用 zlib 压缩数据备份 -C, --smooth-checkpoint # 在备份前做平滑检查点 -F, --full-backup-on-error # 切换到完全备份模式,注意:此选项仅用于--backupmode = incremental 或 archive --keep-data-generations=2 # 保留 2 份全备 --keep-data-days=15 # 备份保留 15 天 --keep-arclog-files=NUM # 保留 NUM 个归档日志 --keep-arclog-days=DAY # 归档 WAL 保留多久 --keep-srvlog-files=NUM # 保留 NUM 个服务器日志 --keep-srvlog-days=DAY # 服务器日志保留多久 --standby-host=HOSTNAME # 指定备库 IP
--standby-port=PORT # 指定备库端口
还原选项:
--recovery-target-time # 恢复到指定时间戳
--recovery-target-xid # 恢复到指定事务 ID
--recovery-target-inclusive # 是否包含恢复目标
--recovery-target-timeline # 恢复到特定的时间线
--hard-copy # 复制 archivelog 而不是符号链接
目录选项: -a # 显示已删除的备份
删除选项: -f # 强制删除比规定日期更旧的备份
连接选项: -d, --dbname=DBNAME # 连接指定库 -h, --host=HOSTNAME # 数据库主机名/IP 地址 -p, --port=PORT # 数据库端口 -U, --username=USERNAME # 数据库用户名 -w, --no-password # 不提示密码-W, --password # 强制密码提示
通用选项:
-q, --quiet # 不显示任何 INFO 或者 DEBUG 信息。
--debug # 查看 debug 信息。
4.安装pg_rman
软件下载: https://github.com/ossc-db/pg_rman
文档地址: http://ossc-db.github.io/pg_rman/index.html
源码安装:
wget -c https://github.com/ossc-db/pg_rman/archive/refs/heads/master.zip
cd pg_rman
export PATH=/usr/local/pgsql/bin:$PATH
make
make install
pg_rman 会默认安装在/usr/local/pgsql/bin/目录下
[root@pghost ~]# which pg_rman
/usr/local/pgsql/bin/pg_rman
RPM安装
wget -c https://github.com/osscdb/pg_rman/releases/download/V1.3.15/pg_rman-1.3.15-1.pg14.rhel8.x86_64.rpm wget -c https://github.com/osscdb/pg_rman/releases/download/V1.3.15/pg_rman-debuginfo-1.3.15-1.pg14.rhel8.x86_64.rpm yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum makecache
yum -y install pg_rman-1.3.15-1.pg14.rhel8.x86_64.rpm
yum -y install pg_rman-debuginfo-1.3.15-1.pg14.rhel8.x86_64.rpmvi /etc/profile
export PATH=/usr/pgsql-14/bin:$PATH
source /etc/profile
配置环境变量
su - postgres
vi .bashrc
export BACKUP_PATH=/home/postgres/backups
export ARCLOG_PATH=/home/postgres/archives
export SRVLOG_PATH=/home/postgres/pgdata/log
--让环境变量生效
source .bashrc
配置pg_rman
1.开启数据库归档模式
mkdir /home/postgres/backups
mkdir /home/postgres/archives
vi postgresql.conf
archive_mode = on
archive_command = 'cp %p /home/postgres/archives/%f'
pg_ctl restart
注意:如果不开启归档模式在初始化备份目录的时候会出现下面的警告信息。
pg_rman init --backup-path=/home/postgres/backups
WARNING: ARCLOG_PATH is not set yet
DETAIL: The archive_command is not set in postgresql.conf.
HINT: Please set ARCLOG_PATH in pg_rman.ini or environmental variable.
INFO: SRVLOG_PATH is set to '/home/postgres/pgdata/log'
2.初始化备份目录
初始化一个 backup catalog,目录将用于存放备份的文件,也会存放一些元数据,例如备份的配置文件,数据库的 systemid,时间线文件历史。注意:备份目录不要放在数据目录下,否则每备份都会将之前的备份再备份一遍,从而导致备份文件异常增大
[postgres@pghost ~]$ pg_rman init --backup-path=/home/postgres/backups
INFO: ARCLOG_PATH is set to '/home/postgres/archives'
INFO: SRVLOG_PATH is set to '/home/postgres/pgdata/log'
[postgres@pghost backups]$ ll
总用量 8
drwx------. 4 postgres postgres 34 3 月 19 16:36 backup
-rw-rw-r--. 1 postgres postgres 74 3 月 19 16:36 pg_rman.ini
-rw-rw-r--. 1 postgres postgres 40 3 月 19 16:36 system_identifier
drwx------. 2 postgres postgres 6 3 月 19 16:36 timeline_history
在 catalog 中有 pg_rman.ini 文件,可配置备份的环境变量、备份选项、备份集保留期限
等信息。
[postgres@pghost backups]$ cat pg_rman.ini
ARCLOG_PATH='/home/postgres/archives' --归档目录
SRVLOG_PATH='/home/postgres/pgdata/log' --数据库错误日志目录
COMPRESS_DATA = YES --压缩数据
KEEP_ARCLOG_FILES = 10 --保存归档文件个数
KEEP_ARCLOG_DAYS = 15 --保存归档的天数
KEEP_DATA_GENERATIONS = 2 --备份冗余度
KEEP_DATA_DAYS = 15 --保存备份集时间
KEEP_SRVLOG_FILES = 10 --保存日志文件个数
KEEP_SRVLOG_DAYS = 15 --保存日志文件天数
5.pg_rman备份
全量备份
如果没有设置环境变量(BACKUP_PATH),需要手动指明备份路径 --backup
path=/home/postgres/backups
pg_rman backup --backup-mode=full --全量备份
pg_rman show --查看备份集的状态
pg_rman show detail --显示更多详细信息
pg_rman show '2023-03-20 10:00:00' --指定日期可以查看备份的详细信息
pg_rman validate --校验备份集的有效性
未校验备份集 Status 显示为 DONE,校验后变为 OK注意:每次备份的时候会创建一个当天日期的目录,然后目录下面创建一个与当前时间一致的目录。在做备份操作时,建议使用参数 -C, 备份前做检查点 -Z, 使用 zlib 压缩数据备份
增量备份
仅备份上次验证备份后修改的文件或页面。
pg_rman backup --backup-mode=incremental --with-serverlog
--with-serverlog 表示将数据库日志文件一起备份
注意: 创建增量备份之前必须先创建一个全量备份。
pg_rman show
pg_rman validate
归档备份
仅备份存档 WAL 文件
pg_rman backup --backup-mode=archive
6.备份管理
按指定时间从 catalog 删除备份集例如只需要备份集能恢复到 2023-03-19 16:46:58,在这个时间点以前,不需要用来恢复到这个时间点的备份全删掉。但是会保留一次全备份。加上-f 会强制删除
[postgres@pghost ~]$ pg_rman delete 2023-03-19 16:46:58
WARNING: using force option will make some of the remaining backups unusable
DETAIL: Any remaining incremental backups that are older than the oldest
available full backup cannot be restored.
INFO: delete the backup with start time: "2023-03-19 16:46:58"
[postgres@pghost ~]$ pg_rman show
=====================================================
================ StartTime EndTime Mode Size TLI Status
=====================================================
================
注意: 删除增量备份的同时,也会把全量备份给删除了。
清除备份集(删除已删除的备份)
虽然 delete 命令从文件系统中删除了实际数据,但是仍然有一些已删除备份的目录信息,
需要执行 purge 命令来删除。
pg_rman show -a
pg_rman purge
pg_rman show -a
备份集校验(建议在备份后尽快验证备份文件。未验证的备份不能用于还原或增量备份)备份成功后,其状态是 done,还需要进行 validate 操作后,备份集才可用于恢复,增量备份才会用于做对比。pg_rman validate
7.定时备份
在生产环境中,需制定备份策略,通常每周全备,每天增量,同时备份归档日志
# 设置备份任务
crontab -e
#分 时 日 月 星期 命令/脚本
00 22 * * 0 pg_rman backup --backup-mode=full
00 22 * * 1-6 pg_rman backup --backup-mode=incremental
7.pg_rman恢复
pg_rman 恢复默认原地恢复(覆盖式),或者使用新的$PGDATA 作为恢复目标。建议不要删除原始数据库,因为 pg_rman 必须从中检查时间轴 ID 或数据校验和状态。Restore 命令将保存未归档的事务日志并删除所有数据库文件。1、recovery-target-timeline TIMELINE如果不指定时间线,则使用$PGDATA/global/pg_control,如果没有$PGDATA/global/pg_control,则使用最新的全量备份集的时间线。2、recovery-target-time TIMESTAMP如果不指定,则恢复到最新时间3、recovery-target-xid XID如果不指定,则恢复到最新 xid4、recovery-target-inclusive是否在指定的恢复目标(true)之后停止,默认为 true,如果指定 false 意识是在恢复目标之前停止–hard-copy在做恢复操作时,建议使用此参数如果不指定 hard-copy,则归档日志目录里的归档日志是使用的硬连接指向备份目录中的归档日志,加了这个参数的话,则是直接把备份目录中的归档日志拷贝到归档日志目录。恢复数据库先停用数据库服务,然后删除数据库文件
必须要先停止 postgresql 不然会报错 ERROR: PostgreSQL server is running
pg_ctl stop
rm -rf $PGDATA/*
pg_rman restore --全量恢复
pg_rman restore --recovery-target-time='2022-11-29 15:47:42' --恢复到指定时间点
恢复之后,重启数据库:会出现以下内容:此时数据库进入只读状态。需要执行以下命令才能继续select pg_wal_replay_resume();注意:在基于时间点恢复之后,那么此时 DB 与之前的备份已经不在同一时间线上。恢复默认只沿着基础备份建立时时间线恢复而不会切换到新的时间线,所以建议在恢复之后,立即对数据库做一个全库的备份。
保留策略:
清除归档
清除指定归档之前的归档日志:
pg_archivecleanup /home/postgres/archive 000000010000000000000003
也可以在 postgresql.conf 文件中添加自动清除归档的命令:
archive_cleanup_command = 'pg_archivecleanup /home/postgres/archives %r'
修改备份策略
[postgres@pghost backups]$ vi pg_rman.ini
KEEP_DATA_GENERATIONS=2
KEEP_DATA_DAYS=15
KEEP_ARCLOG_DAYS=15
KEEP_SRVLOG_DAYS=30
参数说明:
KEEP_DATA_GENERATIONS=2,保留 2 份以前全备数量,加上正在执行的全备,实际上
有 3 份全备
KEEP_DATA_DAYS=15,数据保留 15 天
KEEP_ARCLOG_DAYS=15,WAL 日志保留 15 天
KEEP_SRVLOG_DAYS=30,LOG 日志保留 30 天数