回收站介绍:实现闪回删除功能,需要使用oracle回收站。回收站是所有被删除对象及其相依对象的逻辑存储容器,例如当一个表被drop时,该表及其相依对象并不会马上被数据库彻底删除,而是被保存到回收站中。
回收站将用户执行的drop操作记录在一个系统表中,也就是将被删除的对象写到一个数据字典中。如果确定不再需要该对戏那个,可以使用purge命令对回收站进行清空。被删除的对象的名称可能相同。为了确保添加到回收站中的对象的名称都是唯一的,系统会对这些保存到回收站中的对象进行重命名,命名格式如下:
BIN$globalUID$version
其中,BIN表示RecycleBIN,globalUID是一个全局唯一的、24个字符长的标识对象,该标识与原对象名没有任何关系,$version表示数据库分配的版本号。
接下来演示一个示例:
首先创建一个表tb_temptest,并插入两条数据:
SQL> create table tb_temptest(id number)
2 /
表已创建。
SQL> insert into tb_temptest select 1 from dual union select 2 from dual
已创建2行。
SQL> commit;
提交完成。
查看刚插入的数据:
SQL> select * from tb_temptest;
ID
----------
1
2
SQL>
执行drop删除表:
SQL> drop table tb_temptest;
表已删除。
查看回收站是否保存了刚才删除的表
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TB_TEMPTEST BIN$/xHQTJWwTr20WgwHd65BUQ==$0 TABLE 2013-01-26:20:50:32
从上面可以看出刚才删除的表被存储在回收站中了(注意sys用户和system用户除外,只有普通用户操作才能被保存到回收站中)
执行闪回删除,相应的数据也恢复回来了:
SQL> flashback table tb_temptest to before drop;
闪回完成。
SQL> show recyclebin;
SQL> select * from tb_temptest;
ID
----------
1
2
SQL>
如果在执行闪回操作时数据库中已经重建了相同的表名,这时需要对闪回的表进行重命名:
SQL> flashback table tb_temptest to before drop rename to newtablename;
闪回时也可以使用RECYCLEBIN NAME进行恢复,(但要加双引号)
我们再次drop掉表tb_temptest,并用RECYCLEBIN NAME进行闪回:
SQL> drop table tb_temptest;
表已删除。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TB_TEMPTEST BIN$EjDM+LpCQ22xKBt22KnjXQ==$0 TABLE 2013-01-26:21:08:12
SQL> flashback table "BIN$EjDM+LpCQ22xKBt22KnjXQ==$0" to before drop;
闪回完成。
SQL> show recyclebin;
SQL> select * from tb_temptest;
ID
----------
1
2
SQL>