PostgreSQL 教程: 使用 pg_basebackup 备份数据库实例

十月 16, 2023

摘要pg_basebackup是 PostgreSQL 内置的二进制格式的备份工具。只有使用pg_basebackup进行的备份才能用于时间点恢复,而使用pg_dumppg_dumpall进行的备份不能。

这也可以从备用数据库服务器执行,而不仅仅是在主数据库服务器。因此,我们可以将备份转移到保持同步且网络速度更快的备用数据库服务器上执行。

pg_basebackup不能以并行模式运行,并且不支持增量或差异备份。因此,当备份文件大小为数百 GB,并存储在和数据库相同的数据中心时,它可能是一个很好的工具。如果备份文件大小为几 TB,并且需要通过网络推送到云端或远程备份服务器,那么明智的做法是,测试pg_basebackup的备份效果,并尝试替代的开源备份工具。

准备工作

为了使用pg_basebackup运行备份,需要一个空目录。如果我们需要每日或每周定期执行备份任务(可能使用 cron 作业进行调度),那么明智的做法是,创建一个带日期的目录来存储每天的备份。

使用pg_basebackup执行备份所需的权限很简单。它只需要给用户分配REPLICATION权限。备份用户必须在执行备份的数据库实例上创建。如果是从备用数据库执行备份,则必须在主数据库上创建用户。

因为pg_basebackup会使用复制协议运行,必须允许用户从使用复制协议运行备份的服务器进行连接。在正在备份的数据库服务器中,以下是需要存在于pg_hba.conf配置文件中的示例条目。

操作步骤

以下是使用pg_basebackup从主服务器或备用服务器执行备份所涉及的步骤:

1. 它需要一个空的目标目录来执行备份:

$ sudo mkdir -p /backup_dir/`date +"%Y%m%d"`
$ sudo chown -R postgres:postgres /backup_dir/`date +"%Y%m%d"`

2. 创建需要执行备份的用户。该用户需要REPLICATION权限才能执行备份:

$ psql -U postgres -c "CREATE USER backup_user WITH REPLICATION PASSWORD 'secret'"

3. 在pg_hba.conf文件中添加适当的条目以允许复制连接,并执行重新加载:

$ echo "host replication backup_user <backup_server_hostname>/32 md5" >> $PGDATA/pg_hba.conf
$ psql -c "select pg_reload_conf()"

4. 使用以下pg_basebackup语法准备好命令,来执行备份:

$ pg_basebackup -h <hostname> -U <user> -p <port> -D <target_directory> -c <checkpoint_mode> -F<format> -P -X<wal_method> -l <backup_label>

以下是使用pg_basebackup的示例命令,它会生成运行在192.168.90.70的 PostgreSQL 实例的备份:

$ pg_basebackup -h 192.168.90.70 -U backup_user -p 5432 -D /backup_dir/`date +"%Y%m%d"` -c fast -Ft -z -P -Xs -l backup_label

怎么做到的

在步骤 1 中,我们创建一个新目录来存储备份。虽然pg_basebackup会自动创建目标目录,但在缺乏权限时会失败。

下一步是创建可以执行pg_basebackup的用户。虽然超级用户postgres也可以用来进行备份,但是,建议始终将超级用户仅用于管理操作。因此,我们在步骤 2 中,在主数据库服务器上创建一个backup_user

因为pg_basebackup会使用复制协议,所以需要允许用户从备份服务器建立复制连接。在步骤 3 中,我们在数据库服务器的pg_hba.conf配置文件中添加条目,以允许使用backup_user192.168.90.70进行复制连接。该条目必须存在于backup_user正在连接以进行备份的服务器上。然后,我们需要执行重新加载以使更改生效。

最后一步是备份。在步骤 4 中,我们看到了用于执行备份的语法。它以主机名开头,可以是backup_user连接的数据库服务器的 IP 或主机名,然后是用户名,后面是运行数据库实例的端口。我们还使用-D指定需要在其中创建备份的目录。

因为pg_basebackup会等待完成一次检查点,我们可以指示进行快速启动,或分散到命令执行过程中的检查点,而不是等待。然后我们看到了备份的格式。它可以采用 tar 或原始格式。我们还可以使用-z将其压缩成 tar 格式的备份。-Ft代表 tar 格式,-Fp代表原始格式。为了显示进度,我们可以使用-P,以便我们知道等待备份完成需要多长时间。

pg_basebackup也可以用于设置复制。在这种情况下,使用-R会使我们的工作变得非常简单。它会在postgresql.auto.conf配置文件中,创建所需的参数条目,以设置复制。

由于备份需要在线执行,通常会有很多数据库事务正在运行,可能会生成大量的 WAL 段。pg_basebackup为了保证生成一致的备份数据,它还需要获取备份期间生成的 WAL。我们可以使用并行运行的流复制传输 WAL,也可以在备份完成后获取所有 WAL。由于 WAL 段在达到一定阈值后会被回收,因此有时使用-Xs,流式传输它们可能会更安全。否则,我们可以使用-Xf,在备份完成后获取 WAL 段。最后,为了给备份添加标签,我们可以使用-l