1.pgBackRest 介绍

pgBackRest是一款开源的备份还原工具,目标旨在为备份和还原提供可靠易用的备份。

pgBackRest旨在成为一个可靠、易于使用的备份和恢复解决方案,通过利用针对数据库特定要求优化的算法,可以无缝扩展到最大的数据库和工作负载。
pgBackRest 放弃了其他传统备份工具依赖 tar 和 rsync 的套路,它的备份功能都是从软件内部实现的,并采用客户端协议与远程服务器交互。**移除了对 tar 和 rsync 的依赖**,使它能够更好的应对针对特定数据库的备份挑战。客户端远程协议更加灵活,协议可以按照要求限制连接类型以保证备份过程更安全。

• pgBackRest 功能支持:
○ 支持并行备份和恢复 ,解决了压缩操作中的瓶颈
○ 支持本地或远程操作, 需配置TLS/SSH 在本地或远程备份、恢复和存档
○ 支持完整、增量和差异备份,增量恢复
○ 支持多个存储库
○ 支持备份轮换和存档过期, 备份完整性检查,页面校验
○ 支持断点备份
○ 支持并行、异步 WAL 推送和获取
○ 支持表空间和链接支持
○ 支持加密
○ **S3、Azure 和 GCS 兼容的对象存储支持**

• pgBackRest 注意事项:
○ 需要在数据库服务器上修改参数 如 archive_command = 'pgbackrest --stanza=demo archive-push %p'
○ 数据库服务器 和 备份服务器,都需要安装,且要求相同版本 。
○ 数据库的page 大小只能是8k,但默认pg是16k ; show block_size 查看数据库的page size
而block_size 只能在编译的设置 --with-blocksize=8,16,32

2.安装使用

2.1 安装

# 安装依赖包: 
yum -y install libyaml-devel
yum -y install bzip2*

#下载:
https://github.com/pgbackrest/pgbackrest/tree/release/2.37

# (数据库服务器 和 备份服务器 都要安装)
# 创建相应目录指定为 /usr/bin/pgbackrest
mkdir /usr/bin/pgbackrest
chown postgres.postgres /usr/bin/pgbackrest/
chmod 755 /usr/bin/pgbackrest/

mkdir -p /etc/pgbackrest/conf.d
touch /etc/pgbackrest/pgbackrest.conf
chmod 640 /etc/pgbackrest/pgbackrest.conf
chown postgres.postgres -R /etc/pgbackrest/
mkdir -p -m 770 /var/log/pgbackrest
chown postgres.postgres /var/log/pgbackrest/

#解压安装
postgres@s2ahumysqlpg01-> unzip pgbackrest-release-2.37
postgres@s2ahumysqlpg01-> cd pgbackrest-release-2.37/src
postgres@s2ahumysqlpg01-> ./configure --prefix=/usr/bin/pgbackrest/
postgres@s2ahumysqlpg01-> make -j24
postgres@s2ahumysqlpg01-> make install -j24
install -d /usr/bin/pgbackrest/bin
install -m 755 pgbackrest /usr/bin/pgbackrest/bin



# 注意: 默认安装路径为 /usr/bin/pgbackrest ,如果不是的话,做一个软连接 否会会找不到远端的执行命令
如: unexpectedly [127]: bash: pgbackrest: command not found
ln -s /home/postgres/pgbackrest/bin/pgbackrest /usr/bin/pgbackrest

# 设置环境变更
cd \
echo "export PATH=/usr/bin/pgbackrest/bin:\$PATH" >> .bashrc
. .bashrc


# 查看命令
cd /usr/bin/pgbackrest/bin
postgres@s2ahumysqlpg01-> ./pgbackrest
pgBackRest 2.37 - General help

Usage:
pgbackrest [options] [command]

Commands:
archive-get Get a WAL segment from the archive.
archive-push Push a WAL segment to the archive.
backup Backup a database cluster.
check Check the configuration.
expire Expire backups that exceed retention.
help Get help.
info Retrieve information about backups.
repo-get Get a file from a repository.
repo-ls List files in a repository.
restore Restore a database cluster.
server pgBackRest server.
server-ping Ping pgBackRest server.
stanza-create Create the required stanza data.
stanza-delete Delete a stanza.
stanza-upgrade Upgrade a stanza.
start Allow pgBackRest processes to run.
stop Stop pgBackRest processes from running.
version Get version.

Use 'pgbackrest help [command]' for more information.

2.2 互信配置

#备份服务器 为 s2ahumysqlpg01 ,  数据库服务器为s2ahumysqlpg02
# 备份服务器
ssh-keygen -t rsa
ssh-copy-id s2ahumysqlpg02

# 数据库服务器
ssh-keygen -t rsa
ssh-copy-id s2ahumysqlpg01

3.配置pgbackrest

3.1 pgbackrest.conf

pgBackRest可以完全与命令行参数一起使用,但配置文件对于复杂或设置很多选项的安装更实用。配置文件的默认位置是/etc/pgbackrest/pgbackrest.conf。如果该位置不存在文件,则将检查 /etc/pgbackrest.conf的旧默认值。

3.1.1 数据库服务器上的配置

vi /etc/pgbackrest/pgbackrest.conf
[global]
log-level-file=detail
repo1-host=s2ahumysqlpg01
log-path=/u01/postgresql/backup/log

[pg12]
pg1-path=/u01/postgresql/data

# 设置数据库参数
vi postgresql.auto.conf
archive_command = 'pgbackrest --stanza=pg02 archive-push %p'
archive_mode = on
listen_addresses = '*'
log_line_prefix = ''
max_wal_senders = 3
wal_level = replica

# 重启数据库
pg_ctl restart

3.1.2备份服务器上的配置

# 示例
vi /etc/pgbackrest/pgbackrest.conf
[global]
repo1-path=/u01/postgresql/backup/repos
repo1-retention-full=2
log-path=/home/postgres/pgbackrest/log

[global:archive_push]
compress-level=3

[pg01]
pg1-path=/u01/postgresql/data_bak/

[pg02]
pg1-path=/u01/postgresql/data/
pg1-host-config-path=/etc/pgbackrest
pg1-host-port=22
pg1-host-user=postgres
pg1-host=s2ahumysqlpg02
pg1-port=5432
pg1-user=postgres

#备注:
repo1-path 指定 备份和归档仓库路径
compress-level 指定压缩级别 bz2 - 9 ; gz - 6 ; lz4 - 1 ; zst - 3

3.2 创建存储空间

#本地节点
pgbackrest --stanza=pg01 --log-level-console=info stanza-create

#远程节点
pgbackrest --stanza=pg02 --log-level-console=info stanza-create


#检查
postgres pgbackrest --stanza=pg01 --log-level-console=info check
postgres pgbackrest --stanza=pg01 --log-level-console=info check

4.备份

4.1全量备份

# 全量备份
pgbackrest --stanza=pg02 --log-level-console=info backup

#输出类似以下信息:#
P00 INFO: backup command begin 2.37: --exec-id=1041-336b8131 --log-level-console=info --log-level-stderr=off --no-log-timestamp --pg1-path=/var/lib/pgsql/10/data --repo1-cipher-pass= --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=demo --start-fast
P00 WARN: no prior backup exists, incr backup has been changed to full
P00 INFO: execute non-exclusive pg_start_backup(): backup begins after the requested immediate checkpoint completes
P00 INFO: backup start archive = 000000010000000000000002, lsn = 0/2000028
[filtered 3 lines of output]
P00 INFO: check archive for segment(s) 000000010000000000000002:000000010000000000000003
P00 INFO: new backup label = 20211231-194304F
P00 INFO: full backup size = 22.5MB, file total = 949
P00 INFO: backup command end: completed successfully
P00 INFO: expire command begin 2.37: --exec-id=1041-336b8131 --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo1-cipher-pass= --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=demo

4.2差异备份

pgbackrest --stanza=pg02  --type=diff   --log-level-console=info backup

#输出类似以下信息:
[filtered 7 lines of output]
P00 INFO: check archive for segment(s) 000000010000000000000004:000000010000000000000005
P00 INFO: new backup label = 20211231-194304F_20211231-194310D
P00 INFO: diff backup size = 8.8KB, file total = 949
P00 INFO: backup command end: completed successfully
P00 INFO: expire command begin 2.37: --exec-id=1096-e5efad67 --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo1-cipher-pass= --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=demo

4.3定时备份

# 设置备份任务
crontab -e
30 06 * * 0 pgbackrest --type=full --stanza=demo backup
30 06 * * 1-6 pgbackrest --type=diff --stanza=demo backup

4.4 查看备份信息

# 查看备份信息
pgbackrest info

#输出类似以下信息:
stanza: demo
status: ok
cipher: aes-256-cbc

db (current)
wal archive min/max (10): 000000010000000000000001/000000010000000000000005
full backup: 20211231-194304F
timestamp start/stop: 2021-12-31 19:43:04 / 2021-12-31 19:43:08
wal start/stop: 000000010000000000000002 / 000000010000000000000003
database size: 22.5MB, database backup size: 22.5MB
repo1: backup set size: 2.7MB, backup size: 2.7MB
diff backup: 20211231-194304F_20211231-194310D
timestamp start/stop: 2021-12-31 19:43:10 / 2021-12-31 19:43:12
wal start/stop: 000000010000000000000004 / 000000010000000000000005
database size: 22.5MB, database backup size: 8.8KB
repo1: backup set size: 2.7MB, backup size: 752B
backup reference list: 20211231-194304F

5.恢复

pgbackrest --stanza=pg02  restore

6.备份监控

PostgreSQL 将通过COPY命令允许 pgBackRest信息加载到表中。以下示例将该逻辑包装在可用于执行实时查询的函数中。
# 1.创建函数
psql -f /home/postgres/pgbackrest-release-2.37/doc/example/pgsql-pgbackrest-info.sql
# 2. 执行查询
psql -f /home/postgres/pgbackrest-release-2.37/doc/example/pgsql-pgbackrest-query.sql
name | last_successful_backup | last_archived_wal
--------+------------------------+--------------------------
"demo" | 2021-12-31 19:43:12+00 | 000000010000000000000005

参考

https://github.com/pgbackrest/pgbackrest 
https://pgbackrest.org/
https://gitee.com/mirrors/PgBackRest
https://mp.weixin.qq.com/s/CQAKe_BA6_3P1utoXghVPw