一、KingbaseES V8R6 flashback drop table介绍
-
使用FLASHBACK删除和恢复表
删除表时,数据库不会立即删除与该表关联的空间。数据库重命名表,并将其和任何关联的对象放在回收站中,万一表被错误地删除,可以在稍后恢复。这个特性被称为FLASHBACK DROP, FLASHBACK TABLE语句用于恢复表。 -
什么是回收站
回收站实际上是一个数据字典表,包含关于被删除对象的信息。被删除的表和任何关联的对象(如索引、约束、嵌套表等)没有被删除,仍然会占用空间。 -
用户可以使用以下语句查看回收站中的对象:
SELECT * FROM RECYCLEBIN;
开启回收站功能后,DROP TABLE 语句会将对象放入回收站。DROP TABLE若是开启了GUC参数:kdb_flashback.db_recyclebin=on,且未指定PURGE选项,则删除的表及其关联的索引、规则、触发器、约束等将被放到SYS_RECYCLEBIN系统表中。 它添加表及其关联对象,以便它们可以作为一个组数据一起进行恢复。在需要时可以将回收站中的表闪回到删除之前的状态。除了表本身,添加到回收站的关联对象可以包括以下类型的对象:
嵌套表 LOB数据库字段 索引 约束(不包括外键约束) 触发器 聚簇
-
启用和禁用回收站
当回收站被启用时,被删除的表及其相关对象将被放入回收站。当回收站被禁用时,被删除的表及其相关对象不会被放入回收站,它们被彻底删除,您必须使用其他方法来恢复它们(例如从备份中恢复)。
回收站功能默认关闭,可以通过下列命令查看是否开启回收站功能:
show kdb_flashback.db_recyclebin;
开启回收站功能,在登录数据库后执行以下命令即可
alter system set kdb_flashback.db_recyclebin = on;
-
从回收站恢复表
开启了回收站参数后,如果不允许一个删除的表进回收站,需要在DROP语句后面加上PUGRE
选项。flashback支持将一个已经删除到回收站中的表及相关对象闪回到删除之前状态。
如果在当前schema下已经存在同名的表,则闪回失败,需要使用rename to选项指定一个新的表名。 成功闪回一个表后,回收站视图recyclebin和回收站系统表sys_recyclebin中对象将被清除。
一个FLASHBACK命令:
FLASHBACK TABLE TABLE_name TO BEFORE DROP;
这个命令将在回收站中的TABLE_name闪回到闪回之前的状态:
FLASHBACK TABLE TABLE_name TO BEFORE DROP RENAME TO newname;
将回收站中的表闪回到一个新的表名:
二、kingbaseES V8R6 flashback drop table配置
1、配置kdb_flashback extension
[kingbase@node102 data]$ cat kingbase.conf |grep flashback
shared_preload_libraries = 'liboracle_parser, synonym, plsql, force_view, kdb_flashback,plugin_debugger, plsql_plugin_debugger, plsql_plprofiler, ora_commands,kdb_ora_expr, sepapower, dblink, sys_kwr, sys_ksh, sys_spacequota, sys_stat_statements, backtrace, kdb_utils_function, auto_bmr, sys_squeeze, src_restrict'
2、启用kdb_flashback功能
prod=# show kdb_flashback.db_recyclebin ;
kdb_flashback.db_recyclebin
-----------------------------
off
(1 row)
prod=# alter system set kdb_flashback.db_recyclebin=on;
prod=# select sys_reload_conf();
sys_reload_conf
-----------------
t
(1 row)
prod=# show kdb_flashback.db_recyclebin ;
kdb_flashback.db_recyclebin
-----------------------------
on
(1 row)
2 、查看回收站
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-----+---------------+----------+------
(0 rows)
3、drop table回收测试
# 查看表结构
prod=# \d ts
Table "public.ts"
Column | Type | Collation | Nullable | Default
---------+----------+-----------+----------+---------
doc | text | | |
doc_tsv | tsvector | | |
Indexes:
"ts_doc_tsv_idx" gin (doc_tsv)
#删除表
prod=# drop table ts;
DROP TABLE
#查看回收站
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-------+----------------------+-------------------------------+-------
26787 | ts | 2022-12-12 16:56:43.140637+08 | TABLE
26793 | ts_doc_tsv_idx | 2022-12-12 16:56:43.140083+08 | INDEX
26792 | pg_toast_26787_index | 2022-12-12 16:56:43.140591+08 | INDEX
(3 rows)
---如上所示,回收站中包括表自身还有索引等对象信息
#将表闪回
prod=# flashback table ts to before drop rename to ts1;
FLASHBACK TABLE
prod=# \d
List of relations
Schema | Name | Type | Owner
--------+---------------------+-------+--------
public | sys_stat_statements | view | system
public | t1 | table | system
public | test1 | table | system
public | ts1 | table | system
(4 rows)
#表已经被闪回
prod=# select * from ts1;
doc | doc_tsv
--------------------------------------------------------+----------------------------------------------------------------------
--------------------------
Can a sheet slitter slit sheets? | 'a':2 'can':1 'sheet':3 'sheets':6 'slit':5 'slitter':4
How many sheets could a sheet slitter slit? | 'a':5 'could':4 'how':1 'many':2 'sheet':6 'sheets':3 'slit':8 'slitt
er':7
I slit a sheet, a sheet I slit. | 'a':3,5 'i':1,7 'sheet':4,6 'slit':2,8
Upon a slitted sheet I sit. | 'a':2 'i':5 'sheet':4 'sit':6 'slitted':3 'upon':1
Whoever slit the sheets is a good sheet slitter. | 'a':6 'good':7 'is':5 'sheet':8 'sheets':4 'slit':2 'slitter':9 'the'
:3 'whoever':1
I am a sheet slitter. | 'a':3 'am':2 'i':1 'sheet':4 'slitter':5
I slit sheets. | 'i':1 'sheets':3 'slit':2
I am the sleekest sheet slitter that ever slit sheets. | 'am':2 'ever':8 'i':1 'sheet':5 'sheets':10 'sleekest':4 'slit':9 'sl
itter':6 'that':7 'the':3
She slits the sheet she sits on. | 'on':7 'she':1,5 'sheet':4 'sits':6 'slits':2 'the':3
(9 rows)
#回收站数据已经被闪回
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-----+---------------+----------+------
(0 rows)
4、drop table...purge测试
Tips:
在drop table时如果使用了purge参数,表将不会保留在回收站,注意此参数的风险。
prod=# drop table ts1 purge;
DROP TABLE
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-----+---------------+----------+------
(0 rows)
三、清理回收站
1、清理指定表
prod=# drop table t1;
DROP TABLE
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-------+---------------+-------------------------------+-------
35003 | t1 | 2022-12-19 10:53:31.035541+08 | TABLE
(1 row)
prod=# purge table t1;
PURGE
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-----+---------------+----------+------
(0 rows)
2、清理回收站所有对象
prod=# \d test1
Table "public.test1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | not null |
v_name | varchar | | |
Indexes:
"test1_pkey" PRIMARY KEY, btree (id)
"test1_name_ind" btree (v_name)
#删除表
prod=# drop table test1;
DROP TABLE
#查看回收站信息
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-------+----------------------+-------------------------------+------------
16720 | test1 | 2022-12-19 10:47:20.672125+08 | TABLE
26800 | test1_name_ind | 2022-12-19 10:47:20.670681+08 | INDEX
16726 | test1_pkey | 2022-12-19 10:47:20.671065+08 | INDEX
16725 | pg_toast_16720_index | 2022-12-19 10:47:20.672085+08 | INDEX
16727 | test1_pkey | 2022-12-19 10:47:20.671065+08 | CONSTRAINT
(5 rows)
#清理回收站
prod=# purge recyclebin;
PURGE
#查看回收站(对象已经清空)
prod=# SELECT * FROM RECYCLEBIN;
oid | original_name | droptime | type
-----+---------------+----------+------
(0 rows)
四、总结
KingbaseES V8R6的kdb_flashback功能,可以通过回收站机制的将用户误删除(drop table)的表数据快速恢复,有效缩短数据库恢复的RTO。