物理备份与恢复
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"