免责声明我是开发人员。 我编写代码,仅以用户身份与数据库进行交互。 我决不假装自己是系统管理员,尤其是dba。 但是...
碰巧我需要组织一个postgresql数据库的备份。 没有云-保持SSH并使一切正常运行,而不是要钱。 在这种情况下我们该怎么办? 没错,我们将pgdump推送到cron中,每天将所有内容备份到存档中,如果我们已经完全分散了,我们会将存档发送到某个地狱。
这次,困难在于根据计划,该基础应该以每天约+-100 MB的速度增长。 当然,在几周内,使用pgdump备份所有内容的愿望将消失。 在这里,增量备份可以解决。
有意思吗 欢迎来到猫。
增量备份是一种备份类型,当并非所有源文件都被备份时,而是自创建上一个备份以来仅进行新的和更改的备份。
像任何开发人员一样,当时完全不希望(当时)了解postgres的复杂性,我想找到一个绿色按钮。 好吧,您知道,就像在AWS中一样,DigitalOcean:单击一个按钮-获得复制,单击第二个按钮-设置备份,第三个按钮-几个小时前回滚。 我还没有找到按钮和漂亮的GUI工具。 如果您知道(免费或廉价),请在评论中写下。
谷歌搜索,我发现了两个工具
pgbarman和
pgbackrest 。 我只是对第一个没有问题(非常贫乏的文档,我试图根据旧手册来完善所有内容),但是第二个却在水平上,但并非没有缺陷。 为了简化那些面临类似任务的人员的工作,本文已写成。
阅读本文之后,您将学习如何进行增量备份,将其保存到远程服务器(带有备份的存储库)中,并在数据丢失或主服务器上出现其他问题时还原它们。
准备工作
要播放该手册,您将需要两个VPS。 第一个是存储库(将在其中放置备份的存储库),第二个实际上是具有postgres的服务器本身(在我的情况下,是postgres的版本11)。
假定在具有postgres的服务器上您具有root,sudo用户,postgres用户和postgres本身(安装了postgresql时将自动创建postgres用户),并且在存储库服务器上有root和sudo用户(用户名pgbackrest将在手册中使用) 。
这样,您在重现指令时就不会遇到太多问题-用斜体字写下在编写和检查文章时
执行命令的位置,对象,对象和权限 。
安装pgbackrest
存储库(用户pgbackrest):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 pgbackrest:pgbackrest /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 pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
7.检查:
pgbackrest version
Postgres服务器(sudo用户或root):在使用postgres的服务器上安装pgbackrest的过程与在存储库上安装的过程类似(是的,pgbackrest应该在两个服务器上都可以),
但是在第6段中,第二个也是最后一个命令: sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
替换为: sudo chown postgres:postgres /var/log/pgbackrest sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
通过无密码SSH配置服务器之间的通信
为了使pgbackrest正常工作,您需要使用密钥文件配置postgres服务器和存储库之间的交互。
存储库(用户pgbackrest):
创建一个密钥对:
mkdir -m 750 /home/pgbackrest/.ssh ssh-keygen -f /home/pgbackrest/.ssh/id_rsa \ -t rsa -b 4096 -N ""
注意! 我们在没有sudo的情况下执行上述命令。
Postgres服务器(sudo用户或root):创建一个密钥对:
sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa \ -t rsa -b 4096 -N ""
存储库(sudo用户):将postgres服务器的公钥复制到存储库服务器:
(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | \ sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys
在这一步,将要求root用户输入密码。 您需要输入postgres服务器用户的root密码!
Postgres服务器(sudo用户):使用postgres将存储库的公钥复制到服务器:
(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | \ sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys
在这一步,将要求root用户输入密码。 您需要输入存储库用户的根密码!
我们检查:
存储库(root用户,出于实验的纯正性): sudo -u pgbackrest ssh postgres@<postgres_server_ip>
Postgres服务器(root用户,出于纯粹的实验目的): sudo -u postgres ssh pgbackrest@<repository_server_ip>
我们确保获得访问权限没有问题。
设置postgres服务器
Postgres服务器(sudo用户或root):1.让我们从外部IP“敲响” postgres服务器。 为此,请编辑
postgresql.conf文件(位于/ etc / postgresql / 11 / main文件夹中),并在其中添加以下行:
listen_addresses = '*'
如果已经存在这样的行,请取消注释它或将参数值设置为“ *”。
在
pg_hba.conf文件 (也位于
/ etc / postgresql / 11 / main文件夹中)中,添加以下行:
hostssl all all 0.0.0.0/0 md5 host all all 0.0.0.0/0 md5
其中:
hostssl/host - SSL ( ) all - all - , () 0.0.0.0/0 - md5 -
2.在
postgresql.conf (位于文件夹
/ etc / postgresql / 11 / main中 )中进行必要的设置,以使pgbackrest能够正常工作:
archive_command = 'pgbackrest --stanza=main archive-push %p'
3.在pgbackrest配置文件(/etc/pgbackrest/pgbackrest.conf)中进行必要的设置:
[main] pg1-path=/var/lib/postgresql/11/main [global] log-level-file=detail repo1-host=<repository_server_ip>
4.重新启动PostgreSQL:
sudo service postgresql restart
配置存储库服务器
仓库(pgbackrest用户):在
pgbackrest配置
文件中进行必要的设置
(
/etc/pgbackrest/pgbackrest.conf ):
[main] pg1-host=<postgres_server_ip> pg1-path=/var/lib/postgresql/11/main [global] repo1-path=/var/lib/pgbackrest repo1-retention-full=2
创建存储
仓库(pgbackrest用户):为主集群创建一个新的存储:
sudo mkdir -m 770 /var/lib/pgbackrest sudo chown -R pgbackrest /var/lib/pgbackrest/ sudo -u pgbackrest pgbackrest --stanza=main stanza-create
检查一下
Postgres服务器(sudo用户或root):检查postgres服务器:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info check
仓库(pgbackrest用户):检查存储库服务器:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check
我们确保在输出中看到“检查命令结束:成功完成”行。
你累吗 我们传递给最有趣的。进行备份
仓库(pgbackrest用户):
1.我们进行备份:
sudo -u pgbackrest pgbackrest --stanza=main backup
2.我们确保已创建备份:
ls /var/lib/pgbackrest/backup/main/
Pgbackrest将创建第一个完整备份。 如果愿意,可以再次运行backup命令,并确保系统创建了增量备份。
如果要再次进行完整备份,请指定其他标志:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backup
如果要向控制台输出详细信息,请指定:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup
恢复备份
Postgres服务器(sudo用户或root):1.停止工作集群:
sudo pg_ctlcluster 11 main stop
2.我们从备份中恢复:
sudo -u postgres pgbackrest --stanza=main --delta restore
3.运行集群:
sudo pg_ctlcluster 11 main start
还原备份后,我们需要执行第二次备份:
仓库(pgbackrest用户): sudo pgbackrest --stanza=main backup
仅此而已。 最后,我想提醒您,无论如何我都不打算自己建立一个高级dba,并且在任何机会下,我都将使用云。 目前,我本人已开始研究各种主题,例如备份,复制,监视等。 我就结果编写了一些小型报告,以便为社区做出一点贡献,并为我自己留些小婴儿床。
在以下文章中,我将尝试讨论其他功能-干净群集上的数据恢复,备份加密和在S3上发布,通过rsync备份。