跳到主要内容
版本:1.0.14

物理备份与恢复

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

这里我们要用到rman。

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

前要条件

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

archive_mode

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

archive_command

归档命令。即复制WAL日志的命令。简单的命令可参考:test ! -f <archive_path>/%f && cp %p <archive_path>/%f

备份初始化

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

$ mkdir -p /data/halo_backup
$ chown halo:halo /data/halo_backup
$ export BACKUP_PATH=/data/halo_backup
$ rman init

整个数据库的完全备份

完全备份即完整复制整个数据库群集和归档日志。使用下面的命令即可完成完全备份:
$ rman backup -b full

备份完成后,我们可以查看备份的信息:
$ rman show detail
======================================================================================================================

StartTime EndTime Mode Data ArcLog SrvLog Total Compressed CurTLI ParentTLI Status
======================================================================================================================

2022-02-08 16:16:57 2022-02-08 16:17:00 FULL 24MB 33MB ---- 50MB false 1 0 DONE

这样备份之后我们可以看到状态为done,备份完成后需要进行有效性校验(只有有效性检验完成的备份才能被用于恢复,状态为ok。):
$ rman validate
$ rman show detail

======================================================================================================================
StartTime EndTime Mode Data ArcLog SrvLog Total Compressed CurTLI ParentTLI Status
======================================================================================================================

2022-02-08 16:16:57 2022-02-08 16:17:00 FULL 24MB 33MB ---- 50MB false 1 0 OK

当然我们也可以一步到位,备份完立即生效:
$ rman backup -b full --validate-backup
$ rman show detail

======================================================================================================================
StartTime EndTime Mode Data ArcLog SrvLog Total Compressed CurTLI ParentTLI Status
======================================================================================================================
2022-02-08 17:11:43 2022-02-08 17:11:45 FULL 24MB 33MB ---- 50MB false 1 0 OK

增量备份

增量备份即只备份变化的数据块和归档日志。增量备份必须先要有一个有效的完全备份。使用下面的命令即可完成增量备份:

$ rman backup -b incremental

同样的,需要进行有效性校验:

$ rman validate

归档备份

顾名思义,即只备份归档日志文件。备份数据库需要消耗大量的I/O,因此我们不可能在业务时段进行数据库备份作业。通常会安排在业务低峰期,比如夜间进行数据库备份作业。但是如果只进行数据库备份,我们很可能会丢失较长一段时间内的数据,即RPO无法达到较好的值。通过合理备份归档,我们可以有效的降低RPO,这也是数据库备份很重要的一个环节。要完成归档备份,我们可以使用以下命令:

$ rman backup -b archive

同样的,需要进行有效性校验:

$ rman validate

备份的有效性检查

一般在备份之后状态为done,备份完成后需要进行有效性校验(只有有效性检验完成的备份才能被用于恢复,状态为ok。):

$ rman validate -mode=size|crc

也可以在执行备份命令的同时使用—-validate-backup使得备份完立即生效,例如完全备份并立即生效:

$ rman backup -b full --validate-backup --validate-mode=size|crc

mode有size和crc两个值。size只校验备份大小,校验速度较快。crc 会检查数据块的完整性,缺点是校验速度较慢。默认值是size。

备份管理

一般的,使用下面的命令查询备份:

$ rman show detail [date]

删除备份:

$ rman delete [date]

还可以加上日期使用,例如查询2022-02-11的所有备份:

$ rman show detail '2022-02-08'
=========================================================================================================== ===========

StartTime EndTime Mode Data ArcLog SrvLog Total Compressed CurTLI ParentT LI Status
=========================================================================================================== ===========

2022-02-08 17:45:10 2022-02-08 17:45:12 INCR 16kB 33MB ---- 33MB false 1 0 OK
2022-02-08 17:44:45 2022-02-08 17:44:47 INCR 16kB 33MB ---- 33MB false 1 0 OK
2022-02-08 17:42:10 2022-02-08 17:42:12 INCR 16kB 33MB ---- 33MB false 1 0 OK
2022-02-08 17:11:43 2022-02-08 17:11:45 FULL 24MB 33MB ---- 50MB false 1 0 OK
2022-02-08 17:03:24 2022-02-08 17:03:27 FULL 24MB 33MB ---- 50MB false 1 0 OK
2022-02-08 16:16:57 2022-02-08 16:17:00 FULL 24MB 33MB ---- 50MB false 1 0 OK

数据库的完全恢复

要进行数据库的完全恢复,前置条件是数据库已停止并且已完成备份

我们只要使用以下命令:

$ pg_ctl stop
$ rman restore

备份完成后,启动数据库,查看备份信息:

$ pg_ctl start
$ rman show detail

备份管理器将使用最新一次有效的备份进行恢复。

数据库的不完全恢复(基于时间点的恢复)

Halo的备份管理器也支持基于时间点的不完全恢复。例如,我们要将数据库恢复到2021-11-15 09:00:00,我们可以使用以下命令:

$ rman restore --recovery-target-time '2021-11-15 09:00:00'