闪回的约束条件
闪回的约束条件¶
约束一
在将一个对象闪回到一个时间点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