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)