pgBackRest是一种可靠且易于配置的PostgreSQL备份和还原解决方案,它为所有PostgreSQL数据库提供了强大的解决方案;无论是小型项目,还是扩大到企业级用的项目。
pgBackRest包含许多强大的功能,包括并行备份和还原,本地或远程操作,完整增量和差异备份类型,备份轮换,存档到期,备份完整性,页面校验和备份恢复,流压缩和校验,增量还原, 以及更多功能。
随着PostgreSQL 12的最新发行版(以及更新的12.1),pgBackRest还获得了许多更新和更改,以利用Postgres的最新功能。
在下文中,我们将探讨在PostgreSQL 12数据库上配置pgBackRest所涉及的步骤,然后模拟在数据库文件已被破坏的灾难中,并还原备份以重新获得数据库。
设置演示
如果出于指导目的而遵循本指南,则具有相似的工作环境以确保在执行练习时使用相同的设置,命令和过程将非常有用。
对于此示例,我们将在CentOS 7上执行PostgreSQL 12.1和pgBackRest 2.19的安装和配置。
为简单起见,建议使用Hashicorp的Vagrant来启动和管理CentOS 7官方Vagrant Box。
如果使用Vagrant,只需运行:
cd temp_work_dir vagrant init centos/7 vagrant up vagrant ssh
复制
另外,您可以使用以下
设置来手动设置和配置虚拟机:
- 12 GB单分区ext4磁盘
- 2 GB内存
- 2个CPU
安装PostgreSQL和pgBackRest
有几种在CentOS 7服务器上安装PostgreSQL的方法,在PostgreSQL Wiki上有详细介绍。就本指南而言,我们将使用PGDG Yum存储库安装PostgreSQL 12和最新版本的pgBackRest。在撰写本文时,PostgreSQL的最新版本是12.1,而pgBackRest是2.19。
sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum -y install postgresql12-server postgresql12-contrib pgbackrest
复制
接下来,使用以下命令初始化PostgreSQL实例:
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb sudo systemctl enable postgresql-12.service sudo systemctl start postgresql-12.service
复制
第一条命令仅需运行一次,即可负责初始化$PGDATA目录中的数据库。
第二条命令确保PostgreSQL在操作系统启动时将自动启动,而第三条命令将在当前时间启动数据库。
要验证PostgreSQL是否已正确启动,以下命令将确认:
sudo -iu postgres psql --version psql (PostgreSQL) 12.1
复制
接下来,以默认用户或用户身份运行以下命令,以验证pgBackRest是否已正确安装postgres:
$ pgbackrest pgBackRest 2.19 - 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. restore Restore a database cluster. 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.
复制
确保基本命令返回有效的响应和期望的版本通常是一个好的做法,因为它可以确保软件正常运行并且版本彼此兼容。
配置PostgreSQL
根据您的特定用例,您可能需要配置PostgreSQL的选项来满足您特定的环境需求。
可能的考虑因素是:
- 使用复制或配置集群
- 备份的存储方式(使用3-2-1方法?)
- 数据库的安全问题
出于此练习的目的,我们将遵循一个非常简单的模型,该模型将在演示过程中发挥最佳作用,但不适用于生产环境。
例如,如果您希望将环境配置为具有副本PostgreSQL实例,则可以在这些Crunchy Blog Post中找到更多信息。
为了简单起见,我们将以最少的更改数量配置PostgreSQL ,以使工作模型最小。
如果您不知道配置文件在PostgreSQL主机上的位置,则可以运行以下命令:
sudo -iu postgres psql -U postgres -c 'SHOW config_file' config_file ---------------------------------------- /var/lib/pgsql/12/data/postgresql.conf (1 row)
复制
在您首选的文本编辑器中以root权限编辑postgresql.conf文件。需要定义以下参数:
listen_addresses = '*' # Optionally, define the address as the host IP: listen_addresses = '10.0.1.1' password_encryption=’scram-sha-256’ archive_mode = on
复制
关于配置的PostgreSQL设置的简要介绍最好的做法是了解对数据库进行的配置更改。为了演示的目的,将三个选项从其默认值更改了,并且知道为什么会发生这一点很重要。
listen_addresses:
虽然PostgreSQL的pg_hba.conf负责限制文件的连接,当listen_addresses设置为*(通配符),可以发现在打开的端口5432使用nmap和学习的数据库存在,从而可能打开服务器注册一个漏洞。将其设置为IP地址可防止PostgreSQL监听意外的接口,从而防止这种潜在的利用。有关此特定攻击媒介以及如何避免它的更多信息,请参见此博客文章。
password_encryption注意:
从PostgreSQL 10发行版开始SCRAM-SHA-256 authentication就可以使用,并且在本示例中用于鼓励数据库安全连接的显式目的。具体来说,这种身份验证方法可防止对不可信连接进行密码嗅探,并以安全方式为服务器上的密码哈希密码提供支持。
archive_mode:
另外除了最新版本的PostgreSQL,开始与PostgreSQL的10个主要版本中,进行了更改,以减少这是必要的配置编辑的数量来进行流式备份和复制(特别是影响参数wal_level,max_wal_senders,max_replication_slots,和hot_standby-这些都是现在都默认置)。有关此更改的发行说明可以在此处找到。
对PostgreSQL配置文件进行更改后,请重新启动服务以使更改生效。在这种特定情况下,必须重新启动,因为所有更改的值都特别需要PostgreSQL服务停止并重新启动。
sudo systemctl restart postgresql-12.service
复制
通过运行以下命令,可以检查配置值是否已正确应用于数据库:
sudo -iu postgres psql SELECT name,setting,context,source FROM pg_settings WHERE NAME IN ('listen_addresses','archive_mode','password_encryption'); name | setting | context | source ---------------------+---------------+------------+-------------------- archive_mode | on | postmaster | configuration file listen_addresses | * | postmaster | configuration file password_encryption | scram-sha-256 | user | configuration file (3 rows)
复制
使用\q到退出psql的提示。
配置pgBackRest
为pgBackRest备份存储库配置一个位置:
sudo mkdir -p /var/lib/pgbackrest sudo chmod 0750 /var/lib/pgbackrest sudo chown -R postgres:postgres /var/lib/pgbackrest
复制
在pgbackrest日志位置上配置位置和权限:
sudo chown -R postgres:postgres /var/log/pgbackrest
复制
接下来,修改pgBackRest的配置文件以满足环境的需求。
最佳做法是,首先创建任何现有pgbackrest.conf文件的备份:
sudo cp /etc/pgbackrest.conf /etc/pgbackrest.conf.backup
复制
生成一个安全,长而随机的密码来加密存储库:
openssl rand -base64 48
复制
此生成的值将用作repo1-cipher-pass选项。注:一旦配置了存储库并创建并检查了节,就无法更改存储库加密设置。接下来,pgbackrest.conf以根用户身份编辑文件,输入以下参数:
[global] repo1-cipher-pass=uUQsaa7+CCFaqXVagFzNUix3XuLe9e2uqVskqfI6wcKf8BX8y5b+8bL3oimRpV1N repo1-cipher-type=aes-256-cbc repo1-path=/var/lib/pgbackrest repo1-retention-full=2 log-level-console=info log-level-file=debug [demo] pg1-path=/var/lib/pgsql/12/data
复制
本[global]部分定义了备份的位置,日志记录设置和加密设置。该[demo]部分定义了一节demo备份库中,我们将配置。与PostgreSQL设置一样,最佳实践鼓励理解配置选项。在pgBackRest配置指南中可以找到关于这些配置选项的更多信息。
最后,初始化pgBackRest节,其中包含位置的定义,归档选项,备份设置以及PostgreSQL数据库集群的其他类似配置。通常,为每个需要备份的数据库集群定义一个节。配置该stanza-create命令后,必须在主要主机上运行该命令pgbackrest.conf。
sudo -u postgres pgbackrest --stanza=demo stanza-create 2019-11-15 18:08:57.158 P00 INFO: stanza-create command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=demo 2019-11-15 18:08:57.609 P00 INFO: stanza-create command end: completed successfully (455ms)
复制
整合在一起,执行首次备份
现在已经分别配置了PostgreSQL和pgBackRest,必须执行一些最后的步骤将它们绑在一起并执行备份过程。
首先,postgresql.conf再次编辑文件,然后配置archive_command:
archive_command = 'pgbackrest --stanza=demo archive-push %p'
复制
该配置选项通知PostgreSQL使用pgBackRest处理WAL段,将它们立即推送到归档文件中。在对配置文件进行此更改之后,重新加载PostgreSQL服务:
sudo systemctl reload postgresql-12.service
复制
接下来,我们将使用pgBackRest检查集群。这验证了pgBackRest和archive_command设置均已正确配置并按预期执行。
sudo -iu postgres pgbackrest --stanza=demo check 2019-11-15 18:10:03.637 P00 INFO: check command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=demo 2019-11-15 18:10:04.757 P00 INFO: WAL segment 000000010000000000000001 successfully archived to '/var/lib/pgbackrest/archive/demo/12-1/0000000100000000/000000010000000000000001-bddaecf52ba8c3dd83e6157fea6a4dbeb6476010.gz' 2019-11-15 18:10:04.757 P00 INFO: check command end: completed successfully (1120ms)
复制
如果此命令产生任何错误,请阅读并检查输出,以获取有关如何解决特定问题的建议。
现在,经过多番努力;执行完整备份:
sudo -u postgres pgbackrest --stanza=demo --type=full backup 2019-11-15 18:10:32.421 P00 INFO: backup command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --repo1-retention-full=2 --stanz a=demo --type=full 2019-11-15 18:10:33.555 P00 INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-11-15 18:10:32": backup begins after the next regular checkpoint completes 2019-11-15 18:10:33.758 P00 INFO: backup start archive = 000000010000000000000003, lsn = 0/3000028 2019-11-15 18:10:35.930 P01 INFO: backup file /var/lib/pgsql/12/data/base/14187/1255 (632KB, 2%) checksum 60325e5cd07379af0ffe91eea27cfd4f2f07af69 [...] 2019-11-15 18:10:38.818 P00 INFO: full backup size = 24.2MB 2019-11-15 18:10:38.818 P00 INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive 2019-11-15 18:10:38.920 P00 INFO: backup stop archive = 000000010000000000000003, lsn = 0/3000138 2019-11-15 18:10:39.235 P00 INFO: new backup label = 20191115-181032F 2019-11-15 18:10:39.286 P00 INFO: backup command end: completed successfully (6866ms)
复制
最后,确认备份正常工作:
sudo -u postgres pgbackrest info stanza: demo status: ok cipher: aes-256-cbc db (current) wal archive min/max (12-1): 000000010000000000000003/000000010000000000000003 full backup: 20191115-181032F timestamp start/stop: 2019-11-15 18:10:32 / 2019-11-15 18:10:39 wal start/stop: 000000010000000000000003 / 000000010000000000000003 database size: 24.2MB, backup size: 24.2MB repository size: 2.9MB, repository backup size: 2.9MB
复制
还原备份
现在,已在全新数据库上执行了完整备份,测试从完整备份中还原是否有用。
为此,请停止PostgreSQL实例,并删除其数据文件,以模拟系统管理灾难。
sudo systemctl stop postgresql-12.service sudo find /var/lib/pgsql/12/data -mindepth 1 -delete
复制
此时,尝试启动数据库将导致失败:
sudo systemctl start postgresql-12.service ## THIS WILL FAIL Job for postgresql-12.service failed because the control process exited with error code. See "systemctl status postgresql-12.service" and "journalctl -xe" for details.
复制
在数据库上执行还原:
sudo -iu postgres pgbackrest --stanza=demo --delta restore
复制
还原完成后,数据库将按预期启动:
sudo systemctl start postgresql-12.service
复制
您可以验证pgBackRest是否仍在工作:
sudo -u postgres pgbackrest --stanza=demo check 2019-11-15 18:13:56.707 P00 INFO: check command begin 2.19: --log-level-console=info --log-level-file=debug --pg1-path=/var/lib/pgsql/12/data --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/var/lib/pgbackrest --stanza=demo 2019-11-15 18:13:57.594 P00 INFO: WAL segment 000000020000000000000005 successfully archived to '/var/lib/pgbackrest/archive/demo/12-1/0000000200000000/000000020000000000000005-bd01dc079338748cd9772a7c324eed0d68d45a9c.gz' 2019-11-15 18:13:57.594 P00 INFO: check command end: completed successfully (887ms)
复制
在发生任何灾难实例之后,始终最好的做法是使用新的备份来跟踪所有还原:
sudo -u postgres pgbackrest --stanza=demo --type=full backup
复制
结论
总之,pgBackRest提供了大量的可能性和用例。安装,配置和使用非常简单,可通过WAL归档简化时间点恢复。如果发生任何灾难,确保备份有效就可以放心。