暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Halo数据库备份与恢复

原创 Halo Tech 2024-02-20
293

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

Halo的备份机制主要有:
逻辑备份
物理备份

逻辑备份与恢复

逻辑备份的原理是将数据库中的对象和数据转储成对应的SQL命令。通常我们使用pg_dump/pg_restore命令来完成逻辑备份和恢复。
备份:
假设我们要备份名为halotest的数据库,我们可以使用如下命令:

$ pg_dump -Fc -v -f halotest.dump halotest  
pg_dump: last built-in OID is 16383
pg_dump: reading extensions
pg_dump: identifying extension members
pg_dump: reading schemas
pg_dump: reading user-defined tables
pg_dump: reading user-defined functions
pg_dump: reading user-defined types
pg_dump: reading procedural languages
pg_dump: reading user-defined aggregate functions
pg_dump: reading user-defined operators
pg_dump: reading user-defined access methods
pg_dump: reading user-defined operator classes
pg_dump: reading user-defined operator families
pg_dump: reading user-defined text search parsers
pg_dump: reading user-defined text search templates
pg_dump: reading user-defined text search dictionaries
pg_dump: reading user-defined text search configurations
pg_dump: reading user-defined foreign-data wrappers
pg_dump: reading user-defined foreign servers
pg_dump: reading default privileges
pg_dump: reading user-defined collations
pg_dump: reading user-defined conversions
pg_dump: reading type casts
pg_dump: reading transforms
pg_dump: reading table inheritance information
pg_dump: reading event triggers
pg_dump: finding extension tables
pg_dump: finding inheritance relationships
pg_dump: reading column info for interesting tables
pg_dump: finding the columns and types of table "public.t_a"
pg_dump: flagging inherited columns in subtables
pg_dump: reading indexes
pg_dump: flagging indexes in partitioned tables
pg_dump: reading extended statistics
pg_dump: reading constraints
pg_dump: reading triggers
pg_dump: reading rewrite rules
pg_dump: reading policies
pg_dump: reading row-level security policies
pg_dump: reading publications
pg_dump: reading publication membership
pg_dump: reading subscriptions
pg_dump: reading large objects
pg_dump: reading dependency data
pg_dump: saving encoding = UTF8
pg_dump: saving standard_conforming_strings = on
pg_dump: saving search_path = public
pg_dump: saving database definition
pg_dump: dumping contents of table "public.t_a"

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

恢复:

假设我们需要对halotest进行恢复,我们可以使用如下命令

$ pg_restore -v -C -d halo0root halotest.dump 
pg_restore: connecting to database for restore
pg_restore: creating DATABASE "halotest"
pg_restore: connecting to new database "halotest"
pg_restore: creating TABLE "public.t_a"
pg_restore: processing data for table "public.t_a"

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

物理备份与恢复

物理备份的原理是复制数据文件和归档日志,当需要恢复时,我们先恢复备份的数据文件,然后从归档日志中“重放”来恢复到需要的恢复点。物理备份相比逻辑备份,通常速度更快,尤其是数据库比较大时,性能优势更加显著。而且物理备份可以进行按时间点的恢复(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'
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论