Skip to main content
Version: 1.0.14

备份与恢复

备份是保障数据安全的重要手段。任何从事数据库管理相关工作的人员都需要高度重视备份工作。Halo 的备份机制主要有:

  • 逻辑备份
  • 物理备份

逻辑备份与恢复

逻辑备份的原理是将数据库中的对象和数据转储成对应的 SQL 命令。通常我们使用 pg_dump/pg_restore 命令来完成逻辑备份和恢复。

备份

假设我们要备份名为 halotest 的数据库:

pg_dump -Fc -v -f halotest.dump halotest

命令成功结束后,会生成一个 halotest.dump 的备份文件。

恢复

假设我们需要对 halotest 进行恢复:

pg_restore -v -C -d halo0root halotest.dump

这样,halotest 数据库就完成了恢复。

物理备份与恢复

物理备份的原理是复制数据文件和归档日志,当需要恢复时,先恢复备份的数据文件,然后从归档日志中"重放"来恢复到需要的恢复点。物理备份相比逻辑备份,通常速度更快,尤其是数据库比较大时,性能优势更加显著。而且物理备份可以进行按时间点的恢复(PITR),这是逻辑备份无法做到的。

这里我们要用到 rman2。

RMAN2 介绍

RMAN2(Recovery Manager),它可以用来备份和恢复数据库文件、归档日志和控制文件,用来执行完全或不完全的数据库恢复。RMAN2 特有的优势是跳过未使用的数据块。当备份一个 RMAN2 备份集时,RMAN2 不会备份从未被写入的数据块。另外,RMAN2 使用二进制压缩模式,能够最大程度地压缩数据块中的一些典型数据。

前提条件

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

archive_mode 是否打开归档模式。默认值为 off。设置为 on 即为打开。

archive_command 归档命令。即复制 WAL 日志的命令。简单的命令可参考:

test ! -f <archive_path>/%f && cp %p <archive_path>/%f

初始化备份目录

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

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

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

rman2 add-instance -B /data/backup -D /data/halo --instance=node1d1

其中:

  • /data/backup:备份目录
  • /data/halo:数据目录
  • node1d1:备份实例的名称,即备份目录下的一个目录名称

全量备份

不压缩全量备份

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

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

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

参数说明:

参数说明
-b备份类型:FULL(全量)、DELTA(差异)、PAGE(页级)
--compress压缩参数
--stream启用流式备份,通过复制协议从数据库服务器实时获取 WAL 文件
--progress实时显示备份进度
--backup-pg-log将日志目录纳入备份

查看备份集

rman2 show -B /data/backup

对备份集执行校验

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

增量备份

DELTA(差异)

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

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'

然后执行:

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

全量恢复数据库

恢复前需保证数据目录为空:

rman2 restore -B ${backup_dir} -D /home/halo/data --instance=node1d1 --progress --no-validate

参数说明:

  • --no-validate:跳过备份后的自动验证,可节省恢复时间
  • -B:备份目录
  • -D:要恢复到的目录

基于时间点恢复(PITR)

需要先配置归档模式。恢复到本地其他目录:

rman2 restore -B ${backup_dir} -D /home/halo/data --instance=node1d1 --progress --recovery-target-time="2025-08-08 10:00:16"