首先,使用底层命令进行基本备份的标准过程如下所示:
- 发出
pg_start_backup
命令 - 使用你想用的归档命令获取数据库集簇的快照
- 发出
pg_stop_backup
命令
这个简单的过程对于DBA来说很容易操作,因为它不需要特殊工具,只需要常用工具(如复制命令或类似的归档工具)来创建基本备份。此外,在此过程中,不需要获取表上的锁,所有用户都可以在不受备份操作影响的情况下发起查询。相对于其他开源关系型数据库,这是一个巨大的优势。
更简单的方式是使用pg_basebackup
命令来做基础备份,不过在它内部也是使用这些底层命令来工作的。
图10.1 制作基础备份
由于这些命令对显然是理解PITR的关键点之一,我们将在以下小节中探讨它们。
pg_start_backup
和pg_stop_backup
命令定义在:src/backend/access/transam/xlogfuncs.c
。
10.1.1 pg_start_backup
pg_start_backup
开始为制作基础备份进行准备工作。如 9.8 PostgreSQL中的数据库恢复 所述,恢复过程从重做点开始,因此pg_start_backup
必须执行检查点,以便在制作基础备份的开始时刻显式创建一个重做点。此外,这次检查点的检查点位置必须保存在不同于pg_control
的其他文件中,因为在备份期间可能会进行多次常规检查点。因此pg_start_backup
执行下列四个操作:
- 强制进入整页写入 模式。
- 切换到当前的WAL段文件(8.4或更高版本)。
- 执行检查点。
- 创建
backup_label
文件 —— 该文件创建于基本目录顶层中,包含有关该基本备份本身的关键信息,例如检查点的检查点位置。
第三和第四个操作是该命令的核心。第一和第二个操作是为了更可靠地恢复数据库集簇。
备份标签backup_label
文件包含以下六个项目(11或更新版本为七个项目):
- 检查点位置(
CHECKPOINT LOCATION
) —— 该命令所创建检查点的LSN位置。 - WAL开始位置(
START WAL LOCATION
) —— 这不是给PITR用的,而是为 第十一章 流复制 描述的流复制准备的。它被命名为START WAL LOCATION
,因为复制模式下的备用服务器在初始启动时只读取一次该值。 - 备份方法(
BACKUP METHOD
) —— 这是用于进行此基本备份的方法。 (pg_start_backup
或pg_basebackup
) - 备份来源(
BACKUP FROM
) —— 说明此备份是从主库还是备库拉取。 - 开始时间(
START TIME
) —— 这是执行pg_start_backup
时的时间戳。 - 备份标签(
LABEL
) —— 这是pg_start_backup
中指定的标签。 - 开始时间线(
START TIMELINE
) —— 这是备份开始的时间线。这是为了进行正常性检查,在版本11中被引入。
备份标签
一个9.6版本中备份标签的实际例子如下所示:
postgres> cat /usr/local/pgsql/data/backup_label START WAL LOCATION: 0/9000028 (file 000000010000000000000009) CHECKPOINT LOCATION: 0/9000060 BACKUP METHOD: pg_start_backup BACKUP FROM: master START TIME: 2018-7-9 11:45:19 GMT LABEL: Weekly Backup
可以想象,当使用此基础备份恢复数据库时,PostgreSQL从backup_label
文件中取出检查点位置CHECKPOINT LOCATION
,然后从归档日志中的合适位置读取检查点记录,然后从检查点记录中获取重做点的位置,最后从重做点开始进行恢复过程(下一节将介绍细节)。
10.1.2 pg_stop_backup
pg_stop_backup
执行以下五个操作以完成备份。
- 如果
pg_start_backup
打开了整页写入 ,那么关闭整页写入 。 - 写入一条备份结束的XLOG记录。
- 切换WAL段文件。
- 创建一个备份历史记录文件 —— 此文件包含
backup_label
文件的内容,以及已执行pg_stop_backup
的时间戳。 - 删除
backup_label
文件 —— 从基础备份恢复需要backup_label
文件,不过一旦被复制,原始的数据库集簇中就不需要它了。
备份历史文件的命名方法如下所示:
{WAL段文件名}.{基础备份开始时的偏移量}.backup