集群整体闪回
集群整体闪回¶
功能描述:
允许集群整体恢复到某一指定时刻的状态
工作原理:
在 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扩展应在需要闪回的时间点之前,否则库级闪回会将扩展一起闪回,导致闪回过程中报错
集群指定时间点闪回¶
功能描述:
通过seabox mirrorcluster upgrade工具将集群整体闪回到指定时间点的状态
集群整体指定时间点闪回语法:
seabox mirrorcluster upgrade -m flashback -T '2023-06-01 00:00:00'
时间格式为“YYYY-MM-DD HH24:MI:SS”。
注意事项:
指定的集群时间戳对应的事务在闪回之后是不可见的
示例:
seaboxsql=# CREATE USER test_user;
CREATE ROLE
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=# 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=# 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=# drop table t1,t2;
DROP TABLE
seaboxsql=# DROP USER test_user;
DROP ROLE
- 执行集群整体闪回
seabox mirrorcluster upgrade -m flashback -T '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 pg_roles where rolname = 'test_user';
count
-------
1
(1 row)
集群指定事务号闪回¶
功能描述:
通过seabox mirrorcluster upgrade 工具将集群整体闪回到指定集群事务号的状态
集群整体指定时间点闪回语法:
seabox mirrorcluster upgrade -m flashback -x GID
注意事项:
指定的集群事务号对应的事务在闪回之后是可见的
示例:
seaboxsql=# CREATE USER test_user;
CREATE ROLE
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=# 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=# 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=# drop table t1,t2;
DROP TABLE
seaboxsql=# DROP USER test_user;
DROP ROLE
- 执行集群整体闪回
seabox mirrorcluster upgrade -m flashback -x 60015
- 查看闪回之后集群状态
seaboxsql=# select count(*) from t1;
count
-------
10
(1 row)
seaboxsql=# select count(*) from t2;
count
-------
10
(1 row)
seaboxsql=# select count(*) from pg_roles where rolname = 'test_user';
count
-------
1
(1 row)