VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

闪回DROP/TRUNCATE

功能描述

  • 闪回DROP:可以恢复意外删除的表,从回收站中恢复被删除的表及其附属结构如索引、表约束等。闪回drop是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已drop表的恢复。

  • 闪回TRUNCATE:可以恢复误操作或意外被进行truncate的表,从回收站中恢复被truncate的表及索引的物理数据。闪回truncate基于回收站机制,通过还原回收站中记录的表的物理文件,实现已truncate表的恢复。

注意事项

  • 闪回drop/truncate暂不支持USTORE。

  • GUC参数enable_recyclebin需设置为on,表示启用回收站。

  • GUC参数recyclebin_retention_time用于设置回收站对象保留时间,超过该时间的回收站对象将被自动清理;单位为秒(s)。

    以上两个参数均属于SIGHUP类型参数,请参考重设参数表1中对应的设置方法进行设置。

  • 执行闪回DROP需要用户具有如下权限:用户必须具有垃圾对象所在schema的create和usage权限,并且用户必须是schema的所有者或者是垃圾对象的所有者。

  • 执行闪回TRUNCATE需要用户具有如下权限:用户必须具有垃圾对象所在schema的create和usage权限,并且用户必须是schema的所有者或者是垃圾对象的所有者,另外用户必须具有垃圾对象的TRUNCATE权限。

  • 恢复DROP表时,只恢复基表名,其他子对象名均保持回收站对象名。用户可根据需要,执行DDL命令手工调整子对象名。

  • 不适用闪回drop/truncate功能的场景或表:

    • 系统处于维护态(参数xc_maintenance_mode设置为on)或升级场景;

    • 多对象删除场景:DROP/TRUNCATE TABLE命令同时指定多个对象;

    • 系统表、列存表、内存表、DFS表、全局临时表、本地临时表、unlogged表、序列表、hashbucket表。

    • 闪回点和当前点之间执行过修改表结构或影响物理结构的语句,将会导致闪回失败。

  • 从回收站中闪回DROP或者TRUNCATE操作时,语法中的TIMECAPSULE均可替换为FLASHBACK,详见回收站

语法格式

  • 从回收站中恢复被DROP的表:

    { TIMECAPSULE | FLASHBACK } TABLE { table_name } TO BEFORE DROP [RENAME TO new_tablename]
    
  • 从回收站中恢复被TRUNCATE的表:

    { TIMECAPSULE | FLASHBACK } TABLE { table_name } TO BEFORE TRUNCATE
    

语法示例如下:

  • 闪回被drop的表t1:

    TIMECAPSULE TABLE t1 TO BEFORE DROP;
    
  • 闪回被drop的表,指定其在回收站中的rcyname并为其指定一个新名称:

    TIMECAPSULE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO new_t1;
    

参数说明

  • TIMECAPSULE | FLASHBACK

    表示使用闪回功能。

    在使用基于回收站机制的闪回功能时,TIMECAPSULE和FLASHBACK是完全等价的。

  • table_name

    进行闪回操作的对象名称。可以是用户创建表时指定的表名,也可以是对象删除时数据库分配的系统生成名称(rcyname)。

    回收站中系统生成的对象名称是唯一的。因此,如果指定系统生成名称,可以从系统表GS_RECYCLEBIN中查到。即支持使用select * from gs_recyclebin;语句查看回收站中的内容。

  • TO BEFORE DROP

    使用这个子句检索回收站中已删除的表及其子对象。

    如果闪回时指定了用户指定的表名称,且回收站中包含多个同名的对象,那么数据库会检索回收站中最近移动的对象。如果想要检索更早版本的表,建议用户指定表的系统生成名称进行恢复。

  • RENAME TO

    为从回收站中检索的表指定一个新名称。

  • TO BEFORE TRUNCATE

    闪回到TRUNCATE之前。

示例

前置步骤:

1、开启回收站,并设置回收站里的内容保留时间为600秒。

alter system set enable_recyclebin to on;
alter system set recyclebin_retention_time to 600;

2、检查修改情况。

show enable_recyclebin;
show recyclebin_retention_time;

如下返回结果表示修改成功:

 enable_recyclebin
-------------------
 on
(1 row)

 recyclebin_retention_time
---------------------------
 10min
(1 row)

3、创建三张测试表并分别插入一条数据。

create table table_01(id int);
create table table_02(id int);
create table table_03(id int);
insert into table_01 values (1);
insert into table_02 values (2);
insert into table_03 values (3);

4、对这3张表分别执行DROP/TRUNCATE操作。

drop table table_01;
drop table table_02;
truncate table table_03;

示例1: 从回收站中恢复表table_01。

1、执行恢复操作。

TIMECAPSULE TABLE table_01 TO BEFORE DROP;

2、查看表数据:

select * from table_01;

当显示如下内容,表示table_01已从回收站中恢复。

id
----
1
(1 row)

示例2: 找到table_02在回收站中表的系统生成名称,并从回收站中恢复。

1、开启扩展输出。

\x on

2、查看回收站中的内容。

select * from gs_recyclebin;

在返回结果中,找到table_02对应记录中的rcyname。

本示例中table_02对应的rcyname为BIN$40A94EB40EA$90EB7A0==$0

-[ RECORD 1 ]--+------------------------------
rcybaseid      | 16627
rcydbid        | 16553
rcyrelid       | 16618
rcyname        | BIN$40A94EB40EA$90EB7A0==$0
rcyoriginname  | table_02
rcyoperation   | d
rcytype        | 0
rcyrecyclecsn  | 114826
rcyrecycletime | 2023-04-06 14:10:41.532987+08
rcycreatecsn   | 110378
rcychangecsn   | 110378
rcynamespace   | 2200
rcyowner       | 10
rcytablespace  | 0
rcyrelfilenode | 16618
rcycanrestore  | t
rcycanpurge    | t
rcyfrozenxid   | 123481
rcyfrozenxid64 | 123481

3、关闭扩展输出。

\x off

4、从回收站中恢复表table_02,并重命名为new_table。

TIMECAPSULE TABLE "BIN$40A94EB40EA$90EB7A0==$0" TO BEFORE DROP RENAME TO new_table;

5、查看表new_table的数据。

select * from new_table;

当显示如下内容,表示原table_02已从回收站中恢复并被重命名。

id
----
2
(1 row)

示例3: 从回收站中恢复表table_03。

1、执行恢复操作。

TIMECAPSULE TABLE table_03 TO BEFORE TRUNCATE;

2、查看表数据。

select * from table_03;

当显示如下内容,表示表table_03已从回收站中恢复。

id
----
3
(1 row)