PostgreSQL备份工具: pgBackRest完整介绍
  jKnO7FXA2HI8 2023年11月02日 46 0

原创 SeanHe 数据库杂记 2023-06-05 06:10 发表于德国

基本背景:

这里作一下搬运工,直接拿出结论,尽量少走弯路。

基本实验环境:

DB: PostgreSQL 14.7
pgbackrest:pgBackRest2.46
OS: Redhat ELS 8.8,  CentOS 7.9

如果只是想直接实验操作及验证,可以跳到第6节和第7节查看。

PostgreSQL备份工具: pgBackRest完整介绍_PostgreSQL

PostgreSQL备份工具: pgBackRest完整介绍_备份恢复_02

PostgreSQL备份工具: pgBackRest完整介绍_PostgreSQL_03

也不是说,上边的这些工具,你只要掌握了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)

特性

PostgreSQL备份工具: pgBackRest完整介绍_PostgreSQL_04

并行备份和恢复

压缩通常是备份操作中的瓶颈,因此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中文文档]



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  c4lKJfwN1Ht0   2023年11月13日   68   0   0 PostgreSQLvimsql
  17eFBvSPo0pz   2023年11月19日   22   0   0 PostgreSQL
  hHWnOnebRjW2   2023年11月27日   23   0   0 PostgreSQLsqlbash
  PVzDp58rtCI5   2023年11月13日   120   0   0 PostgreSQL.net