使用pgBackRest的PostgreSQL增量备份。第2部分。加密,启动到S3,还原到新服务器,PITR

本文是文章“使用pgbackrest进行Postgresql增量备份-开发人员的新兵课程”的续篇。



在第一部分中,我们学习了如何进行增量备份,将其上传到远程服务器(带有备份的存储库)以及回滚到上一个备份。

在本文中,我们将学习如何加密备份,将备份上传到S3兼容存储(而不是第二个存储库服务器),恢复到干净的群集以及最后的时间点恢复(PITR)。


瞬间



作者并不假装是一名DBA,但有时他喜欢自己设置并查看所有内容。



训练



要复制本手册,我们需要:



  1. 具有数据库的服务器(我们将在其上安装pgbackrest);
  2. S3存储(您可以使用Amazon或任何兼容的S3,我将使用Amazon S3);
  3. 第三台服务器。可选的。在它上,我们将练习从头开始部署postgresql和pgbackrest,从S3存储中部署现有的备份(服务器烧坏,移动等);


假定您已经安装了postgresql,因此postgres用户也可用。



我在上一篇文章中介绍了pgbackrest的安装过程,但以防万一我会再次复制它(提醒您:在安装之前,请为自己创建一个sudo用户-我将使用pgbackrest用户名使用sudo用户)。



为了使您在重现指令时遇到的问题更少,我用斜体字写在哪里,由哪个用户以何种权限以及在编写和检查文章时执行命令的方式。



我们将遵循以下路径:



配置postgresql和pgbackrest配置

备份的加密(两行)

学习备份并发送到S3存储(五行)

进行备份

让我们想象一下,我们破坏了集群,部署在新服务器上,连接现有的S3存储库并汇总了备份。

让我们看一下PITR(即时点恢复):我们将恢复到某个时间点(假设pgbackrest已经备份了drop table,但是我们需要回滚4小时之前)当标志仍然存在时)



走吧!



安装pgBackRest



sudo用户或root:



1.从pgbackrest下载档案并将其内容传输到/ build文件夹:



sudo mkdir /build
sudo wget -q -O - \
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | \
       sudo tar zx -C /build


2.安装构建所需的依赖项:



sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \
       libpq-dev


3.将pgbackrest放在一起:



cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src


4.将可执行文件复制到/ usr / bin目录:



sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest


5.pgBackRest需要perl。安装:



sudo apt-get install perl


6.为日志创建目录,并赋予它们某些权限:



sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf


7.检查:



pgbackrest version


设置postgresql和pgBackRest



sudo用户或root:



1.在postgresql.conf(位于/ etc / postgresql / 11 / main文件夹中)中进行必要的设置,以使pgBackRest起作用:



archive_command = 'pgbackrest --stanza=main archive-push %p' #  main -  .   postgres    main.
archive_mode = on
max_wal_senders = 3
wal_level = replica


2.让我们在pgbackrest配置文件(/etc/pgbackrest/pgbackrest.conf)中进行必要的设置:



[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-cipher-pass=tr5+BXdfdoxeyUqfo6AzLTrW+c+Jfd/1QbQj2CDMMBwtB0YGH3EJajry4+Eeen6D
repo1-cipher-type=aes-256-cbc
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # ,     . ..           ,      .    "     " -     .
repo1-type=s3
repo1-s3-bucket=pgbackrest-part2-tutorial
repo1-s3-endpoint=s3.us-east-1.amazonaws.com
repo1-s3-region=us-east-1
repo1-s3-key=9wdS3G8U5wz7kNsFWVGck7DDZ7DtVDtbM
repo1-s3-key-secret=A9zRmW16zXKt2vVA8mmNsFWy2mUAPYHa
start-fast=y

[global:archive-push]
compress-level=3


如您所知,这里我们立即配置了加密并配置了对S3存储的支持。



PS在配置中应该没有任何注释。

PS要生成强加密密钥,可以使用以下命令:



openssl rand -base64 48


仓库创建



sudo用户或root:



sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R postgres /var/lib/pgbackrest/
sudo -u postgres pgbackrest --stanza=main stanza-create


如果一切顺利,那么在S3存储桶中,您将看到pgbackrest生成的文件。



进行备份:



sudo用户或root:



sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup


pgBackRest将创建第一个完整备份。如果愿意,可以再次运行backup命令,并确保系统将创建增量备份。



如果要再次进行完整备份,请指定其他标志:



sudo -u postgres pgbackrest --log-level-console=info --stanza=main --type=full backup


您可以使用以下命令查看备份列表:



sudo -u postgres pgbackrest --stanza=main info




还原备份:



sudo用户或root:



1.停止正在运行的集群:



sudo pg_ctlcluster 11 main stop


2.从备份中恢复:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore


要将数据库还原到上一次完整备份的状态,请使用以下命令而不指定recovery_target:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore


重要!恢复后,可能会发现数据库在恢复模式下挂起(会出现类似ERROR的错误:无法在只读事务中执行DROP DATABASE)。解决方法如下(执行命令后,您将需要稍等):



sudo -u postgres psql -c "select pg_wal_replay_resume()"


UPD:据我了解,发生此错误是由于以下事实:使用recovery_target =立即恢复后,pgbackrest会暂停数据库为了避免这种情况,您需要另外指定一些标志(您可以在此处此处阅读其含义):



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate --target-action=promote --type=immediate restore


实际上,可以通过其名称还原特定备份。在这里,我仅提供文档中有关此功能的描述的链接开发人员建议谨慎使用此参数并解释原因。从我自己,我可以补充说我曾经使用过它。最主要的是确保恢复后,数据库退出恢复模式(选择pg_is_in_recovery()应显示“ f”),以防万一,恢复后进行完整备份。



3.启动集群:



sudo pg_ctlcluster 11 main start


恢复备份后,我们将执行第二次备份:

sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup


将备份还原到干净的群集:



让我们想象一下发生了一件可怕的事情-服务器烧毁了(崩溃,泛滥,失去了访问权限)。我们需要将所有内容还原到新的干净服务器上。在新服务器上,我们已经创建了一个sudo用户,安装了pgbackrest,安装了postgresql,并且我们有了一个全新的主集群。



我们需要做的就是以与先前服务器相同的方式设置postgresql和pgBackRest配置,重新启动postgresql并执行与还原类似的命令顺序:



sudo用户或root:



1.停止正在运行的集群:



sudo pg_ctlcluster 11 main stop


2.从备份中恢复:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate  --target-action=promote --type=immediate restore


PS我在上面描述了此命令的细微差别。 



3.启动集群:



sudo pg_ctlcluster 11 main start


还原备份后,我们需要执行第二次备份:



sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup


实际上,仅此而已。火被扑灭了。



时间点恢复(PITR)



假设有这样一种情况,在16:00创建了一个备份,在18:05,我们意外地擦除了一个重要的盘,在该盘中,两个我们不想丢失的重要数据得以设法进入。牺牲PostgreSQL的PgBackRest为我们提供了这样的机会:只要我们有足够的信息来恢复,我们就可以回滚到特定的时间点。



它是这样的:



  1. 我们说我们想回滚到时间18:04;
  2. pgBackRest搜索最近的当前备份(16:00);
  3. 恢复它,但并非所有内容都可以恢复,仅恢复我们在18.04之前成功完成的工作;


PS此机制建立在WAL日志上。您可以在这里阅读



您可以使用以下命令执行恢复到特定时间点(停止集群后)的操作:



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore


重要说明-PostgreSQL只能向前播放WAL日志,而不能向后播放。在实践中这意味着什么?



假设备份是在16:00创建的。在18:05,我们意外删除了该表,并在18:10,使用已删除的表再次创建了备份。当您尝试进行PITR时,pgBackRest将采用在16:00创建的备份并滚动18:05之前的所有内容,而不会采用在18:10创建的备份并将所有内容回滚。了解这一点很重要。此机制将在此处更详细地描述



假设您进行了备份,其中已经包含有关删除表的信息。使用--set标志,让我们说应该将哪个备份用作基础(表仍在其中的那个)。 pgBackRest将进行此备份,并翻转删除表之前的所有内容。



sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time --set=20200905-183838F_20200906-182612I "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore


PS我上面显示了用于获取备份列表的命令。



让我们启动集群。启动后,让我们检查文件/var/log/postgresql/postgresql-11-main.log。在其中,我们对以下几行感兴趣,这表明恢复到指定时间点已成功:



starting point-in-time recovery to 2020-09-07 11:26:52.493127+02
...
recovery stopping before commit of transaction 576, time 2020-09-07 11:27:14.584496+02
...
last completed transaction was at log time 2020-09-07 11:24:09.583761+02


就这样。我强烈建议您在战斗中使用该工具之前先进行试验。



All Articles