从10g出现的,用于恢复用户删除的对象(包括表和索引,约束,触发器,LOB段,LOB索引段,对于SYS和SYSTEM用户无效),Flashback Drop基于Tablespace RecycleBin实现。 只闪回与表相关连的对象。如果函数或者存储的恢复,则要使用Flashback Query。 每个表空间都有一个回收站的逻辑概念区域,当执行drop时,被删除的表和相关连对象,会转移到回收站, 以便用户恢复。
一、查看回收站功能是否启用
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string OFF
二、启用回收站功能,需要重启数据库(如果只在当前会话级别,则不用重启)
SQL> alter session set recyclebin=on;
会话已更改。
SQL> alter session set recyclebin=off;
会话已更改。
SQL> alter system set recyclebin=on;
alter system set recyclebin=on
*
第 1 行出现错误:
ORA-02096: 此选项的指定初始化参数不可修改
SQL> alter system set recyclebin=on scope=spfile;
系统已更改。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 778387456 bytes
Fixed Size 1374808 bytes
Variable Size 352322984 bytes
Database Buffers 419430400 bytes
Redo Buffers 5259264 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string ON
禁用回收站,则删除的对象不会保存在recyclebin里面,如果删除时指定purge,则也不会保存。
drop table table_name purge;
三、测试
3.1连接到非sys或system测试用户
SQL> conn scott/tiger;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
3.2查看当前用户下的表
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
DEPT
EMP
BONUS
SALGRADE
TESTNAME
3.3选择一个进行删除操作
SQL> desc testname;
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
NAME VARCHAR2(50) Y
SQL> select * From testname;
NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF
3.4删除
SQL> drop table testname;
Table dropped
SQL> select * From testname;
select * From testname
ORA-00942: 表或视图不存在
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTNAME BIN$fm+hddx2TWCNTBzn7GT+Zg==$0 TABLE 2014-01-25:13:01:27
3.5查看回收站中的对象
SQL> select object_name,original_name,operation from recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION
------------------------------ -------------------------------- ---------
BIN$fm+hddx2TWCNTBzn7GT+Zg==$0 TESTNAME DROP
3.6查看对象中的内容 ,注意表名用引号括起来,否则可能会由于特殊符号的问题,导致不认为是一个表名。
SQL> select * From BIN$fm+hddx2TWCNTBzn7GT+Zg==$0 ;
select * From BIN$fm+hddx2TWCNTBzn7GT+Zg==$0
*
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束
SQL> select * From "BIN$fm+hddx2TWCNTBzn7GT+Zg==$0";
NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF
回收站是一个逻辑概念,不会存储数据,因此被删除的对象和普通对象实际上位于同样的存储区域,这样可能会产生争用或覆盖的问题.
覆盖以先进先出的顺序进行。
3.7闪回
SQL> flashback table testname to before drop;
闪回完成。
SQL> select * from testname;
NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF
可以手动删除recyclebin表空间
purge tablespace tablespace_name 删除某个表空间的recyclebin
purge tablespace tablespace user user_name删除某个表空间下面recyclebin中指定的用户的对象
purge recyclebin清除当前用户的recyclebin中的对象
purge dba_recyclebin 删除所有用户的recyclebin中的对象,需要DBA权限。
drop table table_name purge 永久删除对象,不存放于recyclebin中,不能用flashback恢复,需要进行不完全恢复。
purge index recycle_bin_object_name ,释放index所占用的空间,因为索引可以重建(包括在线重建)。
3.8 如果闪回时,发现已经有重名对象,则可以在闪回过程中重命名要闪回的对象
SQL> drop table testname;
表已删除。
SQL> create table testname (id number,name varchar2(32));
表已创建。
SQL> flashback table testname to before drop;
flashback table testname to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
SQL> flashback table testname to before drop rename to testnamenew;
闪回完成。
SQL> select * From testnamenew;
NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF
3.9闪回完成后,则recyclebin中的对象消失。
SQL> drop table testnamenew;
表已删除。
SQL> select object_name,original_name, operation from recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION
------------------------------ -------------------------------- ---------
BIN$WIyQaK0XQKm00pjxNursyA==$0 TESTNAMENEW DROP
SQL> flashback table testnamenew to before drop;
闪回完成。
SQL> select object_name,original_name, operation from recyclebin;
未选定行
Flashback Drop 特性
1.只用于非系统表空间和本地管理的表空间
2.指向该对象的外键约束需要重建
3.对象恢复的成功依赖于对象空间是否被覆盖。
4.当删除表时,对应的物化视图会被删除,但是不会恢复,需要重建。
5.recyclebin中的对象只读。
6.闪回表时,索引等信息会恢复,但是会被ORACLE自动命名,因此需要重新命名。
alter index index_name rename to original_name;