PostgreSQL 教程: 启用 WAL 归档

十月 24, 2023

摘要:在本教程中,您将学习如何在 PostgreSQL 中启用 WAL 归档。

归档是将历史信息存储在安全位置以供恢复的概念。同样,在数据库技术中,我们看到事务日志(PostgreSQL 中的 WAL)被归档到远程的备份服务器或云存储,以便在灾难期间恢复数据库。由于 WAL 段在达到一定阈值后会被回收,因此,在它们从服务器上消失之前,将它们归档到安全存储中非常重要。这也有助于时间点恢复PITR),另外,在备用数据库落后于主数据库,并且需要最近删除的 WAL 段恢复同步的情况下,也很有帮助。在本教程中,我们将了解在 PostgreSQL 中启用归档所涉及的步骤。

准备工作

在 PostgreSQL 中,默认情况下不会启用归档。要启用归档,需要重新启动 PostgreSQL 实例。因此,我们需要确保在生产环境的 PostgreSQL 服务器上线之前启用归档。另外,我们还必须确保选择一个冗余且容灾安全的存储,来存储 WAL 日志归档。

操作步骤

请按照以下步骤,完成本教程:

1. 通过运行以下命令,验证archive_mode

$ psql -c "show archive_mode"

2. 使用ALTER SYSTEM命令,设置archive_modeON,启用归档:

$ psql -c "ALTER SYSTEM SET archive_mode TO 'ON'"

3. 通过运行以下命令重新启动 PostgreSQL:

$ pg_ctl -D $PGDATA restart -mf

4. 创建归档位置,并将所有权赋予给postgres

$ mkdir -p /backups/archive
$ chown postgres:postgres /backups/archive

5. 使用适当的 shell 命令或脚本设置archive_command,将 WAL 归档复制到安全位置。创建归档位置,并将所有权赋予给postgres

$ mkdir -p /backups/archive
$ psql -c "ALTER SYSTEM SET archive_command TO 'cp %p /backups/archive/%f'"

6. 运行reloadSIGHUP,以使对archive_command参数所做的更改生效:

$ psql -c "select pg_reload_conf()"

怎么做到的…

要将 WAL 段归档到永久存储,可按照下列步骤操作:

  1. archive_mode参数设置为 ON(需要重新启动)。
  2. archive_command参数设置为,可以将 WAL 日志发送到归档位置的 shell 命令或脚本。

在设置归档到某个位置之前,我们必须验证archive_mode是否设置为 ON,如步骤 1 所示。如果未设置为 ON,我们可以使用步骤 2 中所示的命令将其设置为 ON。因为更改archive_mode需要重新启动,我们需要使用类似于步骤 3 中看到的命令,重新启动 PostgreSQL 实例。

要将 WAL 段复制到不同的位置进行归档,我们需要提供适当的 shell 命令,该命令可用于执行复制。在上面的设置中,我们尝试将 WAL 段安全地归档到挂载名为/backups的 NAS 存储。因此,我可以让归档进程发出一个简单的复制命令,将 WAL 段复制到 NAS 存储的挂载点,如步骤 5 所示。

这里,%p => 指的是要归档的 WAL 段的路径,而 %f => 指的是 WAL 段的名称。这两个值会由 PostgreSQL 替换。

现在,为了使archive_command更改生效,我们必须执行一次reloadSIGHUP,如步骤 5 所示。完成后,归档将生效。

还有更多…

例如,在使用前面提到的 shell 命令设置好archive_command后,PostgreSQL 执行的用于归档一个 WAL 段的命令,可能如下所示:

cp /var/lib/pgsql/12/data/pg_wal/00000001000000D2000000C9 /backups/archive/00000001000000D2000000C9

正如您所看到的,它将 WAL 段复制到 shell 命令中指定的位置。