集群库级闪回
集群库级闪回¶
功能描述:
允许集群当前数据库恢复到某一指定时刻的状态
工作原理:
在 SeaboxMPP 中,根据mvcc原理,删除或者更新元组并没有立即删除旧数据,而只是标记为已删除,在vacuum清理之前,这些数据还存在page页中,根据元组可见性,通过闪回查询过去某个时间点或某个事务可见的数据,然后恢复到表中。 通过恢复系统表和普通表数据,可以达到将集群当前数据库恢复到某一时刻的目的。
配置参数¶
-
track_commit_timestamp 设置track_commit_timestamp = 'on',记录事务提交的时间戳,需要重启数据库服务
-
flashback_mode 设置flashback_mode = 'mod',来保证不涉及删除表文件的事务可以被闪回,不必重启服务,但需要重新加载配置参数。 设置flashback_mode = 'all',来保证所有事务可以被闪回,不必重启服务,但需要重新加载配置参数。
-
autovacuum 控制是否使用autovacuum功能,设置autovacuum = 'off',关闭该功能。
-
sdtrashcan 需要在所有数据库下安装扩展
create extension sdtrashcan
注意事项:
安装sdtrashcan扩展应在需要闪回的时间点之前,否则库级闪回会将扩展一起闪回,导致闪回过程中报错
集群指定时间点闪回¶
功能描述:
通过函数db_flashback_timestamp将当前数据库闪回到指定时刻状态
集群库级指定时间点闪回语法:
SELECT db_flashback_timestamp(TIMESTAMP)
注意事项:
指定的集群时间戳对应的事务在闪回之后是不可见的
示例:
seaboxsql=# CREATE TABLE t1(a int, b text) distributed by (a);
CREATE TABLE
seaboxsql=# CREATE TABLE t2(a int, b text) distributed by (a);
CREATE TABLE
seaboxsql=# CREATE TABLE t3(a int, b text) distributed by (a);
CREATE TABLE
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# insert into t2 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# insert into t3 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select * from sd_record_timestamp_gxid();
time | gxid | dboid
------------------------+--------+-------
2023-10-08 11:43:24+08 | 60015 | 14760
(1 row)
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# insert into t2 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# insert into t3 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# drop table t1,t2,t3;
DROP TABLE
- 执行集群库级闪回
SELECT db_flashback_timestamp('2023-10-08 11:43:24+08');
- 查看闪回之后集群状态
seaboxsql=# select count(*) from t1;
count
-------
10
(1 row)
seaboxsql=# select count(*) from t2;
count
-------
10
(1 row)
seaboxsql=# select count(*) from t3;
count
-------
10
(1 row)
集群指定事务号闪回¶
功能描述:
通过函数 db_flashback_gxid将当前数据库闪回到指定集群事务号
集群库级闪回指定事务号闪回语法:
SELECT db_flashback_gxid(GXID);
注意事项:
指定的集群事务号对应的事务在闪回之后是可见的
示例:
seaboxsql=# CREATE TABLE t1(a int, b text) distributed by (a);
CREATE TABLE
seaboxsql=# CREATE TABLE t2(a int, b text) distributed by (a);
CREATE TABLE
seaboxsql=# CREATE TABLE t3(a int, b text) distributed by (a);
CREATE TABLE
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# insert into t2 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# insert into t3 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select * from sd_record_timestamp_gxid();
time | gxid | dboid
------------------------+--------+-------
2023-10-08 11:43:24+08 | 60015 | 14760
(1 row)
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# insert into t2 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# insert into t3 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# drop table t1,t2,t3;
DROP TABLE
- 执行集群库级闪回
SELECT db_flashback_gxid(60015);
- 查看闪回之后集群状态
seaboxsql=# select count(*) from t1;
count
-------
10
(1 row)
seaboxsql=# select count(*) from t2;
count
-------
10
(1 row)
seaboxsql=# select count(*) from t3;
count
-------
10
(1 row)