跳到主要内容
版本:1.0.14

备份和恢复

(一)逻辑备份与恢复

以下所有命令,请在 halo 操作系统用户下执行。

pg_dump 备份单个数据库

pg_dump halo0root> halo0root.bak

导出表结构

pg_dump -s -t test halo0root > test_metadata.sql

导出表和数据

pg_dump -t test halo0root > test.sql

只导出表数据

pg_dump -t test -a halo0root > halo0root_data_only.sql

导入

psql halo0root -f test.sql

pg_dumpall 备份整个数据库群集

pg_dumpall > db.out

(二)物理备份与恢复(RMAN)

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

这里我们要用到 rman。

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

1、前要条件

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

archive_mode

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

archive_command

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

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

2、RMAN备份初始化

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

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

3、RMAN整个数据库的完全备份

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

完全备份:

$ 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

4、RMAN增量备份

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

$ rman backup -b incremental

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

$ rman validate

5、RMAN归档备份

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

$ rman backup -b archive

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

$ rman validate

6、RMAN备份的有效性检查

一般在备份之后状态为 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。

7、RMAN备份管理

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

$ 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 ParentTLI
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

8、RMAN数据库的完全恢复

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

我们只要使用以下命令:

$ pg_ctl stop 
$ rman restore

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

$ pg_ctl start 
$ rman show detail

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

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

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

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

10、RMAN管理器命令参数

请查看 附录