回收站机制存在目的是防止用户错误的删除了表、索引等数据库对象,在未使用回收站技术之前,只能用传统的数据恢复方式从备份中恢复,此时需要备份文件以及归档日志文件,这样的恢复往往涉及那些不需要恢复的对象,显然这样的恢复不具针对性,而使用回收站就可以直接的恢复想恢复的对象,更高效省时。
启用回收站后,使用drop table指令删除表,该表不会从数据库中立即删除,而是保持原表的位置,但是将删除的表重新命名,并将删除的表信息存储在回收站中,回收站记录了被删除表的新名字和原名字以及与该表相关的对象信息。
在Halo数据库中,要启动回收站,关键是启动参数RecycleBin,该参数可以通过set指令在会话里动态设置,默认为off。

接下来我们先看一下系统表pg_dbarecyclebin的结构:

oid: 记录对象的唯一标识。
namespace:表示被删除的对象所属的schema
owner: 表示被删除的对象所属的用户
object_name:表示Halo为删除的表的重命名
original_name:为被删除的表的原始表名
type:被删除的数据库对象类型,如表或视图等
can_undrop:记录对象是否可以闪回删除
can_purge:记录对象是否可以被永久删除
一、回收站的drop和flashback
我们先创建一个测试表,然后删除该表,查看该表在回收站中的记录:

由输出可以看出,表t1已经记录在回收站中。记录该表所属schema为public,所属用户为10,并记录了删除时间为2023-12-25 17:42:17,此时自动生成了一个被删除表的系统名称为BIN$262141$140010,该名称由bin$和表oid及版本号组成。
在重命名被删除的表时,也会重命名该表的依赖对象,如涉及的索引视图,函数等。例如:

同样的,闪回回收站中的表,该表的依赖对象,如涉及的索引、视图函数等也会一起回收。回收命令:
flashback table t1 to before drop;
当回收站里有原始名称相同的多条记录时候,使用命令恢复时会优先恢复最近写入回收站的表。有时候我们不需要恢复最近的记录,也可以使用系统生成的名字来恢复指定表。

再次回收t1并重命名为new_t1。使用命令:
flashback table t1 to before drop rename to new_t1;
二、应用purge永久删除表
purge指令可以手工的删除回收站里的对象,在实际的数据库维护中,用户确定不需要某个表,又出于该表的安全性所以不希望放入回收站。此时我们用purge命令来删除即可:
DROP TABLE t1 PURGE;
这样删除的表不会在回收站中记录任何信息,此时查看回收站不会发现表t1的删除记录。如果已经删除一个表,并且该表记录在回收站中,此时又希望永久删除该表,也需要使用purge命令:
PURGE TABLE newt1;






