企业通常需要一种能够执行时间点恢复 (PITR) 的可靠备份工具。Postgres 包含一个名为pg_basebackup:https://www.postgresql.org/docs/current/app-pgbasebackup.html 的备份工具,用于完整备份。它非常适合大小为数百 GB 的数据库,但目前缺乏对并行、增量和差异备份的支持。这使得对于大小为 Terrabytes 的更大的 postgres 数据库来说有点挑战。在这种情况下,pgBackRest 是我们的救星。从Oracle: https://www.migops.com/oracle-to-postgresql-migration/ 迁移到 Postgres:https://www.migops.com/oracle-to-postgresql-migration/ 时,用户发现 pgBackRest 作为Oracle RMAN:https://docs.oracle.com/en/database/oracle/oracle-database/21/bradv/glossary.html#GUID-44B5A820-D859-47F5-99CC-56A95AF4BB3E与 PostgreSQL 等效,仅在 pgBackRest 中具有更多附加功能。这是因为 pgBackRest 支持并行、增量和差异备份,包括对云备份的支持。我们将讨论 pgBackRest 许多其他特性,这些特性使其成为 PostgreSQL 的最佳备份工具。
通过这篇文章,我们首先要感谢非常活跃的pgBackRest社区:https://github.com/pgbackrest/pgbackrest,他们当然也是 PostgreSQL 的贡献者。在我们最近的一次经历中,当涉及数千个表空间时:https://github.com/pgbackrest/pgbackrest/issues/1354,我们创建了一个关于 pgBackRest 备份的错误,导致分段错误:(这对于 Postgres 非常不寻常,因为与 Oracle 相比,它具有不同的用途)。
来自 Crunchy Data 的 David Steele 和维护 pgBackRest 的社区非常迅速,并立即为这个独特的功能请求提交了补丁。添加此类功能对于社区来说可能很常见。但是,我们的客户在构建支持其独特需求的备份工具方面节省了大量时间和数千美元。这是开源和 PostgreSQL 社区如何运作的一个例子。透明的交流和讨论,使用户更容易理解功能请求是否合理,以及它是否可以针对未来的版本。用户有机会讨论功能、为功能或测试做出贡献并提供有关功能的反馈。这是开源总是获胜的地方。
顺便说一句,在落入商业备份工具的陷阱之前,应该始终尝试 pgBackRest。今天,没有任何商业备份工具可以挑战 pgBackRest 的功能和标准。以下是 pgBackRest 的架构图,在阅读本文的其余部分后,其中大部分内容将是可以理解的。

使用 pgBackRest 的 15 个优点
对于刚接触 PostgreSQL 并考虑迁移到 Postgres 的用户,我们想谈谈使用 pgBackRest 作为 postgres 的首选备份工具的一些优势。这些优势应该可以证明 pgBackRest 是下一代备份工具的原因,它在当今世界上不同数据库的几个备份工具列表中是完全独一无二的。
pgBackRest 是最先进的开源备份工具,也可以在 PGDG(PostgreSQL 全球开发组)存储库中下载。使用此工具不涉及许可或额外费用。
支持并行备份,可以将压缩文件流式传输到本地或远程存储库或云。
支持增量和差异备份。
将备份流式传输到云 - 支持 AWS、Azure 和 GCS 兼容对象存储。
支持加密。存储库可以由 pgBackRest 加密以保护备份。
不需要本地暂存区将备份流式传输到远程存储或云。可以直接将备份流式传输到云或远程存储库,而无需在本地写入任何文件。
在 PostgreSQL 中支持数百万或数十亿的对象。有关更多详细信息,请参阅此补丁。https://github.com/pgbackrest/pgbackrest/issues/1354
高度首选的备份工具,用于大小为 Terrabytes 的 postgres 数据库。
用于还原和恢复的简单命令,包括时间点恢复。为 PITR 手动拉取某个 WAL 段时不需要手动干预。
用作企业备份工具的目的,该工具可以作为统一解决方案,从单个备份服务器跨基础架构维护所有 PostgreSQL 数据库的备份。
支持从已使用流式复制配置的备用服务器(或只读副本)进行备份。请参阅本文,了解我们如何在 PostgreSQL 中设置流式复制。https://www.migops.com/blog/2021/03/31/setting-up-streaming-replication-in-postgresql-13-and-streaming-replication-internals/
能够利用多台备用服务器的计算能力进行备份。
支持根据配置自动保留备份和存档。
支持并行异步归档以提高归档速度。
支持备份具有数千个表空间的 Postgres 数据库。
使用 pgBackRest 配置 PostgreSQL 备份的步骤
在本练习中,我们将看到如何设置 pgBackRest 存储库服务器,如上面的架构图所示。我们将看到如何启用存档以及如何使用 pgBackRest 进行完整备份。在本练习中,我们将看到 CentOS 7.8 操作系统上的 postgres 服务器 (pg1)、pgBackRest 存储库服务器 (backupserver)。
在备份服务器上安装 pgBackRest
\1. 以下命令可用于使用 PGDG 存储库中的软件包在备份服务器上安装 pgBackRest。这一步(1)也必须在 postgres 服务器上执行。
$ sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm$ sudo yum install epel-release$ sudo yum install pgbackrest$ sudo pgbackrest versionpgBackRest 2.33
\2. 创建 pgbackrest 操作系统用户。该操作系统用户必须有权对存储库目录执行读取和写入操作。
$ sudo groupadd pgbackrest$ sudo useradd -r -g pgbackrest pgbackrest$ sudo mkdir -p home/pgbackrest$ sudo chown pgbackrest:pgbackrest home/pgbackrest
\3. 确保还创建了 pgBackRest 可以写入日志的日志目录,并为其设置适当的权限。
$ sudo mkdir -p var/log/pgbackrest$ sudo chown -R pgbackrest:pgbackrest /var/log/pgbackrestch sudo chmod -R 700 / var / log / pgbackrest
在 Postgres 服务器上安装 pgBackRest
1.安装步骤与pgBackRest在备份服务器上的安装方式没有区别。唯一的区别是在这种情况下日志目录将由 postgres 用户拥有。
$ sudo mkdir -p /var/log/pgbackrest$ sudo chown -R postgres: postgres / var / log / pgbackrestch sudo chmod -R 700 / var / log / pgbackrest
在备份服务器上设置 pgBackRest 备份存储库
\1. 创建存储数据库集群特定备份的备份目录。
$ sudo mkdir -p /backupdir/pg1$ sudo chown -R pgbackrest:pgbackrest /backupdir/pg1$ sudo chmod -R 700 /backupdir/pg1
\2. 将以下设置添加到 pgBackRest 配置文件中。配置文件默认为/etc/pgbackrest.conf。
$ sudo cat /etc/pgbackrest.conf[global]repo1-path=/backupdir/pg1repo1-retention-full=90repo1-retention-full-type=timestart-fast=yprocess-max=4log-level-console=infolog-level-file=info[pg1-server]pg1-path=/var/lib/pgsql/13/datapg1-host=pg1pg1-port=5432
在[global]部分下,我们必须指定备份服务器上可以维护 pgBackRest 全局存储库的目录。还提到了一些指定备份保留期、并行进程数和日志级别的参数。更多配置参数的更多细节可以在pgBackRest的官方文档中找到。
我们在上面的配置文件中看到另一个部分[pg1-server]。这包括 postgres 服务器的主机名或 IP 地址、其数据目录位置和端口。节名称可以从[pg1-server]重命名为可用于唯一标识 postgres 服务器的任何其他名称。
在 postgres 服务器上添加 pgBackRest 存储库信息
Postgres 集群应该知道它可以将档案流式传输到的 pgBackRest 存储库。相同的存储库信息还可用于恢复备份或执行时间点恢复。为此,我们需要创建一个 pgBackRest 配置文件,并将一些细节添加到 postgres 服务器上的这个文件中。
$ sudo vi /etc/pgbackrest.conf[global]repo1-path=/backupdir/pg1repo1-host=backupserver[pg1-server]pg1-path=/var/lib/pgsql/13/datapg1-port=5432
在 pgBackRest 存储库服务器和 PostgreSQL 服务器之间启用可信身份验证
为了存档的目的,postgres 服务器必须能够将存档流式传输到备份服务器。这只能通过两台服务器之间的可信身份验证来实现。同样,备份服务器需要受信任的身份验证才能从 postgres 服务器流式传输备份。可以执行以下步骤以使用 SSH 密钥启用 Postgres 服务器和 pgBackRest 备份服务器之间的可信身份验证。
步骤 1:在备份服务器和 Postgres 服务器上生成 ssh 密钥。
pgbackrest@backupserver:~$ ssh-keygen -t rsa -b 2048Generating public/private rsa key pair.........postgres@pg1:~$ ssh-keygen -t rsa -b 2048Generating public/private rsa key pair.........
第二步:将pgbackrest服务器的公钥复制到postgres服务器,从postgres服务器复制到pgbackrest服务器。
pgbackrest@backupserver:~$ ssh-copy-id postgres@pg1postgres@pg1:~$ ssh-copy-id pgbackrest@backupserver
第 3 步:验证来自两台服务器的可信身份验证。
pgbackrest@backupserver:~$ ssh postgres@pg1 'echo "Connected to $(hostname) successfully"'Connected to pg1 successfullypostgres@pg1:~$ ssh pgbackrest@backupserver 'echo "Connected to $(hostname) successfully"'Connected to backupserver successfully
在 PostgreSQL 服务器上配置必填参数
以下是要在 postgres 服务器上配置的强制参数,以确保 pgBackRest 成功运行。
archive_mode :此参数必须设置为“ON”以确保启用存档。如果未启用归档,pgBackRest 将无法工作。
$ psql -c "ALTER SYSTEM SET archive_mode TO 'ON'"
archive_command : archive_command 必须设置为以下命令。这将由 pgBackRest 处理。
$ psql -c "ALTER SYSTEM SET archive_command TO 'pgbackrest --stanza=pg1-server archive-push %p'"
如果必须修改archive_mode,则可能需要重新启动 PostgreSQL 服务器。否则,重新加载就足够了。
以下是执行重新加载或 SIGHUP 的命令。
$ pg_ctl -D /var/lib/pgsql/13/data reload
如果需要,以下是执行重新启动的命令。
$ pg_ctl -D /var/lib/pgsql/13/data restart -mf
在备份服务器上创建一个 Stanza
为了维护特定 postgres 服务器的存储库,必须创建一个专用于该 postgres 服务器的节。该节与 postgres 服务器的 pgbackrest.conf 文件中使用的部分名称相同。在这种情况下,它是[pg1-server]。参见上面的配置文件。
\1. 以下命令可用于在备份服务器上创建节。
$ pgbackrest --stanza=pg1-server stanza-create
本练习中上述命令的输出。
pgbackrest@backupserver:~$ pgbackrest --stanza=pg1-server stanza-create2021-04-09 20:29:42.939 P00 INFO: stanza-create command begin 2.33: --exec-id=23199-1c75331c --log-level-console=info --log-level-file=off --pg1-host=pg1 --pg1-path=/var/lib/pgsql/13/data --pg1-port=5432 --repo1-path=/backupdir/pg1 --stanza=pg1-server2021-04-09 20:29:43.767 P00 INFO: stanza-create for stanza 'pg1-server' on repo12021-04-09 20:29:43.879 P00 INFO: stanza-create command end: completed successfully (941ms)
\2. 使用 check 命令执行验证。这将强制 postgres 服务器切换 WAL 段并使用 archive_command 归档该 WAL 段。
$ pgbackrest --stanza=pg1-server check
输出如下所示。
pgbackrest@backupserver:~$ pgbackrest --stanza=pg1-server check2021-04-09 20:37:16.670 P00 INFO: check command begin 2.33: --exec-id=23252-187c27de --log-level-console=info --log-level-file=info --pg1-host=pg1 --pg1-path=/var/lib/pgsql/13/data --pg1-port=5432 --repo1-path=/backupdir/pg1 --stanza=pg1-server2021-04-09 20:37:17.504 P00 INFO: check repo1 configuration (primary)2021-04-09 20:37:17.712 P00 INFO: check repo1 archive for WAL (primary)2021-04-09 20:37:19.743 P00 INFO: WAL segment 000000010000000000000004 successfully archived to '/backupdir/pg1/archive/pg1-server/13-1/0000000100000000/000000010000000000000004-810ca805a7b4f63e4efdebd3aa383edbfff15e8a.gz' on repo12021-04-09 20:37:19.849 P00 INFO: check command end: completed successfully (3180ms)
使用 pgBackRest 对远程 PostgreSQL 数据库进行完整备份
\1. 可以在备份服务器上使用以下命令使用 4 个并行进程进行远程备份。
$ pgbackrest --stanza=pg1-server backup --start-fast --compress --process-max=4
--start-fast :触发快速检查点,而不是等到下一个定时检查点。这已在上面的 pgBackRest 配置中设置。然而,这只是为了简单起见。--compress :启用压缩备份。默认情况下压缩是打开的。--process-max :可以启动备份以加快备份速度的并发进程数。
上述备份命令的输出如下所示。
pgbackrest@backupserver:~$ pgbackrest --stanza=pg1-server backup --start-fast --compress --process-max=42021-04-09 20:43:30.143 P00 INFO: backup command begin 2.33: --compress --exec-id=23305-9bf6b99e --log-level-console=info --log-level-file=info --pg1-host=pg1 --pg1-path=/var/lib/pgsql/13/data --pg1-port=5432 --process-max=4 --repo1-path=/backupdir/pg1 --repo1-retention-full=90 --repo1-retention-full-type=time --stanza=pg1-server --start-fastWARN: no prior backup exists, incr backup has been changed to full2021-04-09 20:43:31.087 P00 INFO: execute non-exclusive pg_start_backup(): backup begins after the requested immediate checkpoint completes2021-04-09 20:43:31.504 P00 INFO: backup start archive = 000000010000000000000006, lsn = 0/60000282021-04-09 20:43:32.646 P03 INFO: backup file pg1:/var/lib/pgsql/13/data/base/1/1255 (648KB, 2%) checksum 99f750789c99416b8b47bcbfbc05e070eab32e892021-04-09 20:43:32.712 P02 INFO: backup file pg1:/var/lib/pgsql/13/data/base/13318/1255 (648KB, 5%) checksum 99f750789c99416b8b47bcbfbc05e070eab32e89.........2021-04-09 20:43:35.514 P01 INFO: backup file pg1:/var/lib/pgsql/13/data/base/1/13176 (0B, 100%)2021-04-09 20:43:35.514 P04 INFO: backup file pg1:/var/lib/pgsql/13/data/base/1/13171 (0B, 100%)2021-04-09 20:43:35.516 P00 INFO: full backup size = 23.1MB2021-04-09 20:43:35.516 P00 INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive2021-04-09 20:43:35.727 P00 INFO: backup stop archive = 000000010000000000000006, lsn = 0/60001382021-04-09 20:43:35.740 P00 INFO: check archive for segment(s) 000000010000000000000006:0000000100000000000000062021-04-09 20:43:36.072 P00 INFO: new backup label = 20210409-204330F2021-04-09 20:43:36.204 P00 INFO: backup command end: completed successfully (6063ms)2021-04-09 20:43:36.205 P00 INFO: expire command begin 2.33: --exec-id=23305-9bf6b99e --log-level-console=info --log-level-file=info --repo1-path=/backupdir/pg1 --repo1-retention-full=90 --repo1-retention-full-type=time --stanza=pg1-server2021-04-09 20:43:36.216 P00 INFO: repo1: time-based archive retention not met - archive logs will not be expired2021-04-09 20:43:36.216 P00 INFO: expire command end: completed successfully (11ms)
\2. 使用info命令验证备份。
$ pgbackrest --stanza=pg1-server info
输出如下所示。
pgbackrest@backupserver:~$ pgbackrest --stanza=pg1-server infostanza: pg1-serverstatus: okcipher: nonedb (current)wal archive min/max (13): 000000010000000000000001/000000010000000000000006full backup: 20210409-204330Ftimestamp start/stop: 2021-04-09 20:43:30 / 2021-04-09 20:43:35wal start/stop: 000000010000000000000006 / 000000010000000000000006database size: 23.1MB, database backup size: 23.1MBrepo1: backup set size: 2.8MB, backup size: 2.8MB
结论
在本文中,我们看到了使用 pgBackRest 的优势以及如何将其配置为基础架构的统一备份解决方案。在我们以后的文章中,我们将更多地讨论使用 pgBackRest 进行恢复和时间点恢复。请联系我们:https://www.migops.com/contact-us/ 以了解有关 PostgreSQL 可用的强大开源解决方案的更多信息,以及我们如何帮助您从 Oracle 和其他商业数据库迁移到 PostgreSQL。




