跳转至

闪回的约束条件

闪回的约束条件

约束一

在将一个对象闪回到一个时间点timestamp1之后,不允许将同一个对象闪回到比这个时间点更新的一个时间点,可能造成不可预知的错误。例如:

seaboxsql=# create table t1(a int);
seaboxsql=# flashback table t1 timestamp '2023-01-08 09:38:33';
FLASHBACK
seaboxsql=# flashback table t1 timestamp '2023-01-08 09:40:33';

这里第二次闪回比第一次闪回的时间更新,而第一次闪回已经覆盖掉了 '2023-01-08 09:38:33' - '2023-01-08 09:40:33' 之间的数据,这就使第二次闪回结果可以有不可预知的错误。

约束二

闪回执行过rename操作的表,需要指定rename之前的表名。例如

seaboxsql=# CREATE TABLE t123(a int, b text) distributed by (a);
seaboxsql=# insert into t123 select g, g||'abcd' from generate_series(1, 10)g;
seaboxsql=# select * from sd_record_timestamp_gxid();
seaboxsql=# alter table t123 rename to t_123;
seaboxsql=# drop table t_123;
seaboxsql=# flashback table t_123 timestamp '2023-10-30 09:37:19+08';
ERROR:  relation 't_123' does not exist
seaboxsql=# flashback table t123 timestamp '2023-10-30 09:37:19+08';
FLASHBACK TABLE

约束三

闪回不允许闪回到做vacuum之前的时间点。

提供参数flashback_check_last_vacuum_time控制数据库在闪回时,是否检查表在闪回指定的时间之后做过vacuum。参数默认开启。

seaboxsql=# create table t1(a int, b text) distributed by(a);
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(1,10)g;
seaboxsql=# select * from sd_record_timestamp_gxid();
seaboxsql=# update t1 set b = 'aaaa' where a < 5;
seaboxsql=# vacuum t1;
seaboxsql=# select pg_sleep(1);  -- 等待统计信息更新
seaboxsql=# flashback table t1 timestamp '2024-04-13 15:59:54';
ERROR:  could not flashback table "t1" because it was vaccumed after the flashback time