表级别闪回
闪回删除的目的是防止用户错误的删除表,索引等数据库对象,启动闪回后,在删除一个表时,物理上该表没有被删除,但是它占用
的空间回到空闲列表,也就是这段空间在某种条件下是可以被占用的。
闪回删除原理
使用drop table删除表,该表不会直接从数据库立即删除,而是保持原表的位置,但是将删除的表重新命名,并将删除的表信息存储
在回收站中,回收站记录了表的新名字和原名字,显然此时被删除的表空间没有立即被释放,变成数据库可以使用的潜在空间,记录
在回收站的信息会保留一段时间,直到回收站空间不足或者使用purge指令删除回收站中的记录。
回收站是一个逻辑结构,不具物理数据结构,只要删除的表信息记录在回收站中就可以恢复删除的表。
show parameter recyclebin; --首先查看回收站是否启用,没有启用的话要开启哦
alter system set recyclebin=on scope=both;
我们可以通过user_recyclebin和dba_recyclebin查看回收站的一些信息
启动实验:
select * from test3; --证明T表存在哈,没得别的意思
drop table test3; --然后我删
col ts_name for a10
col owner for a10
col original_name for a10
select owner,original_name,object_name,ts_name,droptime from dba_recyclebin;
OWNER ORIGINAL_N OBJECT_NAME TS_NAME DROPTIME
---------- ---------- ------------------------------ ---------- -------------------
TEST3 TEST3 BIN$cfNgvSK4TI2vgQ0zSatHLw==$0 USERS 2013-10-06:13:27:30
该视图记录着被删除表的用户,所属表空间,删除时间,删除自动生成表的系统名称为:BIN$cfNgvSK4TI2vgQ0zSatHLw==$0
flashback table test3 to before drop ; --现在从回收站恢复被删除的表
show recyclebin 在查看回收站没有了撒
select * from test3;
实验2:
我们可以通过回收站中系统命名删除的表进行恢复,然后命名这样做的好处就是多个同表名
drop table test3;
show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST3 BIN$S1kgPualRa6eA0H0PYsewA==$0 TABLE 2013-10-06:13:33:28
flashback table "BIN$S1kgPualRa6eA0H0PYsewA==$0" to before drop rename to test4;
SQL> flashback table "BIN$S1kgPualRa6eA0H0PYsewA==$0" to before drop rename to test4;
闪回完成。
记到要加双引号,至于为什么要加,我也没怎么研究,我们就理解为字符串嘛
select table_name from user_tables;
TABLE_NAME
-----------------
TEST4
完成
实验3:
基于有对象的表被删,然后还原
create index index_test4 on test4(ID); --建立索引
select index_name,table_name from user_indexes where table_name='TEST4'; --验证索引是否有效
INDEX_NAME TABLE_NAME
------------------------------ ----------------
INDEX_TEST4 TEST4
drop table test4;
show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST4 BIN$Ky4TIqoXR9aZC9ynvfMdvg==$0 TABLE 2013-10-06:13:41:51
select index_name,table_name from user_indexes where table_name='TEST4'; --再次查看索引无效了撒
flashback table test4 to before drop;
select index_name,table_name from user_indexes where table_name='TEST4';
INDEX_NAME TABLE_NAME
------------------------------ -----------
BIN$BlnhZPmIT0OjBKYkJXVrbg==$0 TEST4
闪回成功,索引也闪回成功,只不过ORALCE该它命名了个名字,好个烦,现在我们要重新给索引命名
drop index "BIN$BlnhZPmIT0OjBKYkJXVrbg==$0";
create index index_test4 on test4(id);
完成