如何在 Ubuntu 20.04 上使用 PostgreSQL 12 设置连续存档并执行时间点恢复

作者选择了 多样性在技术基金作为 写给捐款计划的一部分接受捐款。

介绍

PostgreSQL是一个广泛使用的关系数据库,支持 ACID 交易. ACID 简称是原子性,一致性,隔离和耐用性。

PostgreSQL 使用的一种方法来维持 ACID 属性是 Write-Ahead Logging (WAL). PostgreSQL 首先记录数据库中的任何交易到 WAL 日志文件,然后在数据库集群的数据文件中写出更改之前。

通过连续存档,WAL文件被复制到二级存储中,这有几个好处,例如,二级数据库集群可以使用已存档的WAL文件进行复制,但您也可以使用这些文件进行点时恢复(PITR)。

在本教程中,您将在Ubuntu 20.04上设置PostgreSQL 12集群的连续存档,并在集群上执行PITR。

前提条件

要完成本教程,您将需要以下内容:

一个单一的机器运行Ubuntu 20.04. 初始服务器设置指南将指导您通过设置服务器,包括非根用户与相应的权限。

  • PostgreSQL 12在机器上运行。

步骤 1 – 在数据库集群中配置连续存档

在此第一步中,您需要配置您的 PostgreSQL 12 集群以将集群的 WAL 文件存档到与集群的数据目录不同的目录中。

创建一个新的目录如下:

1mkdir database_archive

现在您需要给默认的 PostgreSQL 用户postgres允许写入此目录,您可以通过使用chown命令更改目录的所有权来实现这一目标:

1sudo chown postgres:postgres database_archive

现在你已经设置了一个目录,以便将WAL文件存档到集群中,你必须在postgresql.conf配置文件中启用存档,默认情况下你可以在/etc/postgresql/12/main/目录中找到。

使用您的文本编辑器打开配置文件:

1sudo nano /etc/postgresql/12/main/postgresql.conf

一旦你打开了文件,你会通过删除从行开始的#删除archive_mode变量对该行的评论,也将archive_mode的值更改为on如下:

1[label /etc/postgresql/12/main/postgresql.conf]
2. . .
3archive_mode = on
4. . .

您还将指定群集使用的命令来存档文件 PostgreSQL 提供一个存档命令,将为本教程工作,您可以在官方 PostgreSQL docs中阅读该命令。

1[label /etc/postgresql/12/main/postgresql.conf]
2. . .
3archive_command = 'test ! -f /path/to/database_archive/%f && cp %p /path/to/database_archive/%f'
4. . .

这里的档案命令首先检查是否已经存在WAL文件在档案中,如果没有,它将WAL文件复制到档案中。

取代 /path/to/database_archive 以您之前创建的 database_archive 目录的路径,例如,如果您在您的主目录中创建了此处: ~/database_archive

最后,您需要配置 wal_level 变量. wal_level 决定 PostgreSQL 将多少信息写入日志. 对于连续的存档,这至少需要设置为 replica:

1[label /etc/postgresql/12/main/postgresql.conf]
2. . .
3#wal_level = replica
4. . .

这是PostgreSQL 12中的默认值,所以您不应该更改它,但如果您要更改这个变量,它是值得记住的。

您现在可以保存和退出您的文件。

要实现数据库集群配置文件的更改,您需要如下重启集群:

1sudo systemctl restart postgresql@12-main

如果 PostgreSQL 成功重新启动,则集群会将每个 WAL 文件在完整后存档,默认情况下每个 WAL 文件为 16 MB。

如果您需要立即存档交易,则可以通过在集群上运行以下命令强制数据库集群更改和存档当前WAL文件:

1sudo -u postgres psql -c "SELECT pg_switch_wal();"

随着数据库集群成功地将WAL文件复制到档案中,您现在可以对数据库集群的数据文件进行物理备份。

步骤 2 — 执行 PostgreSQL 集群的物理备份

重要的是要定期备份您的数据库,以帮助减轻数据丢失,如果最糟糕的情况发生。PostgreSQL允许您对数据库集群进行逻辑和物理备份。但是,对于PITR,您需要对数据库集群进行物理备份。也就是说,您需要在PostgreSQL的数据目录中复制所有数据库文件。默认情况下,PostgreSQL 12数据目录是 /var/lib/postgresql/12/main/

<$>[注] **注:**您也可以通过在集群上运行以下命令来查找数据目录的位置:

1sudo -u postgres psql -c "SHOW data_directory;"

美元

在之前的步骤中,您创建了名为database_archive的目录,以存储所有已存档的WAL文件. 在此步骤中,您需要创建另一个名为database_backup的目录,以存储您将进行的物理备份。

再一次,创建该目录:

1mkdir database_backup

现在确保postgres用户通过更改所有权来写入目录的权限:

1sudo chown postgres:postgres database_backup

现在你有一个备份目录,你需要对数据库集群的数据文件进行物理备份. 幸运的是,PostgreSQL 拥有内置的 pg_basebackup 命令,为你执行一切。

1sudo -u postgres pg_basebackup -D /path/to/database_backup

取代 /path/to/ 以通往目录的路径。

使用此数据库集群的物理备份,您现在可以对集群执行时刻恢复。

步骤 3 – 在数据库集群上执行点时恢复

现在,您至少有一个数据库的物理备份,并且正在存档 WAL 文件,您现在可以执行 PITR,如果需要将数据库重回以前的状态。

首先,如果数据库仍在运行,则需要关闭它,您可以通过运行systemctl stop命令来完成此操作:

1sudo systemctl stop postgresql@12-main

一旦数据库不再运行,您需要删除PostgreSQL数据目录中的所有文件,但首先,您需要将pg_wal目录移动到另一个位置,因为它可能包含对恢复至关重要的未存档WAL文件。

1sudo mv /var/lib/postgresql/12/main/pg_wal ~/

现在,您可以完全删除 /var/lib/postgresql/12/main 目录并将其重建为:

1sudo rm -rf /var/lib/postgresql/12/main

随后由:

1sudo mkdir /var/lib/postgresql/12/main

现在,您需要将所有文件从您在上一个步骤中创建的物理备份复制到新的空数据目录。

1sudo cp -a /path/to/database_backup/. /var/lib/postgresql/12/main/

您还需要确保数据目录具有postgres用户作为所有者和适当的权限。

1sudo chown postgres:postgres /var/lib/postgresql/12/main

更新许可证:

1sudo chmod 700 /var/lib/postgresql/12/main

从物理备份中复制的pg_wal目录中的WAL文件是过时的,没有用处,您需要用您复制的pg_wal目录中的WAL文件来代替它们,因为有些文件在停止服务器之前可能没有被存档。

请在 /var/lib/postgresql/12/main 目录中删除 pg_wal 文件,如下所示:

1sudo rm -rf /var/lib/postgresql/12/main/pg_wal

现在,从您保存的pg_wal目录中复制文件,然后清除数据目录:

1sudo cp -a ~/pg_wal /var/lib/postgresql/12/main/pg_wal

当数据目录被正确恢复时,您需要配置恢复设置,以确保数据库服务器正确恢复已存档的 WAL 文件。

打开配置文件:

1sudo nano /etc/postgresql/12/main/postgresql.conf

一旦你打开了文件,找到restore_command变量并从行开始删除#字符。就像你在第一个步骤中做过的archive_command一样,你需要指定 PostgreSQL 应该如何恢复 WAL 文件。

1[label /etc/postgresql/12/main/postgresql.conf]
2. . .
3restore_command = 'cp /path/to/database_archive/%f %p'
4. . .

请记住,用到您的档案目录的路径代替 /path/to/database_archive/

接下来,您可以选择指定恢复目标。这是数据库集群在离开恢复模式之前将尝试恢复的位置。恢复目标可以是时刻印、交易ID、日志序列号、使用pg_create_restore_point()命令创建的恢复点的名称,或者每当数据库达到一致状态时,如果没有指定恢复目标,数据库集群将通过存档中WAL文件的整个日志读取。

有关recovery_target变量选项的完整列表,请参阅 官方 PostgreSQL 文档

<$>[注] 注: 恢复目标必须是在您正在使用的物理备份完成后一个时间点。

设置restore_commandrecovery_target后,保存并退出文件。

在重新启动数据库集群之前,您需要告知 PostgreSQL 它应该在恢复模式下启动,您可以通过在集群的数据目录中创建一个名为recovery.signal的空文件来实现这一目标。

1sudo touch /var/lib/postgresql/12/main/recovery.signal

现在,您可以通过运行以下方式重新启动数据库集群:

1sudo systemctl start postgresql@12-main

如果数据库成功启动,它将进入恢复模式.一旦数据库集群达到恢复目标,它将删除recovery.signal文件。

现在您已成功恢复数据库集群到所需状态,您可以开始正常的数据库操作. 如果您想要恢复到不同的时间点,您可以重复此步骤。

结论

在本教程中,您设置了一个 PostgreSQL 12 数据库集群来存档 WAL 文件,然后使用已存档的 WAL 文件进行时刻恢复。

要了解更多有关连续档案和时刻恢复的信息,您可以阅读 docs

有关 PostgreSQL 的更多教程,请参阅我们的 PostgreSQL 主题页面

Published At
Categories with 技术
comments powered by Disqus