跳转至

闪回多级配置

闪回的多级配置

为了实现更细粒度的闪回模式控制,flashback_mode支持多级配置,包括表级,schame级和全局配置。表级和schema级的配置选项同样分为三种,与全局的闪回模式参数一一对应:

flashback_mode schema级 表级 含义
none 0 0 不允许关闭进行闪回
mod 1 1 允许闪回表修改操作,无法闪回truncate和drop操作
all 2 2 允许闪回所有操作

下面分别介绍各个级别闪回参数的配置方法和用例

表级配置

使用表选项配置到表上的闪回模式参数,有最高的优先级。配置表级闪回模式参数的语句为

CREATE TABLE ... with (flashback_mode=0/1/2);
ALTER TABLE ... set (flashback_mode=0/1/2);

表级闪回参数配置为1

可以闪回DML操作,以及一些不删除表文件的操作,无法闪回truncate和drop操作

seaboxsql=# CREATE TABLE t1(a int, b text) with (flashback_mode=1);
CREATE TABLE
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select txid_current();
 txid_current 
--------------
          737
(1 row)

seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# flashback table t1 xid 737;
FLASHBACK TABLE
seaboxsql=# select * from t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

seaboxsql=# select txid_current();
 txid_current 
--------------
          740
(1 row)

seaboxsql=# drop table t1;
DROP TABLE
seaboxsql=# flashback table t1 xid 740;
ERROR:  relation "t1" dose not support flashback DROP/TRUNCATE operation

表级闪回参数配置为2

seaboxsql=# CREATE TABLE t1(a int, b text) with (flashback_mode=2);
CREATE TABLE
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select txid_current();
 txid_current 
--------------
          737
(1 row)

seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# flashback table t1 xid 737;
FLASHBACK TABLE
seaboxsql=# select * from t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

seaboxsql=# select txid_current();
 txid_current 
--------------
          740
(1 row)

seaboxsql=# drop table t1;
DROP TABLE
seaboxsql=# flashback table t1 xid 740;
FLASHBACK TABLE
seaboxsql=# select * from t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

schema级配置

配置到schema级别的闪回模式参数,优先级低于表级参数,但高于全局参数。配置表级闪回模式参数的语句为

CREATE SCHEMA ... with (flashback_mode=0/1/2);
ALTER SCHEMA ... set (flashback_mode=0/1/2);

schema级别参数设置为1

seaboxsql=# create schema test with (flashback_mode=1);
CREATE SCHEMA
seaboxsql=# create table test.t1 (a int, b text);
CREATE TABLE
seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select txid_current();
 txid_current 
--------------
          761
(1 row)

seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# flashback table test.t1 xid 761;
FLASHBACK TABLE
seaboxsql=# select * from test.t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

seaboxsql=# drop table test.t1;
DROP TABLE
seaboxsql=# flashback table test.t1 xid 761;
ERROR:  relation "t1" dose not support flashback DROP/TRUNCATE operation

schema级别参数设置为2

seaboxsql=# create schema test with (flashback_mode=2);
CREATE SCHEMA
seaboxsql=# create table test.t1 (a int, b text);
CREATE TABLE
seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select txid_current();
 txid_current 
--------------
          761
(1 row)

seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# flashback table test.t1 xid 761;
FLASHBACK TABLE
seaboxsql=# select * from test.t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

seaboxsql=# drop table test.t1;
DROP TABLE
seaboxsql=# flashback table test.t1 xid 761;
FLASHBACK TABLE
seaboxsql=# select * from t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

多级闪回模式配置

当有多个级别的flashback_mode同时设置时,我们以表级>schema级>全局级别的优先级来确定一张表的flashback_mode。需要注意的是,开启全局闪回参数(至少设置为flashback_mode='mod')级别,才能开启表级和schema级别的闪回参数。使用场景例如下:

对指定表开启闪回

seaboxsql=# alter system set flashback_mode = 'mod';
ALTER SYSTEM
seaboxsql=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

seaboxsql=# CREATE TABLE t1(a int, b text) with (flashback_mode=2);
CREATE TABLE
seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select txid_current();
 txid_current 
--------------
          737
(1 row)

seaboxsql=# insert into t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# flashback table t1 xid 737;
FLASHBACK TABLE
seaboxsql=# select * from t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

seaboxsql=# select txid_current();
 txid_current 
--------------
          740
(1 row)

seaboxsql=# drop table t1;
DROP TABLE
seaboxsql=# flashback table t1 xid 740;
FLASHBACK TABLE
seaboxsql=# select * from t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

对指定schema开启闪回

seaboxsql=# alter system set flashback_mode = 'mod';
ALTER SYSTEM
seaboxsql=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

seaboxsql=# create schema test with (flashback_mode=2);
CREATE SCHEMA
seaboxsql=# create table test.t1 (a int, b text);
CREATE TABLE
seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select txid_current();
 txid_current 
--------------
          761
(1 row)

seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# flashback table test.t1 xid 761;
FLASHBACK TABLE
seaboxsql=# select * from test.t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

seaboxsql=# drop table test.t1;
DROP TABLE
seaboxsql=# flashback table test.t1 xid 761;
FLASHBACK TABLE
seaboxsql=# select * from t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

指定schema开启闪回,schema下指定表关闭闪回

seaboxsql=# alter system set flashback_mode = 'mod';
ALTER SYSTEM
seaboxsql=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

seaboxsql=# create schema test with (flashback_mode=2);
CREATE SCHEMA
seaboxsql=# create table test.t1 (a int, b text) with (flashback_mode=1);
CREATE TABLE
seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(1, 10)g;
INSERT 0 10
seaboxsql=# select txid_current();
 txid_current 
--------------
          761
(1 row)

seaboxsql=# insert into test.t1 select g, g||'abcd' from generate_series(11, 20)g;
INSERT 0 10
seaboxsql=# flashback table test.t1 xid 761;
FLASHBACK TABLE
seaboxsql=# select * from test.t1;
 a  |   b    
----+--------
  1 | 1abcd
  2 | 2abcd
  3 | 3abcd
  4 | 4abcd
  5 | 5abcd
  6 | 6abcd
  7 | 7abcd
  8 | 8abcd
  9 | 9abcd
 10 | 10abcd
(10 rows)

seaboxsql=# drop table test.t1;
DROP TABLE
seaboxsql=# flashback table test.t1 xid 761;
relation "t1" dose not support flashback DROP/TRUNCATE operation