一、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。

KingbaseES V8R6 运维案例 --flashback drop table的更多相关文章

  1. KingbaseES V8R6备份恢复案例之---自定义表空间指定恢复目录数据恢复

    案例说明: KingbaseES V8R6在通过sys_rman执行物理备份恢复时,可以通过参数'--kb1-path',指定恢复的数据(data)目录,但如果原备份中包含自定义表空间时,需要建立表空 ...

  2. KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障

    案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...

  3. KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例

    案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作.若主节点已经失效,希望将异地备机提升为主节点. $bin/repmgr s ...

  4. KingbaseES V8R6备份恢复案例之--删除test数据库后sys_backup.sh备份

    案例说明: KingbaseES V8R6通过sys_backup.sh执行物理备份,默认sys_backup.sh执行备份初始化时,需要连接test数据库进行身份的认证:在一些生产环境为了安全需求, ...

  5. 运维案例 | Exchange2010数据库损坏的紧急修复思路

    ​​关注嘉为科技,获取运维新知 Exchange后端数据库故障,一般都会是比较严重的紧急故障,因为这会直接影响到大面积用户的正常使用,而且涉及到用户数据.一旦遇到这种级别的故障,管理员往往都是在非常紧 ...

  6. KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份

    案例说明: 在生产环境,有的应用需要调用数据库的sys_rman做备份,为了区分数据库自身的sys_rman备份和应用的备份,可以使用不同的stanza name创建备份.本案例介绍了,如何在King ...

  7. KingbaseES V8R6备份恢复案例之---手工清理冗余历史备份

    案例说明: 对于KingbaseES V8R6的通过sys_rman执行的物理历史备份,可以在执行备份时,备份的保留(retention)策略自动清理.不能通过手工删除备份,可以通过expire参数手 ...

  8. KingbaseES V8R3集群运维案例之---主库系统down failover切换过程分析

    ​ 案例说明: KingbaseES V8R3集群failover时两个cluster都会触发,但只有一个cluster会调用脚本去执行真正的切换流程,另一个有对应的打印,但不会调用脚本,只是走相关的 ...

  9. KingbaseES V8R3集群运维案例之---用户自定义表空间管理

    ​案例说明: KingbaseES 数据库支持用户自定义表空间的创建,并建议表空间的文件存储路径配置到数据库的data目录之外.本案例复现了,当用户自定义表空间存储路径配置到data下时,出现的故障问 ...

  10. KingbaseES V8R3集群运维案例之---kingbase_monitor.sh启动”two master“案例

    案例说明: KingbaseES V8R3集群,执行kingbase_monitor.sh启动集群,出现"two master"节点的故障,启动集群失败:通过手工sys_ctl启动 ...

随机推荐

  1. DOM和BOM的区别

    DOM和BOM的区别 在浏览器中运行的JavaScript可以认为由三部分组成:ECMAScript描述了该语言的语法和基本对象,DOM文档对象模型描述了处理网页内容的方法和接口,BOM浏览器对象模型 ...

  2. 李宏毅2022机器学习HW3 Image Classification

    Homework3 数据集下载 在本地环境下进行实验总是令人安心,但是又苦于网上找不到数据集,虽然kaggle上有数据集但是下载存在问题 于是有了一个天才的想法,间接从kaggle上下载(利用outp ...

  3. win32-改变Combox的编辑框和下拉列表的背景颜色和文本字体颜色

    只需要调用WM_CTLCOLORLISTBOX和WM_CTLCOLOREDIT来分别处理编辑框和下拉列表. Combox的创建: int xpos = 100; // Horizontal posit ...

  4. win32-SetupDiSetClassInstallParamsW的使用

    SetupDiSetClassInstallParams函数一般是用来禁用/启用某个设备 比如我们可以禁用网络适配器 /* for Devpkey */ #define INITGUID /* dep ...

  5. Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

    前言   前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试. ...

  6. libmatio开发笔记(一):matlab文件操作libmatio库介绍,编译和基础Demo

    前言   Qt可通过matlab的库对mat文件进行读写,第三方库matio也可以对mat文件进行读写,其已经支持mat文件的7.3版本.   libmatio库介绍   matio软件包含一个用于读 ...

  7. Qt开发Activex笔记(三):C#调用Qt开发的Activex控件

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113789727 长期持续带来更多项目与技术分享 ...

  8. Ubuntu 安装 Python3.6.7

    注意: 不要卸载ubuntu自带的python版本: ubuntu下不同版本的python可以共存,可直接安装python3.6. 1.升级包索引和软件 sudo apt update sudo ap ...

  9. 7z命令

    文件解压缩命令 语法格式:7z 参数 文件名 常用参数 a 向压缩包中添加文件 t 测试压缩包的完整性 d 从压缩包中删除文件 u 更新压缩包中的文件 e 从压缩包中提取文件 x 解压文件时保留绝对路 ...

  10. 【八股cover#2】CPP语法 Q&A与知识点

    CPP语法 Q&A与知识点 简历cover 1.熟练使用C的指针应用及内存管理 指针与引用的区别 指针是一个存储地址的变量,可以有多级,可以为空,并且在初始化后可以改变指向: 引用是原变量的别 ...