备份与恢复
备份是保障数据安全的重要手段。任何从事数据库管理相关工作的人员都需要高度重视备份工作。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"