WAL-G是一个开源连续归档工具用于在 Postgres 中轻松设置和恢复物理备份。它主要处理与所选云存储提供商之间的物理备份和 WAL 档案的存储和检索。在本周的 TIL Postgres 中,我们将向您介绍如何轻松地为您的数据库设置 WAL-G,并指导您在灾难发生时如何做。

先决条件

对于本教程,我们将使用两个在Ubuntu 18.04上运行 Postgres 数据库的实例。一个实例将充当您的主数据库,另一个是您的恢复数据库。请注意,如果您使用的是其他操作系统,则某些文件路径可能会有所不同。

安装

确保在您的实例中安装了以下软件包。或者,您可以启动Supabase Postgres的最新版本,它已经配置和安装了所有内容,以及其他好东西。它在AWS或Digital Ocean市场上很容易获得,并且只需几分钟即可运行。

Postgres 12

快速安装指南可在此处找到。

发送

envdir允许我们根据提供的目录中的文件在修改后的环境中运行其他程序。这可以通过daemontools包安装:

$ sudo apt-get install -y daemontools

WAL-G

$ wget https://github.com/wal-g/wal-g/releases/download/v0.2.15/wal-g.linux-amd64.tar.gz
$ tar -zxvf wal-g.linux-amd64.tar.gz
$ mv wal-g /usr/local/bin/

AWS 凭证和资源

在存储备份时,WAL-G 有众多的云存储提供商选项供我们选择。对于本教程,我们将使用 AWS。做好以下准备:

  • AWS 访问密钥和密钥。

  • S3 存储桶。

设置

1\。配置环境变量

创建目录/etc/wal-g.d/env并包含存储环境变量的文件。它稍后将通过 envdir 在 WAL-G 命令中使用。

$ umask u=rwx,g=rx,o=
$ mkdir -p /etc/wal-g.d/env
$ echo 'secret-key-content' > /etc/wal-g.d/env/AWS_SECRET_ACCESS_KEY
$ echo 'access-key' > /etc/wal-g.d/env/AWS_ACCESS_KEY_ID
$ echo 's3://backup-bucket/project-directory' > /etc/wal-g.d/env/WALG_S3_PREFIX
$ echo 'db password' > /etc/wal-g.d/env/PGPASSWORD
$ chown -R root:postgres /etc/wal-g.d

2\。启用 WAL 归档

在这里,我们启用WAL 归档并指示 Postgres 通过 WAL-G 将归档存储在指定的 S3 存储桶中。

$ echo "archive_mode = yes" >> /etc/postgresql/12/main/postgresql.conf
$ echo "archive_command = 'envdir /etc/wal-g.d/env /usr/local/bin/wal-g wal-push %p'" >> /etc/postgresql/12/main/postgresql.conf
$ echo "archive_timeout = 60" >> /etc/postgresql/12/main/postgresql.conf

3\。重启数据库

重新启动数据库以使配置中的更改生效。

$ sudo /etc/init.d/postgresql restart

4\。创建您的第一个物理备份

$ sudo -su postgres envdir /etc/wal-g.d/env /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main

此时,如果您要检查您提供的 S3 路径,将观察到以下两个新创建和填充的目录:

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--vBQOpst8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/lai1mxg62kffyd2khmtm.png)

从那时起,后续的物理备份将在目录basebackups_005中找到,并且任何 WAL 存档都将发送到目录wal_005

5. [可选] 安排定期物理备份

然后可以将 CRON 作业设置为安排每天执行的物理备份:

$ echo "0 0 * * * postgres /usr/bin/envdir /etc/wal-g.d/env /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main" > /etc/cron.d/pg_backup

在这里,已指示实例在每天开始时的午夜备份数据库。通过定期物理备份您的实例,整体恢复时间可能会更快。与从一个月前的备份中恢复相比,从昨天的物理备份恢复将导致需要重放的 WAL 归档文件更少。


灾难来袭

数据库或实例出现问题。现在,我们将使用 S3 存储桶中可用的物理备份来恢复我们的所有数据并将其还原到新实例。

1\。配置环境变量

配置应该与原始实例相同。对于恢复和恢复,我们不需要变量PGPASSWORD

$ umask u=rwx,g=rx,o=
$ mkdir -p /etc/wal-g.d/env
$ echo 'secret-key-content' > /etc/wal-g.d/env/AWS_SECRET_ACCESS_KEY
$ echo 'access-key' > /etc/wal-g.d/env/AWS_ACCESS_KEY_ID
$ echo 's3://backup-bucket/project-directory' > /etc/wal-g.d/env/WALG_S3_PREFIX
$ chown -R root:postgres /etc/wal-g.d

2\。停止数据库

$ sudo /etc/init.d/postgresql stop

3\。切换到用户postgres

$ sudo -su postgres

4\。准备数据库以进行恢复

设置恢复_command

通过restore_command,我们指示 Postgres 从我们的 S3 存储桶中提取所有 WAL 存档以在恢复期间使用。

$ echo "restore_command = '/usr/bin/envdir /etc/wal-g.d/env /usr/local/bin/wal-g wal-fetch \"%f\" \"%p\" >> /tmp/wal.log 2>&1'" >> /etc/postgresql/12/main/postgresql.conf

[可选] 实现时间点恢复 (PITR)

如果我们只想将数据库恢复到某个时间点(例如,就在灾难发生之前),我们可以通过同时设置recovery_target_time和recovery_target_action来实现.请注意,时区需要与原始实例的时区匹配。这通常在 UTC (+00) 时区。

$ echo "recovery_target_time = '2020-07-27 01:23:00.000000+00'" >> /etc/postgresql/12/main/postgresql.conf
$ echo "recovery_target_action = 'promote'" >> /etc/postgresql/12/main/postgresql.conf

5\。从物理备份恢复

当前数据目录将被删除,并替换为 S3 存储桶中最新版本的物理备份。

$ rm -rf /var/lib/postgresql/12/main
$ envdir /etc/wal-g.d/env /usr/local/bin/wal-g backup-fetch /var/lib/postgresql/12/main LATEST

6\。创建recovery.signal文件

此文件指示 Postgres 数据库应在启动时进入恢复模式。

$ touch /var/lib/postgresql/12/main/recovery.signal

7\。注销postgres并启动数据库

$ exit
$ sudo /etc/init.d/postgresql start

一旦 Postgres 完成启动并完成恢复模式,所有数据或直到指定时间点的数据都将成功恢复到新实例。避免了灾难。


TIL Postgres 是Supabase的一个正在进行的系列,旨在定期分享有关 PostgreSQL 的信息片段,并希望为您提供新的学习知识。 😉

任何关于我们未来功能和免费赠品的新帖子或公告都将首先在 DEV 上发布。关注我们,以免错过。

[follow gif](https://res.cloudinary.com/practicaldev/image/fetch/s--uUWzDn3x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://res.cloudinary. com/practicaldev/image/fetch/s--uyA__P-6--/c_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jf7adc5e3kbdu4luxvt4.gif)

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐