跳到主要内容

物理备份与恢复

RMAN2 概述​

RMAN2(Recovery Manager)是 Halo 数据库的物理备份与恢复工具,提供完整的企业级备份与恢复能力。

RMAN2 的主要特性包括:

  • 三种备份模式:FULL(全量)、DELTA(差异)、PAGE(页级),支持灵活的备份策略
  • 流式备份(--stream):通过复制协议实时获取 WAL 文件,确保备份完整性
  • 压缩备份(--compress):支持 zlib 和 pglz 算法,节省磁盘空间
  • 并行处理(-j):多线程并行执行备份、恢复、校验等操作
  • 备份校验(validate):自动或按需校验备份完整性
  • 基于时间点恢复(PITR):支持恢复到指定时间点、LSN 或事务 ID
  • 跳过未使用数据块:备份时不会备份从未被写入的数据块,节省空间

前提条件​

要让数据库能够进行物理备份,需要将数据库运行在归档模式下。设置归档模式主要涉及 2 个系统参数:

  • archive_mode:是否打开归档模式。默认值为 off。设置为 on 即为打开。
  • archive_command:归档命令。即复制 WAL 日志的命令。简单的命令可参考:test ! -f <archive_path>/%f && cp %p <archive_path>/%f,其中 <archive_path> 需替换为实际存放 WAL 归档文件的目录(需提前创建并保证 halo 用户有读写权限),%p 和 %f 是数据库内置占位符(分别代表 WAL 文件的完整路径和文件名),保持原样不要修改。

初始化备份目录​

我们需要设置一个目录来存放备份文件,该目录需要进行初始化操作。

mkdir -p /data/backup
chown halo:halo /data/backup
export BACKUP_PATH=/data/backup
rman2 init -B /data/backup

添加需要备份的数据库实例

  • /data/backup:备份目录
  • /data/halo:数据目录
  • node1d1:备份实例的名称,即备份目录下的一个目录名称,名称可以随便取
rman2 add-instance -B /data/backup -D /data/halo --instance=node1d1

全量备份​

rman2 backup 常用参数说明:

  • -b:备份模式,可选值:FULL(全量)、DELTA(差异)、PAGE(页级)
  • --compress:启用压缩
  • --stream:启用流式备份(STREAM),通过复制协议从数据库服务器实时获取所需的 WAL 文件,确保备份完整性
  • --progress:实时显示备份进度
  • --backup-pg-log:将日志目录(通常包含消息日志)纳入备份,默认情况下排除此目录

1、不压缩全量备份

rman2 backup -B /data/backup -b FULL --instance=node1d1 --stream --progress --backup-pg-log

2、压缩全量备份并且备份日志

rman2 backup -B /data/backup -b FULL --instance=node1d1 --compress --stream --progress --backup-pg-log

3、查看备份集

rman2 show -B /data/backup

4、对备份集执行校验

rman2 validate -B /data/backup --instance=node1d1 -i SIJP3R --progress -j 4

增量备份​

1、DELTA(差异)

rman2 backup -B /data/backup -b DELTA --instance=node1d1 --stream --progress -j 4

2、PAGE(页级)

采用 PAGE 级增量备份前,需先在 postgresql.conf 中配置归档与恢复命令:

archive_command = '/u01/app/halo/product/dbms/16/bin/rman2 archive-push -B /data/backup --instance=node1d1 --wal-file-name=%f --wal-file-path=/data/halo/pg_wal'
restore_command = '/u01/app/halo/product/dbms/16/bin/rman2 archive-get -B /data/backup --instance=node1d1 --wal-file-name=%f --wal-file-path=%p'

执行 PAGE 级增量备份:

rman2 backup -B /data/backup -b PAGE --instance=node1d1 --stream --progress -j 4

全量恢复​

重要: 无论恢复到哪个目录,目标目录在恢复前必须为空,否则 rman2 将拒绝执行恢复。

rman2 restore 常用参数说明:

  • -B:备份目录,即存放备份文件的目录
  • -D:恢复目标目录,即数据要恢复到的目录(必须为空目录)
  • --instance:备份实例名称
  • --progress:实时显示恢复进度
  • --no-validate:恢复前跳过对备份集的校验,可加快恢复速度(默认会先校验备份完整性)

根据业务需要,恢复目标目录可以选择原数据目录或全新目录两种方式:

1、恢复到原数据目录(灾难恢复)

原库发生故障需要恢复回原位时,需先停止数据库服务并清空原数据目录,再执行恢复。以原数据目录 /data/halo 为例:

# 停止数据库服务后,清空原数据目录(请确认已备份再清空)
rm -rf /data/halo/*

rman2 restore -B /data/backup -D /data/halo --instance=node1d1 --progress

2、恢复到全新目录(搭建备库 / 验证备份)

无需影响正在运行的数据库,将数据恢复到一个新建的空目录中:

# 新建并授权一个空目录
mkdir -p /data/halo_restored
chown halo:halo /data/halo_restored

rman2 restore -B /data/backup -D /data/halo_restored --instance=node1d1 --progress

基于时间点恢复​

基于时间点恢复(PITR)需要先配置归档模式。

PITR 通常恢复到一个全新的空目录,以便回放 WAL 到指定的时间点。以恢复到 /data/halo_restored 为例:

rman2 restore -B /data/backup -D /data/halo_restored --instance=node1d1 --progress --recovery-target-time="2025-08-08 10:00:16"