VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

PITR指定时间点恢复

功能描述

当数据库崩溃或希望回退到数据库之前的某一状态时,Vastbase的即时恢复功能(Point-In-Time Recovery,简称PITR)可以支持恢复到备份归档数据之后的任意时间点。

PITR的完整步骤详见:PITR流程

PITR原理

PITR通过一个基础备份和由持续归档生成的归档日志来实现。因此,使用此功能前必须开启数据库日志归档。

PITR恢复过程中,会在全备份的基础上重放归档日志中的WAL数据,直到恢复到用户想要的位置为止。用户可以在启动数据库前,通过编辑恢复控制文件recovery.conf中的命令来指定恢复的目标位置,或者在使用vb_probackup的restore命令时指定恢复目标相关参数。

注意事项

  • PITR仅支持恢复到全备份之后的某一时间点。

  • 仅主节点可以进行PITR恢复,备机需要进行全量build达成与主机数据同步。

  • PITR恢复过程中需要重放WAL日志,如果多个备服务器从相同的归档路径恢复时,需要确保在任何一个备服务器在需要之前,不能删除WAL文件。GUC参数wal_keep_segments需要设置的足够大,确保备份结束前所需的WAL日志不会被清除。

  • PITR要求待操作数据库:

    • 具有基于经过物理备份的全量数据文件。

    • 开启归档功能,具有基于已归档的WAL日志文件。

  • 恢复过程中可以使用如下语句查看恢复状态,返回结果为t表示处于恢复状态,数据库为只读模式;返回结果为f表示未处于恢复状态。

    select pg_is_in_recovery();
    

PITR流程

1、用备份的物理备份的文件替换原本的数据目录。(若不执行此步骤,也可直接在备份的数据库上启动数据库。)

2、将归档的WAL日志文件复制到pg_xlog文件中(此步骤可以省略,通过配置recovery.conf恢复命令文件中的restore_command项替代)。

3、指定数据库恢复的程度:在数据库目录下创建恢复命令文件recovery.conf,指定数据库恢复的程度;或者在使用vb_probackup的restore命令时指定恢复目标相关参数。

4、启动数据库。

5、连接数据库,查看是否恢复到希望预期的状态。

6、若已经恢复到预期状态,通过pg_xlog_replay_resume()函数结束PITR恢复。

配置恢复控制文件

正常恢复模式下,数据库会读取来自pg_xlog子目录下的WAL日志进行恢复。而在PITR恢复时,数据库会读取的WAL日志来自配置参数archive_command中设置的归档目录。

恢复控制文件recovery.conf位于数据库的数据目录$PGDATA下。

归档恢复配置

  • restore_command = string

    这个SHELL命令用于获取WAL文件系列中已归档的WAL文件。

    字符串中的任何一个%f是用归档检索中的文件名替换, 并且%p是用服务器上的复制目的地的路径名替换。 任意一个%r是用包含最新可用重启点的文件名替换。

    示例:

    restore_command = 'cp /home/vastbase/arch/%f %p'
    
  • archive_cleanup_command = string

    这个选项参数用于声明一个shell命令。在每次重启时都会执行这个shell命令。

    archive_cleanup_command为清理备库不需要的归档WAL文件提供一个机制。 任何一个%r由包含最新可用重启点的文件名代替。这是最早的文件,因此必须保留以允许恢复能够重新启动,因此所有早于%r的文件可以安全的移除。

    示例:

    archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'
    
  • recovery_end_command = string

    这个参数是可选的,用于声明一个只在恢复完成时执行的SHELL命令。recovery_end_command是为以后的复制或恢复提供一个清理机制。

恢复目标设置

  • 以下恢复目标中,recovery_target_name、recovery_target_time、recovery_target_xid、recovery_target_lsn这四个配置项仅同时支持一项。

  • 如果不配置任何恢复目标,或配置的目标不存在,则默认恢复到最新的WAL日志点。

  • recovery_target_name = string

    此参数声明命名还原到一个使用pg_create_restore_point()创建的还原点。

    示例:

    recovery_target_name = 'restore_point_1'
    
  • recovery_target_time = timestamp

    此参数声明命名还原到一个指定时间戳。

    示例:

    recovery_target_time = '2022-01-01 12:00:00'
    
  • recovery_target_xid = string

    这个参数声明还原到一个事务ID。

    示例:

    recovery_target_xid = '3000'
    
  • recovery_target_lsn = string

    这个参数声明还原到日志的指定LSN点。

    示例:

    recovery_target_lsn = '0/0FFFFFF'
    
  • recovery_target_inclusive = boolean

    声明在指定恢复目标之后(true)停止,或在这之前(false)停止。

    该声明仅支持恢复目标为recovery_target_time、recovery_target_xid和recovery_target_lsn的配置。

    示例:

    recovery_target_inclusive = true
    

示例

  • 示例为在Linux系统下使用Vastbase G100 V2.2 Build 10进行的备份恢复操作。

  • 示例模拟了使用vb_basebackup进行一次物理全量备份以及PITR恢复的流程。

前置操作

1、为数据库创建一个用于存放归档日志的文件夹。

mkdir -p /home/vastbase/data/arch

2、为数据库开启归档模式。

使用命令vi $PGDATA/postgresql.conf打开数据库配置文件,在文件末尾输入以下几行内容后,按wq保存退出。

archive_mode = on
archive_command = 'cp %p /home/vastbase/data/arch/%f'
vastbase_login_info = off

3、重启数据库使配置生效。

vb_ctl restart

全量备份

1、创建物理备份目录。

mkdir /home/vastbase/data/bak  

2、进行全备份,备份为plain格式。

vb_basebackup -D /home/vastbase/data/bak -F plain

3、授权。确保用户对备份的目录下所有文件有读写的权限,以防止在恢复时因权限不足的问题而失败。

chmod 700 -R /home/vastbase/data/bak

模拟数据变更

1、使用vsql工具连接至数据库。

vsql -d vastbase -p 5432 -r

2、创建测试表test并插入数据。

create table test(id integer);
insert into test values(100);

3、记录当前时间,记录为状态1。

select now(); 

返回结果如下:

              now
-------------------------------
 2023-04-22 17:05:41.637518+08
(1 row)

4、切换wal日志,归档。

select pg_xlogfile_name(pg_switch_xlog());
checkpoint;

5、插入第二条数据。

insert into test values(200);

6、创建还原点,记录为状态2。

select pg_create_restore_point('huanyuan'); 

7、切换wal日志,归档。

select pg_xlogfile_name(pg_switch_xlog());
checkpoint;

8、插入第三条数据。

insert into test values(300);

9、获取事务id,记录为状态3。

select pg_current_xlog_location(),txid_current(),txid_current_snapshot();

返回结果如下:

 pg_current_xlog_location | txid_current | txid_current_snapshot
--------------------------+--------------+-----------------------
 0/60000340               |        17318 | 17318:17318:
(1 row)

10、切换wal日志,归档。

select pg_xlogfile_name(pg_switch_xlog());
checkpoint;

11、插入第四条数据。

insert into test values(400);

12、获取当前lsn号,记录为状态4。

select pg_current_xlog_location(),txid_current(),txid_current_snapshot();

返回结果如下:

 pg_current_xlog_location | txid_current | txid_current_snapshot
--------------------------+--------------+-----------------------
 0/61000340               |        17320 | 17320:17320:
(1 row)

13、切换wal日志,归档。

select pg_xlogfile_name(pg_switch_xlog());
checkpoint;

14、退出vsql程序。

\q

PITR恢复

1、关闭原库。

vb_ctl stop

2、切换到备份目录/home/vastbase/data/bak下。

cd /home/vastbase/data/bak

3、使用vi recovery.conf命令创建recovery.conf文件并写入以下参数,按wq保存退出。

restore_command = 'cp /home/vastbase/data/arch/%f %p'  
recovery_target_time = '2023-04-22 17:05:41.637518+08'   #填写前面步骤3查看到的时间
recovery_target_inclusive = true

4、在备份目录上启动数据库,完成恢复。

vb_ctl start -D /home/vastbase/data/bak

5、使用vsql工具连接到数据库,查询数据。

select * from test;

结果显示如下,表示已恢复到状态1:

 id  
-----
 100
(1 row)

6、退出vsql程序。

\q

7、停止数据库,准备进行第二次恢复。

vb_ctl stop -D /home/vastbase/data/bak

8、使用vi recovery.conf命令创建recovery.conf文件并写入以下参数,按wq保存退出。

restore_command = 'cp /home/vastbase/data/arch/%f %p'  
recovery_target_name = 'huanyuan'

9、在备份目录上启动数据库,完成恢复。

vb_ctl start -D /home/vastbase/data/bak

10、使用vsql工具连接到数据库,查询数据。

select * from test;

结果显示如下,表示已恢复到状态2:

 id
-----
 100
 200
(2 rows)

11、退出vsql程序。

\q

12、停止数据库,准备进行第三次恢复。

vb_ctl stop -D /home/vastbase/data/bak

13、使用vi recovery.conf命令创建recovery.conf文件并写入以下参数,按wq保存退出。

restore_command = 'cp /home/vastbase/data/arch/%f %p'  
recovery_target_xid = '17318'  #填写前面步骤9查看到的xid
recovery_target_inclusive = true

14、在备份目录上启动数据库,完成恢复。

vb_ctl start -D /home/vastbase/data/bak

15、使用vsql工具连接到数据库,查询数据。

select * from test;

结果显示如下,表示已恢复到状态3:

 id
-----
 100
 200
 300
(3 rows)

16、退出vsql程序。

\q

17、停止数据库,准备进行第四次恢复。

vb_ctl stop -D /home/vastbase/data/bak

18、使用vi recovery.conf命令创建recovery.conf文件并写入以下参数,按wq保存退出。

restore_command = 'cp /home/vastbase/data/arch/%f %p'  
recovery_target_lsn = '0/61000340'  #填写前面步骤12查看到的lsn
recovery_target_inclusive = true

19、在备份目录上启动数据库,完成恢复。

vb_ctl start -D /home/vastbase/data/bak

20、使用vsql工具连接到数据库,查询数据。

select * from test;

结果显示如下,表示已恢复到状态4:

 id
-----
 100
 200
 300
 400
(4 rows)

21、使用如下语句结束恢复状态。

select pg_xlog_replay_resume();

22、查询数据库恢复状态。

select pg_is_in_recovery();

返回结果如下,表示已结束恢复状态:

 pg_is_in_recovery
-------------------
 f
(1 row)