基本背景:
这里作一下搬运工,直接拿出结论,尽量少走弯路。
基本实验环境:
DB: PostgreSQL 14.7
pgbackrest:pgBackRest2.46
OS: Redhat ELS 8.8, CentOS 7.9
如果只是想直接实验操作及验证,可以跳到第6节和第7节查看。
也不是说,上边的这些工具,你只要掌握了pgBackRest和pg_probackup两个就足够了。甚至只需要掌握pgBackRest就可以了。
1. pgbackrest
参考:http://v0.pigsty.cc/zh/blog/2018/02/07/pgbackrest2%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3/
pgBackRest主页:http://pgbackrest.org
手册:https://pgbackrest.org/user-guide-rhel.html#introduction
pgBackRest Github主页:https://github.com/pgbackrest/pgbackrest
(Reliable PostgreSQL Backup & Restore)
前言
pgBackRest旨在提供一个简单可靠,容易纵向扩展的PostgreSQL备份恢复系统。pgBackRest并不依赖像tar和rsync这样的传统备份工具,而是通过在内部实现所有备份功能,并使用自定义协议来与远程系统进行通信。 消除对tar和rsync的依赖可以更好地解决特定于数据库的备份问题。 自定义远程协议提供了更多的灵活性,并限制执行备份所需的连接类型,从而提高安全性。
我们能看到截至目前最新版本是:https://github.com/pgbackrest/pgbackrest/releases/tag/release%2F2.46 (2.46: 2023.5.22)
特性
并行备份和恢复
压缩通常是备份操作中的瓶颈,因此pgBackRest通过并行处理和更有效的压缩算法(如lz4和zstd)解决了这个问题。
本地或远程操作
自定义协议允许pgBackRest通过TLS/SSH进行本地或远程备份、恢复和归档,配置最少。通过协议层还提供了查询PostgreSQL的接口,因此不需要远程访问PostgreSQL,从而增强了安全性。
多个存储库
例如,多个存储库允许本地存储库保留最少的时间用于快速恢复,远程存储库保留较长的时间用于冗余和跨企业的访问。
完整、增量和差异备份
支持完整备份、差异备份和增量备份。
pgBackRest不受rsync的时间解决问题的影响,使差异和增量备份变得安全,而不需要对每个文件校验和。
备份轮换和存档过期
可以为完整备份和差异备份设置保留策略,以创建任何时间范围的覆盖。可以为所有备份维护WAL存档,也可以只维护最近的备份。在后一种情况下,使旧备份保持一致所需的WAL将在存档中维护。
备份的完整性
为备份中的每个文件计算校验和,并在恢复或验证期间重新检查。备份完成文件复制后,它将等待,直到使备份一致性所需的每个WAL段到达存储库。
存储库中的备份可以以与标准PostgreSQL集群(包括表空间)相同的格式存储。如果禁用压缩并且启用硬链接,则可以在存储库中对备份进行快照,并直接在快照上启动PostgreSQL集群。这对于以传统方式恢复需要花费大量时间的tb级数据库是有利的。
所有操作都使用文件和目录级别的fsync来确保持久性。
页面校验和
PostgreSQL从9.3开始支持页面级校验和。如果启用了页面校验和,pgBackRest将验证在备份期间复制的每个文件的校验和。在完全备份期间验证所有页校验和,在差异备份和增量备份期间验证已更改文件中的校验和。
验证失败不会停止备份过程,但是会将包含验证失败页面详细信息的警告输出到控制台和文件日志。
此功能允许在包含有效数据副本的备份过期之前及早检测到页级损坏。
备份恢复
中断的备份可以从它停止的位置恢复。将已复制的文件与清单中的校验和进行比较,以确保完整性。由于此操作可以完全在存储库主机上进行,因此它减少了PostgreSQL主机的负载并节省了时间,因为校验和计算比压缩和重传数据更快。
流式压缩和校验和
当文件被复制到存储库时,压缩和校验和计算在流中执行,无论存储库位于本地还是远程。
如果存储库位于存储库主机上,则在PostgreSQL主机上执行压缩,文件以压缩格式传输,并简单地存储在存储库主机上。当禁用压缩时,将使用较低级别的压缩来有效地利用可用带宽,同时将CPU成本保持在最低水平。
差异恢复
清单包含备份中每个文件的校验和,因此在恢复期间可以使用这些校验和来大大加快处理速度。在增量恢复中,首先删除备份中不存在的任何文件,然后为剩余文件生成校验和。与备份匹配的文件保留在适当的位置,其余的文件像往常一样恢复。并行处理可以大大减少恢复时间。
并行,异步WAL Push & Get
包含专用命令,用于将WAL推送到存档和从存档中获取WAL。这两个命令都支持并行以加速处理和异步运行,从而为PostgreSQL提供最快的响应时间。
WAL push会自动检测多次推送的WAL段,并在段相同时进行重复数据删除,否则会引发错误。异步WAL推送允许将传输卸载到另一个进程,该进程并行压缩WAL段以获得最大吞吐量。对于具有极高写容量的数据库来说,这可能是一个关键特性。
异步WAL get维护一个本地的WAL段队列,这些段被解压缩并准备重播。这减少了向PostgreSQL提供WAL所需的时间,从而最大限度地提高了重放速度。高延迟连接和存储(如S3)受益最大。
push和get命令都通过比较PostgreSQL版本和系统标识符来确保数据库和存储库匹配。这实际上消除了错误配置WAL存档位置的可能性。
表空间和链接支持
完全支持表空间,并且在恢复时可以将表空间重新映射到任何位置。还可以使用一个命令将所有表空间重新映射到一个位置,这对于开发恢复非常有用。
PostgreSQL集群中的任何文件或目录都支持文件和目录链接。在恢复时,可以将所有链接恢复到原始位置,重新映射部分或全部链接,或将部分或所有链接恢复为集群目录中的正常文件或目录。
S3、Azure和GCS兼容对象存储支持
pgBackRest存储库可以位于S3、Azure和GCS兼容的对象存储中,以允许几乎无限的容量和保留。
加密
pgBackRest可以加密存储库,以确保备份存储在任何地方。
兼容10个版本的PostgreSQL
pgBackRest支持10个版本的PostgreSQL, 5个支持的版本和最近5个EOL版本。这为升级到受支持的版本提供了充足的时间。
pgBackRest用户手册
1.简介
本用户指南旨在按顺序从头到尾遵循-每个部分都依赖于最后一部分。例如,还原部分依赖于在快速开始部分中执行的设置。一旦pgBackRest启动并运行,那么可以跳过,但建议第一次按照顺序使用用户指南。
尽管本指南中的示例针对的是RHEL 7-8和PostgreSQL 11,但是将这些示例应用于任何Unix发行版和PostgreSQL版本应该是相当容易的。唯一与操作系统相关的命令是那些创建、启动、停止和删除PostgreSQL集群的命令。pgBackRest命令在任何Unix系统上都是相同的,尽管可执行文件的位置可能不同。虽然pgBackRest努力在不同版本的PostgreSQL中保持一致,但不同版本的PostgreSQL之间存在细微的差异,这些差异可能会在本指南中举例说明,例如PostgreSQL路径/文件名和设置。
PostgreSQL的配置信息和文档可以在PostgreSQL手册中找到。
本用户指南采用了一种比较新颖的方法来编写文档。当从XML源构建文档时,每个命令都在虚拟机上运行。这意味着您可以高度确信命令按照所提供的顺序正确地工作。输出被捕获并在适当的时候显示在命令下面。如果没有包括输出,那是因为它被认为是不相关的,或者被认为是对叙述的分散。
所有命令都是作为具有root和postgres用户的sudo权限的非特权用户运行的。也可以直接以各自用户的身份运行这些命令而不进行修改,在这种情况下,可以剥离sudo命令。
2.概念
以下概念的定义与pgBackRest、PostgreSQL和本用户指南相关。
2.1备份
备份是数据库集群的一致副本,可以对其进行还原,以便从硬件故障中恢复、执行时间点恢复或启动新的备用服务器。
- 全量备份: pgBackRest将整个数据库集群的内容拷贝到备份中。数据库集群的第一次备份始终是完全备份。pgBackRest始终能够直接恢复全量备份。为了保持一致性,完全备份不依赖于完全备份之外的任何文件。
- 差异备份: pgBackRest只复制自上次全量备份以来发生变化的数据库集群文件。pgBackRest通过复制所选差异备份中的所有文件和先前完整备份中适当的未更改文件来恢复差异备份。差异备份的优点是它比完全备份需要更少的磁盘空间,但是,要恢复差异备份,差异备份和完全备份必须都是有效的。
- 增量备份: pgBackRest只复制自上次备份(可以是另一次增量备份、差异备份或完全备份)以来发生变化的数据库集群文件。由于增量备份只包括自上次备份以来更改的文件,因此它们通常比完整备份或差异备份小得多。与差异备份一样,增量备份依赖于其他备份才能有效地恢复增量备份。由于增量备份只包括上次备份以来的那些文件,因此,要执行增量备份的恢复,必须对返回到先前差异备份、先前差异备份和先前完全备份的所有先前增量备份都有效。如果不存在差异备份,则所有先前的增量备份都将返回到先前的完整备份(必须存在),并且完整备份本身必须有效才能恢复增量备份。
2.2恢复
还原是将备份复制到将作为活动数据库集群启动的系统的行为。恢复需要备份文件和一个或多个WAL段才能正常工作。
2.3预写日志(WAL)
WAL是PostgreSQL用来确保没有提交的更改丢失的机制。事务按顺序写入到WAL中,当这些写刷新到磁盘时,就认为事务已提交。之后,后台进程将更改写入主数据库集群文件(也称为堆)。在发生崩溃时,将重放WAL以使数据库保持一致。
WAL在概念上是无限的,但在实践中被分解成单独的16MB文件,称为段。WAL段遵循命名约定0000000100000A1E000000FE,其中前8个十六进制数字表示时间线,后16个数字是逻辑序列号(LSN)。
2.4 加密
加密是将数据转换为除非提供适当的密码(也称为密码短语) 否则无法识别的格式的过程。
pgBackRest将根据用户提供的密码对存储库进行加密,从而防止对存储库中的数据进行未经授权的访问。
3.升级pgBackRest
4.编译pgBackRest
5.安装
5.1 short version
-- 简单安装
# cent-os
sudo yum install -y pgbackrest
# ubuntu
sudo apt-get install libdbd-pg-perl libio-socket-ssl-perl libxml-libxml-perl
示例 :
[23:21:46-postgres@sean-rh1:/var/lib/pgsql/14/data/log]$ sudo yum install -y pgbackrest
Total download size: 388 k
Installed size: 944 k
Downloading packages:
pgbackrest-2.46-2.rhel7.x86_64.rpm | 388 kB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : pgbackrest-2.46-2.rhel7.x86_64 1/1
Verifying : pgbackrest-2.46-2.rhel7.x86_64 1/1
Installed:
pgbackrest.x86_64 0:2.46-2.rhel7
Complete!
5.2 verbose version
创建一个名为db-primary的新主机来包含演示群集并运行pgBackRest示例。 如果已经安装了pgBackRest,最好确保没有安装先前的副本。取决于pgBackRest的版本可能已经安装在几个不同的位置。以下命令将删除所有先前版本的pgBackRest。
- db-primary⇒删除以前的pgBackRest安装
sudo rm -fv /usr/bin/pgbackrest
sudo rm -fv /usr/bin/pg_backrest
sudo rm -rfv /usr/lib/perl5/BackRest
sudo rm -rfv /usr/share/perl5/BackRest
sudo rm -rfv /usr/lib/perl5/pgBackRest
sudo rm -rfv /usr/share/perl5/pgBackRest
pgBackRest是用Perl编写的,默认包含在Debian/Ubuntu中。一些额外的模块也必须安装,但是它们可以作为标准包使用。
- db-primary⇒安装必需的Perl软件包
# cent-os
sudo yum install -y pgbackrest
or
sudo yum reinstall -y pgbackrest
# ubuntu
sudo apt-get install libdbd-pg-perl libio-socket-ssl-perl libxml-libxml-perl
适用于pgBackRest的Debian / Ubuntu软件包位于apt.postgresql.org。如果没有为您的发行版/版本提供,则可以轻松下载源代码并手动安装。
- db-primary⇒下载pgBackRest的2.46版本
sudo wget -q -O- \
https://github.com/pgbackrest/pgbackrest/archive/release/2.46.tar.gz | \
sudo tar zx -C /iihero/source
# or without sudo
wget -q -O - https://github.com/pgbackrest/pgbackrest/archive/release/2.46.tar.gz | tar zx -C /tmp
# 安装build需要的库
sudo yum install make gcc postgresql14-devel openssl-devel \
libxml2-devel lz4-devel libzstd-devel bzip2-devel libyaml-devel libssh2-devel
cd /iihero/source/pgbackrest-release-2.46/src
sudo ./configure && make -j 4 && make install
- db-primary⇒安装pgBackRest
sudo cp -r /iihero/source/pgbackrest-release-2.46/lib/pgBackRest \
/usr/share/perl5
sudo find /usr/share/perl5/pgBackRest -type f -exec chmod 644 {} +
sudo find /usr/share/perl5/pgBackRest -type d -exec chmod 755 {} +
sudo mkdir -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo touch /etc/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest.conf
sudo cp -r /iihero/source/pgbackrest-release-1.46/lib/pgBackRest \
/usr/share/perl5
sudo find /usr/share/perl5/pgBackRest -type f -exec chmod 644 {} +
sudo find /usr/share/perl5/pgBackRest -type d -exec chmod 755 {} +
sudo cp /root/pgbackrest-release-1.46/bin/pgbackrest /usr/bin/pgbackrest
sudo chmod 755 /usr/bin/pgbackrest
sudo mkdir -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo touch /etc/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest.conf
pgBackRest包含一个可选的伴随C库,可以增强性能并启用checksum-page
选项和加密。预构建的软件包通常比手动构建C库更好,但为了完整性,下面给出了所需的步骤。根据分布情况,可能需要一些软件包,这里不一一列举。
- db-primary⇒构建并安装C库
sudo sh -c 'cd /iihero/source/pgbackrest-release-2.46/libc && \
perl Makefile.PL INSTALLMAN1DIR=none INSTALLMAN3DIR=none'
sudo make -C /iihero/source/pgbackrest-release-2.46/libc test
sudo make -C /iihero/source/pgbackrest-release-2.46/libc install
现在pgBackRest应该正确安装了,但最好检查一下。如果任何依赖关系被遗漏,那么当你从命令行运行pgBackRest的时候你会得到一个错误。
- db-primary⇒确保安装正常
[00:56:45-postgres@sean-rh1:/var/lib/pgsql]$ pgbackrest
pgBackRest 2.46 - General help
Usage:
pgbackrest [options] [command]
Commands:
annotate Add or modify backup annotation.
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.
verify Verify contents of the repository.
version Get version.
6.快速入门(单机)
6.1、配置文件准备
准备pgbackrest专用用户
sudo useradd pgbackrest -d /home/pgbackrest
sudo passwd pgbackrest
生成备份所需要的密码:
openssl rand -base64 48
aeisrhhx8PR7v95uGl2VdKjMv8bYOmd1oxuBLeoq9bm2HHQK69osd5nUH6UfguW
它会用到配置文件(/etc/pgbackrest.conf)当中。
sudo vi /etc/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest.conf
6.2、单机使用
1.配置文件调整
配置文件:postgresql.conf
archive_mode = on
archive_command = 'pgbackrest --stanza=postgres archive-push %p'
max_wal_senders=10
port=5555
wal_level = replica
配置文件:pg_hba.conf
local all all trust
host all all 127.0.0.1/32 scram-sha-256
host all all samenet scram-sha-256
host all all ::1/128 trust
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all samenet scram-sha-256
host replication all ::1/128 trust
注意, 这里为了演示的一般性,端口启动为5555。
配置文件pgbackrest.conf:
sudo vi /etc/pgbackrest.conf
[postgres]
pg1-path=/var/lib/pgsql/14/data/
pg1-port=5555
pg1-host-user=postgres
pg1-user=postgres
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
repo1-cipher-pass=aeisrhhx8PR7v95uGl2VdKjMv8bYOmd1oxuBLeoq9bm2HHQK69osd5nUH6UfguW
repo1-cipher-type=aes-256-cbc
process-max=3
[global:archive-push]
compress-level=3
注意上边的三个参数(都不能缺)
pg1-port=5555
pg1-host-user=postgres
pg1-user=postgres
postgresql.conf中archive_command中的参数--stanza=postgres
要与pgbackrest.conf中的[postgres]中的这一项的名称对应起来。
2.密码文件登记
vim ~/.pgpass
localhost:5555:postgres:postgres:postgres
localhost:*:*:postgres:postgres
127.0.0.1:*:*:postgres:postgres
chmod 0600 ~/.pgpass
即针对本机,无论是哪个端口,postgres用户,可以免输入密码,这里密码是"postgres",需要自行调整修改。
3.创建节
创建stanza: postgres
pgbackrest --stanza=postgres --log-level-cnotallow=info stanza-create
[19:57:22-postgres@sean-rh1:/var/lib/pgbackrest]$ pgbackrest --stanza=postgres --log-level-cnotallow=info stanza-create
2023-06-04 19:57:25.177 P00 INFO: stanza-create command begin 2.46: --exec-id=14185-b3bf91ec --log-level-cnotallow=info --pg1-path=/var/lib/pgsql/14/data/ --pg1-port=5555 --pg1-user=postgres --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=postgres
2023-06-04 19:57:25.781 P00 INFO: stanza-create for stanza 'postgres' on repo1
2023-06-04 19:57:25.793 P00 INFO: stanza-create command end: completed successfully (616ms)
检查配置
pgbackrest --stanza=postgres --log-level-cnotallow=info check
2023-06-04 20:01:43.260 P00 INFO: check command begin 2.46: --exec-id=14282-0eef33d4 --log-level-cnotallow=info --pg1-path=/var/lib/pgsql/14/data/ --pg1-port=5555 --pg1-user=postgres --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=postgres
2023-06-04 20:01:43.867 P00 INFO: check repo1 configuration (primary)
2023-06-04 20:01:44.070 P00 INFO: check repo1 archive for WAL (primary)
2023-06-04 20:01:44.171 P00 INFO: WAL segment 0000000100000001000000F1 successfully archived to '/var/lib/pgbackrest/archive/postgres/14-1/0000000100000001/0000000100000001000000F1-713498498c65306a1f7daf8cd64d4c3f5031a2cf.gz' on repo1
2023-06-04 20:01:44.171 P00 INFO: check command end: completed successfully (912ms)
4.备份与恢复
分全量备份、增量备份、差异备份
全备:
pgbackrest --stanza=postgres --log-level-cnotallow=info backup
2023-06-04 20:04:41.351 P00 INFO: backup command begin 2.46: --exec-id=14291-50874f5f --log-level-cnotallow=info --pg1-path=/var/lib/pgsql/14/data/ --pg1-port=5555 --pg1-user=postgres --process-max=3 --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=postgres
.........
2023-06-04 20:04:45.045 P00 INFO: new backup label = 20230604-200441F
2023-06-04 20:04:45.088 P00 INFO: full backup size = 34.4MB, file total = 1251
2023-06-04 20:04:45.088 P00 INFO: backup command end: completed successfully (3737ms)
2023-06-04 20:04:45.088 P00 INFO: expire command begin 2.46: --exec-id=14291-50874f5f --log-level-cnotallow=info --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=postgres
2023-06-04 20:04:45.094 P00 INFO: expire command end: completed successfully (6ms)
插入部分数据:
postgres=# create table t(id int);
CREATE TABLE
postgres=# insert into t select generate_series(1, 20000);
INSERT 0 20000
postgres=# select pg_current_xact_id();
pg_current_xact_id
--------------------
837
(1 row)
postgres=# checkpoint;
CHECKPOINT
执行增量备份并查看:
pgbackrest --stanza=postgres --log-level-cnotallow=info --type=incr backup
检查:
[20:08:29-postgres@sean-rh1:/var/lib/pgbackrest]$ pgbackrest info
stanza: postgres
status: ok
cipher: aes-256-cbc
db (current)
wal archive min/max (14): 0000000100000001000000EE/0000000100000001000000F5
full backup: 20230604-200441F
timestamp start/stop: 2023-06-04 20:04:41 / 2023-06-04 20:04:44
wal start/stop: 0000000100000001000000F3 / 0000000100000001000000F3
database size: 34.4MB, database backup size: 34.4MB
repo1: backup set size: 4.4MB, backup size: 4.4MB
incr backup: 20230604-200441F_20230604-200812I
timestamp start/stop: 2023-06-04 20:08:12 / 2023-06-04 20:08:28
wal start/stop: 0000000100000001000000F5 / 0000000100000001000000F5
database size: 35.2MB, database backup size: 3.3MB
repo1: backup set size: 4.4MB, backup size: 394.3KB
backup reference list: 20230604-200441F
再执行部分数据插入:
postgres=# insert into t select generate_series(20001, 50000);
INSERT 0 30000
postgres=# select pg_current_xact_id(); checkpoint;
pg_current_xact_id
--------------------
839
(1 row)
CHECKPOINT
执行差异备份:
pgbackrest --stanza=postgres --log-level-cnotallow=info --type=diff backup
......
2023-06-04 20:10:57.123 P00 INFO: backup command begin 2.46: --exec-id=14336-b591c119 --log-level-cnotallow=info --pg1-path=/var/lib/pgsql/14/data/ --pg1-port=5555 --pg1-user=postgres --process-max=3 --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=postgres --type=diff
2023-06-04 20:10:57.840 P00 INFO: last backup label = 20230604-200441F, version = 2.46
2023-06-04 20:10:57.840 P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes
2023-06-04 20:11:12.542 P00 INFO: backup start archive = 0000000100000001000000F7, lsn = 1/F7000028
2023-06-04 20:11:12.542 P00 INFO: check archive for prior segment 0000000100000001000000F6
2023-06-04 20:11:13.762 P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive
2023-06-04 20:11:13.963 P00 INFO: backup stop archive = 0000000100000001000000F7, lsn = 1/F7000138
2023-06-04 20:11:13.965 P00 INFO: check archive for segment(s) 0000000100000001000000F7:0000000100000001000000F7
2023-06-04 20:11:13.978 P00 INFO: new backup label = 20230604-200441F_20230604-201057D
2023-06-04 20:11:14.023 P00 INFO: diff backup size = 4.3MB, file total = 1254
2023-06-04 20:11:14.023 P00 INFO: backup command end: completed successfully (16901ms)
2023-06-04 20:11:14.023 P00 INFO: expire command begin 2.46: --exec-id=14336-b591c119 --log-level-cnotallow=info --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=postgres
2023-06-04 20:11:14.028 P00 INFO: expire command end: completed successfully (5ms)
5、PITR简单验证
pgBackRest的PITR操作大大的简化了。直接可以用命令行传入一些重要参数进行PITR恢复。
1.检查备份
[20:11:14-postgres@sean-rh1:/var/lib/pgbackrest]$ pgbackrest info
stanza: postgres
status: ok
cipher: aes-256-cbc
db (current)
wal archive min/max (14): 0000000100000001000000EE/0000000100000001000000F7
full backup: 20230604-200441F
timestamp start/stop: 2023-06-04 20:04:41 / 2023-06-04 20:04:44
wal start/stop: 0000000100000001000000F3 / 0000000100000001000000F3
database size: 34.4MB, database backup size: 34.4MB
repo1: backup set size: 4.4MB, backup size: 4.4MB
incr backup: 20230604-200441F_20230604-200812I
timestamp start/stop: 2023-06-04 20:08:12 / 2023-06-04 20:08:28
wal start/stop: 0000000100000001000000F5 / 0000000100000001000000F5
database size: 35.2MB, database backup size: 3.3MB
repo1: backup set size: 4.4MB, backup size: 394.3KB
backup reference list: 20230604-200441F
diff backup: 20230604-200441F_20230604-201057D
timestamp start/stop: 2023-06-04 20:10:57 / 2023-06-04 20:11:13
wal start/stop: 0000000100000001000000F7 / 0000000100000001000000F7
database size: 36.2MB, database backup size: 4.3MB
repo1: backup set size: 4.6MB, backup size: 515.3KB
backup reference list: 20230604-200441F
2.恢复到第一个insert操作完成的时候
这时我们找到备份集:20230604-200441F
停掉pg关例.
pg_ctl stop
执行xid类型的恢复
pgbackrest --stanza=postgres --delta --set=20230604-200441F --type=xid "--target=837" --target-actinotallow=promote restore
重启并检查:
pg_ctl start
postgres=# select count(*) from t;
count
-------
20000
(1 row)
简单分析一下,pgBackRest为你自动作了修改配置文件的操作:(postgresql.auto.conf)
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
# Recovery settings generated by pgBackRest restore on 2023-06-04 20:28:25
restore_command = 'pgbackrest --stanza=postgres archive-get %f "%p"'
recovery_target_xid = '837'
recovery_target_action = 'promote'
并且还为你添加了signal文件:recovery.signal。避免你手动进行相关配置。
7.远程备份(双机或多机)
在生产环境当中,单机备份用的相对较少。这里有必要介绍一下双机的使用情况。
基本环境:
sean-rh1: 数据库服务器, 已经有默认用户postgres, 以及准备好的实例.
sean-rh3: 远程仓库服务器, 单独用于备份
7.1.两台主机上的配置
配置仓库主机sean-rh3上的环境
1、添加默认用户:pgbackrest
sudo useradd pgbackrest
sudo passwd pgbackrest
由于pgbackrest是默认的执行用户,如果不创建这个用户,会有很多参数需要指定,比较容易出错。
2、SSH免密配置
vi /etc/hosts
10.47.43.138 sean-rh1
10.47.43.86 sean-rh3
vim /etc/ssh/sshd_config
PubkeyAuthentication yes
StrictHostKeyChecking no
sean-rh3上配置ssh:
su - pgbackrest
mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa -t rsa -b 4096 -N ""
-- ssh-keygen -t rsa -b 4096 -N ""
将pubkey复制到sean-rh1上:
ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@sean-rh1
这样就可以用:ssh 'postgres@sean-rh1' 来远程免密登录了。
sean-rh1数据库主机上也要配置ssh:
su - postgres
mkdir -m 750 -p ~/.ssh
ssh-keygen -f ~/.ssh/id_rsa -t rsa -b 4096 -N ""
将pubkey复制到sean-rh3上,目标用户:pgbackrest:
ssh-copy-id -i ~/.ssh/id_rsa.pub pgbackrest@sean-rh3
这样在sean-rh1上就可以用:ssh 'pgbackrest@sean-rh3' 来远程免密登录了。
3.配置pgbackrest
仓库主机sean-rh3上:
sudo -s
chmod 755 /usr/bin/pgbackrest
mkdir -p -m 770 /var/log/pgbackrest
chown pgbackrest:pgbackrest /var/log/pgbackrest
chmod 640 /etc/pgbackrest.conf
chown pgbackrest:pgbackrest /etc/pgbackrest.conf
准备仓库路径:
mkdir -p /var/lib/pgbackrest
chmod 750 /var/lib/pgbackrest
chown pgbackrest:pgbackrest /var/lib/pgbackrest
仓库主机的配置文件pgbackrest.conf:
vim /etc/pgbackrest.conf
内容如下:
[postgres]
pg1-host=sean-rh1
pg1-port=5555
pg1-path=/var/lib/pgsql/14/data
pg1-host-user=postgres
pg1-user=postgres
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
start-fast=y
数据库主机sean-rh1上的目录:
chmod 755 /usr/bin/pgbackrest
mkdir -p -m 770 /var/log/pgbackrest
chown postgres:postgres /var/log/pgbackrest
chmod 640 /etc/pgbackrest.conf
chown postgres:postgres /etc/pgbackrest.conf
数据库主机sean-rh1上的pgbackrest.conf
vim /etc/pgbackrest.conf
增加如下内容:
[postgres]
pg1-path=/var/lib/pgsql/14/data
pg1-user=postgres
pg1-port=5555
[global]
log-level-file=detail
repo1-host=sean-rh3
注意上边的参数对应关系。
4..pgpass文件调整
数据库主机sean-rh1上的.pgpass调整如下:(password值部分自行调整)
localhost:5555:postgres:postgres:password
127.0.0.1:*:postgres:postgres:password
5.修改postgresql.conf文件
sean-rh1数据库主机上对postgresql.conf进行调整:
archive_mode = on
archive_command = 'pgbackrest --stanza=postgres archive-push %p'
max_wal_senders=10
port=5555
wal_level = replica
然后重启.
7.2 创建节及备份
发生在仓库主机sean-rh3上,并且是以用户pgbackrest的身份执行.
[pgbackrest@sean-rh3 ~]$ pgbackrest --stanza=postgres stanza-create --log-level-cnotallow=info
2023-06-04 21:20:29.199 P00 INFO: stanza-create command begin 2.46: --exec-id=139180-3c350c85 --log-level-cnotallow=info --pg1-host=sean-rh1 --pg1-host-user=postgres --pg1-path=/var/lib/pgsql/14/data --pg1-port=5555 --pg1-user=postgres --repo1-path=/var/lib/pgbackrest --stanza=postgres
2023-06-04 21:20:29.964 P00 INFO: stanza-create for stanza 'postgres' on repo1
2023-06-04 21:20:30.073 P00 INFO: stanza-create command end: completed successfully (874ms)
执行备份:
[pgbackrest@sean-rh3 ~]$ pgbackrest --stanza=postgres backup --log-level-cnotallow=info
2023-06-04 21:21:27.920 P00 INFO: backup command begin 2.46: --exec-id=139359-a97df10c --log-level-cnotallow=info --pg1-host=sean-rh1 --pg1-host-user=postgres --pg1-path=/var/lib/pgsql/14/data --pg1-port=5555 --pg1-user=postgres --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=postgres --start-fast
WARN: no prior backup exists, incr backup has been changed to full
2023-06-04 21:21:28.787 P00 INFO: execute non-exclusive backup start: backup begins after the requested immediate checkpoint completes
2023-06-04 21:21:29.295 P00 INFO: backup start archive = 0000000200000001000000F6, lsn = 1/F6000028
2023-06-04 21:21:29.295 P00 INFO: check archive for prior segment 0000000200000001000000F5
2023-06-04 21:21:35.909 P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive
2023-06-04 21:21:36.112 P00 INFO: backup stop archive = 0000000200000001000000F6, lsn = 1/F6000138
2023-06-04 21:21:36.117 P00 INFO: check archive for segment(s) 0000000200000001000000F6:0000000200000001000000F6
2023-06-04 21:21:36.629 P00 INFO: new backup label = 20230604-212128F
2023-06-04 21:21:36.668 P00 INFO: full backup size = 35.2MB, file total = 1254
2023-06-04 21:21:36.668 P00 INFO: backup command end: completed successfully (8749ms)
2023-06-04 21:21:36.668 P00 INFO: expire command begin 2.46: --exec-id=139359-a97df10c --log-level-cnotallow=info --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanza=postgres
2023-06-04 21:21:36.672 P00 INFO: expire command end: completed successfully (4ms)
sean-rh1上插入数据:
[21:17:32-postgres@sean-rh1:/var/lib/pgsql]$ psql
psql (14.8)
Type "help" for help.
postgres=# create table t2(id int);
CREATE TABLE
postgres=# insert into t2 select generate_series(1, 20000);
INSERT 0 20000
postgres=# select pg_current_xact_id(); checkpoint;
pg_current_xact_id
--------------------
841
(1 row)
CHECKPOINT
再次备份:
[pgbackrest@sean-rh3 ~]$ pgbackrest --stanza=postgres backup --log-level-console=info
此时它为增量备份。
再次插入数据:
postgres=# insert into t2 select generate_series(20001, 50000);
INSERT 0 30000
postgres=# select pg_current_xact_id(); checkpoint;
pg_current_xact_id
--------------------
843
(1 row)
CHECKPOINT
执行再一次备份,并检查备份集:
pgbackrest --stanza=postgres --log-level-cnotallow=info --type=diff backup
[pgbackrest@sean-rh3 ~]$ pgbackrest info
stanza: postgres
status: ok
cipher: none
db (current)
wal archive min/max (14): 0000000200000001000000F4/0000000200000001000000FA
full backup: 20230604-212128F
timestamp start/stop: 2023-06-04 21:21:28 / 2023-06-04 21:21:36
wal start/stop: 0000000200000001000000F6 / 0000000200000001000000F6
database size: 35.2MB, database backup size: 35.2MB
repo1: backup set size: 4.4MB, backup size: 4.4MB
incr backup: 20230604-212128F_20230604-212526I
timestamp start/stop: 2023-06-04 21:25:26 / 2023-06-04 21:25:29
wal start/stop: 0000000200000001000000F8 / 0000000200000001000000F8
database size: 35.9MB, database backup size: 3.3MB
repo1: backup set size: 4.5MB, backup size: 391.0KB
backup reference list: 20230604-212128F
diff backup: 20230604-212128F_20230604-212821D
timestamp start/stop: 2023-06-04 21:28:21 / 2023-06-04 21:28:23
wal start/stop: 0000000200000001000000FA / 0000000200000001000000FA
database size: 37.0MB, database backup size: 4.3MB
repo1: backup set size: 4.6MB, backup size: 511.8KB
backup reference list: 20230604-212128F
最后我们尝试恢复至xid = 841
restore操作需要在数据库主机sean-rh1上执行:
pg_ctl stop
pgbackrest --stanza=postgres --delta --set=20230604-212128F --type=xid "--target=841" --target-actinotallow=promote restore
pg_ctl start
[21:31:49-postgres@sean-rh1:/var/lib/pgsql]$ psql -c "select count(*) from t2"
count
-------
20000
(1 row)
[21:32:03-postgres@sean-rh1:/var/lib/pgsql]$ psql -c "select pg_is_in_recovery()"
pg_is_in_recovery
-------------------
f
(1 row)
至此验证完毕。
参考:
1、pgbackrest 实践: https://zhuanlan.zhihu.com/p/361873652
2、手册:https://pgbackrest.org/user-guide-rhel.html#introduction
3、[PgBackRest2中文文档]