PostgreSQL 教程: 恢复一个 pg_basebackup 生成的备份

十月 17, 2023

摘要:在备份数据库实例的教程中,我们讨论了如何使用pg_basebackup对 PostgreSQL 实例进行物理备份。我们可能会在各种情况下恢复此备份,例如在复制中创建备用服务器,或将数据库恢复到某个时间点。在本教程中,我们将了解需要哪些步骤,来恢复一个pg_basebackup生成的备份。

准备工作

为了恢复一个使用pg_basebackup进行的备份,用于恢复的新目录的可用存储空间,应该与原始数据目录相同。此外,如果需要,可以通过网络将备份数据复制到需要恢复的目标服务器。

需要以postgres系统用户,将备份数据提取到目标数据目录。因此,很重要的是,需要有postgres系统用户的访问权限,来执行数据库实例的恢复。

操作步骤

以下是将备份数据恢复到/pgdata目录,并使用恢复的数据启动 PostgreSQL 所涉及的步骤:

1. 创建一个需要用于恢复备份的目录。在我们继续步骤 2 之前,该目录需要为空:

$ sudo mkdir -p /pgdata

2. 将base.tar.gz文件解压到目标目录:

$ tar xzf /backup_location/base.tar.gz -C /pgdata

3. 如果数据库服务器包含一个或多个表空间,那么各个表空间也应该提取到不同的目录。从以下日志中可以看出,备份完成后,我们会看到每个表空间都有一个 tar 文件(以表空间的oid编号命名):

$ ls -l /backup_dir/20201027/
total 16816
-rw-------. 1 postgres postgres 1006685 Oct 27 11:48 16575.tar.gz
-rw-------. 1 postgres postgres 1006657 Oct 27 11:48 16576.tar.gz
-rw-------. 1 postgres postgres 15183012 Oct 27 11:48 base.tar.gz
-rw-------. 1 postgres postgres 17094 Oct 27 11:48 pg_wal.tar.gz

在步骤 2 之后,使用base.tar.gz提取的数据目录中会有一个tablespace_map文件:

$ cat /pgdata/tablespace_map
16575 /data_tblspc
16576 /index_tblspc

因此,必须将每个表空间提取到tablespace_map文件中指定的目录:

$ tar xzf 16575.tar.gz -C /data_tblspc
$ tar xzf 16576.tar.gz -C /index_tblspc

4. 将备份时生成的 WAL 段文件解压到pg_wal目录中:

$ tar xzf pg_wal.tar.gz -C /pgdata/pg_wal

5. 使用恢复了备份数据的目录启动 PostgreSQL:

$ pg_ctl -D /pgdata start

怎么做到的

在步骤 1 中,我们创建一个目录,该目录会作为用于恢复任务的数据目录或目标目录。

然后继续步骤 2,将base.tar.gz文件解压到目标目录。

如步骤 3 中所示,我们使用表空间映射将表空间数据提取到相同位置。如果需要调整表空间位置,只需手动修改tablespace_map文件,并为每个表空间添加新位置即可完成。

然后我们继续执行步骤 4,将 WAL 段文件提取到目标目录的pg_wal目录中。成功完成所有四个步骤后,我们就可以使用新的数据目录启动数据库实例,如步骤 5 所示。