暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磐维闪回 drop/truncate

武林萌主 2024-10-21
135

1. 功能描述

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

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

2. 注意事项

 闪回 drop/truncate 支持 ASTORE 和 USTORE 存储引擎。

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

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

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

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

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

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

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

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

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

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

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

3. 语法格式

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

{ TIMECAPSULE | FLASHBACK } TABLE { table_name } TO BEFORE DROP [RENAME TO new_tablename]

 从回收站中恢复被 TRUNCATE 的表:

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

4. 参数说明

 TIMECAPSULE | FLASHBACK

表示使用闪回功能。

【说明】

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

 table_name

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

【说明】

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

 TO BEFORE DROP

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

【说明】

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

 RENAME TO

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

 TO BEFORE TRUNCATE

闪回到 TRUNCATE 之前。

5. 示例

5.1 前置步骤:

1、开启回收站。

echo "enable_recyclebin=on" >> $PGDATA/postgresql.conf

2、设置回收站里的内容保留时间为 600 秒。

echo "recyclebin_retention_time=600" >> $PGDATA/postgresql.conf

3、重启数据库使修改生效。

pw_ctl restart


4、使用 psql 工具连接至 panweidb 数据库。

psql -r

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

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);

6、对这 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 已从回收站中恢复。


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

1、开启扩展输出。

\x on

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

select * from gs_recyclebin;

在返回结果中,找到 table_02 对应记录中的 rcyname。本示例中 table_02对应的 rcyname 为 BIN$40A94EB40EA$90EB7A0==$0。

3、关闭扩展输出。

\x off

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

TIMECAPSULE TABLE "BIN$4C7C4EB4C80$48862258==$0" TO BEFORE DROP RENAME TO new_table;


5、查看表 new_table 的数据。

select * from new_table;

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


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

1、执行恢复操作。

TIMECAPSULE TABLE table_03 TO BEFORE TRUNCATE;

2、查看表数据。

select * from table_03;

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


(1 row)


转发链接  https://www.modb.pro/db/1847180530482249728

文章转载自武林萌主,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论