pgBackRest是一个可靠、高效、功能丰富的PostgreSQL备份和恢复工具,架构如下图所示:
支持如下功能:
1、开源备份工具,使用此工具不涉及许可或额外费用。
2、支持并行备份,可以将压缩文件流式传输到本地或远程存储库或云。
3、支持增量和差异备份。
4、将备份流式传输到云 - 支持 AWS、Azure 和 GCS 兼容对象存储。
5、支持加密。存储库可以由 pgBackRest 加密以保护备份。
6、不需要本地暂存区将备份流式传输到远程存储或云。可以直接将备份流式传输到云或远程存储库,而无需在本地写入任何文件。
7、在 PostgreSQL 中支持数百万或数十亿的对象。
8、用于还原和恢复的简单命令,包括时间点恢复。为 PITR 手动拉取某个 WAL 段时不需要手动干预。
9、用作企业备份工具的目的,该工具可以作为统一解决方案,从单个备份服务器跨基础架构维护所有PostgreSQL 数据库的备份。
10、支持从已使用流式复制配置的备用服务器(或只读副本)进行备份。
11、能够利用多台备用服务器的计算能力进行备份。
12、支持根据配置自动保留备份和存档。
13、支持并行异步归档以提高归档速度。
14、支持备份具有数千个表空间的 Postgres 数据库。
一、部署安装
使用源码编译安装。
源码下载地址:https://github.com/pgbackrest/pgbackrest
1、安装依赖软件包
yum install tar make gcc libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libyaml
#如果是独立部署pgBackRest还需安装 postgresql-libs
2、编译安装
tar -xvf pgbackrest-release-2.50.tar.gz
cd pgbackrest-release-2.50
./configure
make && make install #默认安装到/usr/local/bin目录下(或者configure时指定--prefix选项)
#查看安装版本
pgbackrest version
#查看命令帮助
pgbackrest help
pgbackrest help backup
3、初始化配置
使用pgbackrest进行备份恢复前需要进行相关的配置操作。
创建 pgbackrest 操作系统用户
该操作系统用户必须有权对存储库目录执行读取和写入操作,也可直接使用postgres用户。
groupadd pgbackrest
useradd -r -g pgbackrest pgbackrest
mkdir -p home/pgbackrest
chown pgbackrest:pgbackrest home/pgbackrest
创建配置日志目录
mkdir -p /var/log/pgbackrest
chmod 770 /var/log/pgbackrest
chown -R postgres.postgres /var/log/pgbackrest
创建仓库路径
mkdir -p /var/lib/pgbackrest
chmod 750 /var/lib/pgbackrest
chown -R postgres.postgres /var/lib/pgbackrest
创建配置目录和文件
mkdir -p /etc/pgbackrest/conf.d
touch /etc/pgbackrest/pgbackrest.conf
chmod 640 /etc/pgbackrest/pgbackrest.conf
chown -R postgres:postgres /etc/pgbackrest
生成备份所需密码
openssl rand -base64 48
LB0yunqL+U2JevbEqSkLn5NU1Xe/OryaBpl5S1dQ8ts38zgSr8NwRL3SULmDGvGu
修改配置文件
vi /etc/pgbackrest/pgbackrest.conf
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
#repo1-cipher-pass=LB0yunqL+U2JevbEqSkLn5NU1Xe/OryaBpl5S1dQ8ts38zgSr8NwRL3SULmDGvGu
#repo1-cipher-type=aes-256-cbc
#start-fast=y
#process-max=3
#backup-user=postgres
#log-path=/var/log/pgbackrest
[global:archive-push]
compress-level=3
[mypgdb]
pg1-path=/data/pgdata
pg1-port=5432
pg1-socket-path=/tmp
数据库配置项修改
su - postgres
vi postgresql.conf
listen_addresses = '*'
wal_level = replica
max_wal_senders = 3
archive_mode = on
archive_command = 'pgbackrest --stanza=mypgdb archive-push %p'
logging_collector = on
log_rotation_size = 50MB
log_rotation_age = 1d
log_truncate_on_rotation = on
#创建.pgpass文件,
su - postgres
vi .pgpass
localhost:5432:postgres:postgres:postgres #或者(指定端口所有数据库) localhost:5432:*:postgres:postgres
127.0.0.1:5432:postgres:postgres:postgres #或者(指定端口所有数据库) 127.0.0.1:5432:*:postgres:postgres
chmod 0600 .pgpass
设置环境变量
vi .bashrc
export PGPASSFILE=~/.pgpass
#配置生效
source ./.bashrc
#配置pg动态库链接
ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib64/libpq.so.5
重启数据库实例
pg_ctl -D $PGDATA restart
二、示例参考
PGDATA=/data/pgdata
前提条件:
1、创建归档和备份目录
mkdir /data/pgarchive /data/pgbackup
chown -R postgres.postgres /data/pgarchive /data/pgbackup
2、开启归档模式
vi postgresql.conf
wal_level = 'replica'
archive_mode = 'on'
3、创建复制权限用户
创建replication权限的角色, 或者超级用户的角色。
create role repuser nosuperuser replication login connection limit 5 encrypted password 'repuser';
4、创建节(初始化stanza)
pgbackrest --stanza=mypgdb --log-level-console=info stanza-create
执行初始化后,在仓库目录下创建如下目录:
tree -L 2 /var/lib/pgbackrest
5、检查配置(测试archive 命令)
pgbackrest --stanza=mypgdb --log-level-console=info check
#这将强制PostgreSQL服务器切换WAL段并使用archive_command归档该WAL段。
示例-1、全量备份恢复
--type=full 全量备份。
--type=incr 增量备份仅备份自上次备份(全量、增量、差异)以来的更改。
--type=diff 差异备份备份自上次全量备份以来的所有更改。
--exclude 排除某个目录或文件,例如排除log日志目录 --exclude=log/
https://pgbackrest.org/user-guide-rhel.html#backup
https://pgbackrest.org/user-guide-rhel.html#restore
全量备份恢复步骤如下:
创建测试数据
create database testdb;
\c testdb;
create table t1(id serial primary key, name varchar(30), create_time timestamp default now());
insert into t1(name) select '用户-' || n from generate_series(1,10000) n;
执行全量备份
pgbackrest --stanza=mypgdb --log-level-console=info backup --type=full --start-fast --compress --process-max=4
# --start-fast :触发快速检查点,而不是等到下一个定时检查点。
# --compress :启用压缩备份。默认情况下压缩是打开的。
# --process-max :可以启动备份以加快备份速度的并发进程数。
查看备份信息
pgbackrest info --stanza=mypgdb
执行全量恢复
停止数据库、删除数据目录文件
pg_ctl stop
rm -rf $PGDATA/*
pgbackrest --stanza=mypgdb --log-level-console=info restore --type=default
验证恢复数据
select pg_wal_replay_resume();
示例-2、增量备份恢复
执行增量备份恢复步骤如下:
新增测试数据
insert into t1(name) select '增量备份恢复-' || n from generate_series(1,5) n;
select * from t1 where id > 10000;
insert into t1(name) select '增量备份-' || n from generate_series(1,5) n;
select * from t1 where id > 10000;
执行增量备份
pgbackrest --stanza=mypgdb --log-level-console=info backup --type=incr
pgbackrest --stanza=mypgdb --log-level-console=info backup --type=incr
查看备份信息
pgbackrest info
pgbackrest info
执行增量恢复
恢复到第一个增量备份集 20240207-143144F_20240207-145858I
停止数据库、删除数据目录文件
pg_ctl stop
rm -rf $PGDATA/*
pgbackrest --stanza=mypgdb --set=20240207-143144F_20240207-145858I --type=immediate --delta restore --log-level-console=info
验证恢复数据
#select pg_is_in_recovery();
#select pg_wal_replay_resume();
\c testdb
select * from t1 where id > 10000;
注:在备份集 20240207-143144F_20240207-145858I 之后的记录没有回复。
示例-3、恢复指定数据库
备份实例包括多个数据库时,也可在恢复的时候仅恢复指定的数据。
新建备份仓库
pgbackrest --stanza=mypgdb stop --log-level-console=info
pgbackrest --stanza=mypgdb --repo=1 stanza-delete --log-level-console=info
pgbackrest --stanza=mypgdb stanza-create --log-level-console=info
创建测试数据(testdb1,testdb2)
create database testdb1;
create database testdb2;
\c testdb1;
create table t1(id serial primary key, name varchar(30), create_time timestamp default now());
insert into t1(name) select '用户-' || n from generate_series(1,10000) n;
\c testdb2;
create table t1(id serial primary key, name varchar(30), create_time timestamp default now());
insert into t1(name) select '用户-' || n from generate_series(1,10000) n;
执行全量备份
pgbackrest --stanza=mypgdb --log-level-console=info backup --type=full --start-fast
查看备份集信息
pgbackrest info
删除数据库
drop database testdb1;
drop database testdb2;
停止数据库服务
pg_ctl stop
恢复指定数据库(testdb1)
pgbackrest --stanza=mypgdb --delta --db-include=testdb1 --type=immediate --target-action=promote restore --log-level-console=info
验证恢复数据
注:如上图所示testdb2数据库没有恢复,仅恢复了数据库testdb1
示例-4、恢复到指定时间点
恢复到指定时间点验证如下:
#创建测试数据
\c testdb1
insert into t1(name) select '恢复到指定时间点-' || n from generate_series(1,5) n;
select * from t1 where id > 10000;
记录恢复时间点
#select current_timestamp;
select now(); #2024-02-07 17:33:51.991182+08
再插入5条测试记录
insert into t1(name) select '指定时间点后记录-' || n from generate_series(1,5) n;
select * from t1 where id > 10000;
select pg_switch_wal();
checkpoint;
执行增量备份
pgbackrest --stanza=mypgdb backup --type=incr --log-level-console=info
查看备份集信息
pgbackrest --stanza=mypgdb info --log-level-console=info
恢复到指定时间点
pg_ctl stop -D /data/pgdata
pgbackrest --stanza=mypgdb --delta --type=time --target="2024-02-07 17:33:51.991182+08" --target-action=promote restore --log-level-console=info
验证恢复数据
\c testdb1;
select * from t1 where t1 where id > 10000;
注:如上图所示,数据仅恢复到了指定时间点记录,之后新增记录没有回复。
示例-5、恢复到指定LSN点
恢复到指定LSN点验证如下:
#创建测试数据
\c testdb2
insert into t1(name) select '恢复到指定LSN点-' || n from generate_series(1,5) n;
select * from t1 where id > 10000;
记录恢复LSN点
select pg_current_wal_lsn(); #0/1E009540
再插入5条测试记录
insert into t1(name) select '指定LSN点后记录-' || n from generate_series(1,5) n;
select * from t1 where id > 10000;
select pg_switch_wal();
checkpoint;
执行增量备份
pgbackrest --stanza=mypgdb backup --type=incr --log-level-console=info
查看备份集信息
pgbackrest --stanza=mypgdb info --log-level-console=info
恢复到指定LSN点
pg_ctl stop -D /data/pgdata
pgbackrest --stanza=mypgdb --delta --type=lsn --target="0/1E009540" --target-action=promote restore --log-level-console=info
验证恢复数据
\c testdb2;
select * from t1 where t1 where id > 10000;
注:如上图所示,数据仅恢复到了指定LSN点记录,之后新增记录没有回复。




