kingbase kdb_flashback 扩展插件使用

1. 插件kdb_flashback简介?

插件kdb_flashback是KingbaseES 的一个扩展插件。主要功能是提供错误数据的快速恢复能力,目前提供的闪回技术包括闪回回收站,闪回查询,闪回版本查询,闪回到任意时间点。

  • 插件名为 kdb_flashback

  • 插件版本 V1.0

2. 插件kdb_flashback加载方式?

KingbaseES数据库默认将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。

示例:

shared_preload_libraries = 'kdb_flashback'

3. 插件kdb_flashback的参数配置?

kdb_flashback.enable_flashback_query

闪回查询的开启参数,默认开启。

kdb_flashback.db_recyclebin

闪回回收站开启参数,参数为bool类型,参数级别为PGC_SIGHUP,默认关闭。

4. 插件kdb_flashback的使用方法?

闪回查询相关的技术使用方法

  • 整个闪回技术(闪回查询和闪回表到指定时间点) 可以通过时间戳和CSN(commit sequence number) 两种方式进行。

  • 两种方式目前都需要依赖提交的时间戳,因此需要开启track_commit_timestamp 这个参数。另外闪回查询还需要开启kdb_flashback.enable_flashback_query 的参数。

  • 这里解释下时间戳和CSN 两个快照指定的方式,时间戳即timestamp 用户可以在闪回查询的快照时间表达式里指定任意一个有效的时间戳。

如果允许闪回查询,那么将返回该时刻能够可见的历史快照的数据。CSN 是提交顺序号,第一个有效的CSN为65536000000,CSN 随着提交线性增加。因此如果用户指定一个有效的CSN,比如65536000160,那么闪回查询将基于这个CSN 提交号构建历史快照。

  • 闪回查询技术有一定的限制,在数据进行深度清理后和部分schema change 后将拒绝闪回查询(具体参考闪回查询须知)。

下面具体介绍这几种闪回技术, 在使用任何闪回查询相关的技术前,保证在配置文件中开启track_commit_timestamp 参数,并重启服务。

4.1. 闪回查询?

闪回查询能否返回用户指定历史时刻的快照数据,历史快照时刻指定方式可以通过timestamp和csn 两种方式指定(具体语法参考 SELECT)。

例2-56AS OF 闪回查询(timestamp)语句的示例

flashback=# create table fb_example(id int, name varchar(100));
CREATE TABLE
flashback=# insert into fb_example values(1, 'name1');
INSERT 0 1
flashback=# insert into fb_example values(2, 'name1');
INSERT 0 1
flashback=# insert into fb_example values(3, 'name1');
INSERT 0 1
flashback=# select * from fb_example;
 id | name
----+-------
  1 | name1
  2 | name1
  3 | name1
(3 rows)

flashback=# set 'tp1' `date "+%Y-%m-%d %H:%M:%S.%N"`
flashback=# update fb_example set name = null;
UPDATE 3
flashback=# select * from fb_example;
 id | name
----+------
  1 |
  2 |
  3 |
(3 rows)

flashback=# select * from fb_example as of timestamp :'tp1';
 id | name
----+-------
  1 | name1
  2 | name1
  3 | name1
(3 rows)

例2-56 中的update 语句误将 name 更改为null,此时可以通过闪回查询查询到update前的数据。

通常CSN 方式进行闪回查询的时候,需要借助闪回版本查询确定合适的CSN 号,比如delete 事务误将fb_example 表删除了,那么通过版本查询可以确定该delete 事务的CSN为65536000007,可以通过如下的闪回语句查询删除的数据。

例2-57AS OF 闪回查询(CSN)语句的示例

flashback=# select versions_startscn, versions_endcsn, * from fb_example versions between csn minvalue and maxvalue;
 versions_startscn | versions_endcsn | id | name
-------------------+-----------------+----+-------
       65536000003 |     65536000006 |  1 | name1
       65536000004 |     65536000006 |  2 | name1
       65536000005 |     65536000006 |  3 | name1
       65536000006 |     65536000007 |  1 |
       65536000006 |     65536000007 |  2 |
       65536000006 |     65536000007 |  3 |
(6 rows)

flashback=# select * from fb_example as of csn 65536000006;
 id | name
----+------
  1 |
  2 |
  3 |
(3 rows)

4.2. 闪回版本查询?

闪回版本查询的作用主要有以下几个方面:

  • 进行历史数据的分析。

  • 查看数据的变更历史。

  • 确定闪回表的精确时间点。

闪回版本查询拥有和Oracle 相同的参考伪列,伪列和功能参考下表。

表 44.4.1 闪回版本查询的伪列
?

伪列名

描述

VERSIONS_STARTTIME

元组被创建的时间戳

VERSIONS_ENDTIIME

元组被删除的时间戳

VERSIONS_STARTCSN

元组被创建的commit seqno

VERSIONS_ENDCSN

元组被删除的commit seqno

VERSIONS_OPERATION

对应的操作 D表示该元组被删除,I表示该元组被插入

VEERSIONS_XID

元组被创建的事务ID

闪回版本查询的start 和end 的快照表达式既可以指定一个有效的快照表达式,也可以通过minvalue 和maxvalue 两个关键字进行查询。当指定时,将返回该表能够闪回查询的所有的版本信息。

例2-58通过minvalue 和maxvalue 进行闪回版本查询(CSN)语句的示例

flashback=# select versions_startcsn, versions_endcsn, versions_operation, * from fb_example versions between csn minvalue and maxvalue;
 versions_startcsn | versions_endcsn | versions_operation | id | name
-------------------+-----------------+--------------------+----+-------
       65536000003 |     65536000006 | D                  |  1 | name1
       65536000004 |     65536000006 | D                  |  2 | name1
       65536000005 |     65536000006 | D                  |  3 | name1
       65536000006 |     65536000007 | D                  |  1 |
       65536000006 |     65536000007 | D                  |  2 |
       65536000006 |     65536000007 | D                  |  3 |
       65536000008 |                 | I                  |  5 | name3
       65536000009 |                 | I                  |  6 | name3
(8 rows)

通过上面的例子,我们可以追溯fb_example 的版本变更的历史,65536000006 这个CSN 的事务做了一次update 的操作,65536000007 这个CSN的事务做了一次delete 的操作。因此如果我们想查询被删除前的数据可以尝试65536000006 这个CSN 快照。

4.3. 闪回表到指定时间点?

闪回表到指定的时间点,实际上为用户提供了还原数据的一种手段,如果说闪回查询能够帮助用户查询历史的数据,那么闪回表实际上是帮助用户彻底的找回数据, 具体语法参考 FLASHBACK。

闪回表的通常步骤:

  • 通过闪回版本查询确定待闪回的版本范围,查询startxxx, endxxx, 和operation确定边界。

  • 通过AS OF 闪回查询结合确定的边界锁定闪回查询的精确时间点,并观察数据时候符合预期。

  • 通过FLASHBACK TABLE TO [ Timestamp | CSN ] asof_item, 完成表的闪回。

还是参考2-58 的例子,比如我们推理出错误更新name 的事务是65536000006 这个CSN,那么我们可以指定65536000005 进行闪回查询。再通过flashback 闪回到误更前的时刻。

flashback=# select * from fb_example as of csn 65536000005;
 id | name
----+-------
  1 | name1
  2 | name1
  3 | name1
(3 rows)

flashback=# flashback table fb_example to csn 65536000005;
FLASHBACK TABLE
flashback=# select * from fb_example;
 id | name
----+-------
  1 | name1
  2 | name1
  3 | name1
(3 rows)

4.4. 闪回查询和闪回表技术的使用须知?

  • 闪回查询和闪回表技术依赖于历史的数据,如果历史数据因为vacuum、truncate、rewrite 等操作被回收掉,那么会导致无法闪回到这些操作之前的时刻。因此推荐用户在期望使用闪回查询的时候对vacuum 相关参数做一定的调整(关闭表级的autovacuum, 推荐调大vacuum_defer_cleanup_age 的值以降低历史数据被回收的机会)。

  • 目前闪回查询和闪回表技术在vacuum、truncate、和部分ddl 之后将不允许进行闪回到这些操作之前。

  • 闪回查询应用于视图或者物化视图里面应该尽量避免对于常量时间戳和CSN 的使用,可能会引发dump 和 restore的失败。

4.5. 闪回回收站?

闪回回收站功能为用户提供一种误删表后还原表的一种手段,闪回回收站分为将回收站中的表闪回到删除之前的状态和清空回收站。

例2-59flashback table to before drop语句的示例

test=# flashback table range_partition_tb to before drop;
FLASHBACK TABLE
test=# d
                          List of relations
Schema   |            Name            |       Type        | Owner

-----------+----------------------------+-------------------+--------

flashback | range_partition_tb | partitioned table | system flashback | range_partition_tb_part_01 | table | system flashback | range_partition_tb_part_02 | table | system

(3 rows)

回收站需用户定期维护,避免回收站膨胀,用户可以通过PURGE操作对回收站进行维护,PURGE操作分为删除回收站中一个指定表和清空回收站。清理回收站时,回收站视图recyclebin和系统表sys_recyclebin中相关对象将被清除。

例2-60purge table语句的示例

test=# select * from recyclebin;
  oid  |       original_name        |           droptime            | type
-------+----------------------------+-------------------------------+-------
 24968 | range_partition_tb_part_02 | 2022-05-20 15:14:53.581052+08 | TABLE
 24965 | range_partition_tb_part_01 | 2022-05-20 15:14:53.581494+08 | TABLE
 24962 | range_partition_tb         | 2022-05-20 15:14:53.582074+08 | TABLE
 24971 | purge_test                 | 2022-05-20 15:15:45.027217+08 | TABLE
 24974 | purge_test1                | 2022-05-20 15:16:49.466221+08 | TABLE
(5 rows)

test=# purge table purge_test;
PURGE
test=# select * from recyclebin;
  oid  |       original_name        |           droptime            | type
-------+----------------------------+-------------------------------+-------
 24968 | range_partition_tb_part_02 | 2022-05-20 15:14:53.581052+08 | TABLE
 24965 | range_partition_tb_part_01 | 2022-05-20 15:14:53.581494+08 | TABLE
 24962 | range_partition_tb         | 2022-05-20 15:14:53.582074+08 | TABLE
 24974 | purge_test1                | 2022-05-20 15:16:49.466221+08 | TABLE
(4 rows)

test=# purge recyclebin;
PURGE
test=# select * from recyclebin;
 oid | original_name | droptime | type
-----+---------------+----------+------
(0 rows)

5. 插件kdb_flashback卸载方法?

修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库。

示例

shared_preload_libraries = ''

6. 插件kdb_flashback升级方法?

kdb_flashback扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级些插件。