PG中使用pg_basebackup实现时间点恢复( Point-in-Time Recovery (PITR))

2    1310    4

Tags:

👉 本文共约5603个字,系统预计阅读时间或需22分钟。

pg_basebackup备份工具简介

参考:https://www.xmmup.com/pg_basebackupbubeifentemporary-tablehe-unlogged-table.html

该备份工具自动执行 pg_start_backup()和 pg_stop_backup()函数,而且备份速度和数据都比手动的备份快。

注意:

把数据库文件转储出来后,在启动数据库前 postgresql.conf 一定要添加恢复参数,否则只恢复到备份的时间点。

经过测试,第一次恢复后,数据库能够恢复到最新状态,t1 表的数据能够恢复到归档的最后位置。对数据库进行操作,切换几个日志后,再用之前的备份对数据库进行恢复,结果能够恢复到最新的状态,能够自动应用归档,此恢复方式比 mysql 要智能。

如果当前的日志丢失,pg 实际上做的是不完全恢复,但是恢复的时候没有提示,而且不需要显式进行 recovery,在启动数据库的时候自动运行,类似 oracle 的实例恢复。

PITR简介

1、什么是PITR ?

PITR: 全称是Point-In-Time-Recover (时间点恢复),是PG从8.0版本开始引入的一个特性,该特性可以使用基础备份连续归档日志将数据库集群恢复到任意时间点

2、什么是基础备份?怎么获取基础备份?

在pg中,也是从8.0版本中引入了在线物理全备份,运行中的整个数据库集群的快照(即物理备份数据)被称为基础备份。

在pg中可以由两种方法获取基础备份:

  • 使用系统low-level函数:pg_start_backup、pg_stop_backup以及一些shell命令(如cp、tar、rsync等)。
  • 使用pg_basebackup工具

3、pg_start_backup做了什么?

pg_start_backup和pg_stop_backup命令定义见这里:

src/backend/access/transam/xlogfuncs.c

链接:https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlogfuncs.c

pg_start_backup()是一个用来启动基本备份的函数。它是PostgreSQL 8.0中引入的原始物理备份API的一部分。

pg_start_backup主要执行以下几个操作:

  • 强制服务器进入全页写模式(即使你设置了full_page_writes=off)。
  • 执行checkpoint(我在前面checkpoint的文章中提过,数据库恢复的过程需要从一个REDO位置开始,所以pg_start_backup需要做checkpoint来创建一个REDO点)。
  • 创建一个backup_label文件。

4、backup_label文件的内容和作用什么?

一个backup_label示例:

其中:

CHECKPOINT LOCATION: 这是该函数创建的检查点被记录的LSN位置。当使用这个基础备份恢复数据库时,PostgreSQL从backup_label文件中获取“CHECKPOINT LOCATION”,并开始恢复过程。

BACKUP METHOD: 标示用于进行基础备份的方法(pg_start_backup或pg_basebackup)。

START TIME: 执行pg_start_backup时的时间戳。

LABEL: 这是在调用pg_start_backup(LABEL)中指定的标签。

5、此时你可能有疑问,为什么checkpoint的检查点的位置保存在了backup_label,而不是我们已知的pg_control里?

因为数据库的备份时间可能很长的,期间可能会多次执行常规checkpoint,如果放在pg_control里,那这个位置就可能会常规checkpoint被覆盖了。

6、pg_stop_backup做了什么?

pg_stop_backup主要完成以下工作:

如果pg_start_backup强制打开了full_page_write,pg_stop_backup将会将其重置为非全页写模式。

创建备份历史文件(timeline.hostory)。

删除backup_label文件。(注:从基础备份恢复时,需要backup_label文件,其被复制到归档目录之后,在原始数据库集中就不再需要了。)

7、什么是数据库归档?

一般情况下,PostgreSQL数据库将wal文件保存在$PGDATA的pg_wal下。但是这些wal文件可能会被回收。为了避免这种情况,我们可以将wal文件的副本保存在除$PGDATA之外的单独目录中。在PG中,将wal文件复制到其他位置被称为归档(让服务器读取wal文件并应用它称为恢复)。

8、怎么开启归档?

在pg中开启归档,依赖三个配置:archive_mode、archive_command和wal_level

archive_mode:表示是否要启用wal归档。

archive_command:指定如何归档。此选项接受shell命令或shell脚本。

wal_level:可选项:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
PG中使用pg_basebackup实现时间点恢复( Point-in-Time Recovery (PITR))后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

2 条回复

  1. Avatar photo 小菜来了说道:

    麦老师请教一下,恢复后数据是有了

    但select pg_is_in_recovery();结果是t,
    select pg_wal_replay_resume();执行了表也还是只读状态,
    recovery.signal也还在

    不知道是不是我漏掉什么操作?还是哪个步骤搞错?

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部