oracle 9i以前,当drop一个表时,到该表的所有引用都会从数据字典中删除。
oracle 10g及以后,当drop一个表时,数据库根本没有删除表,而只是重命名了并放入了回收站。即当发出drop命令时,其实数据库内部执行的是rename操作,此操作应用于index, trigger, constraint,forgein key除外。
既然是rename,就可以撤消删除——通过将表重命名为它原先的名称。但并不能保证总是成功的。因为表占用的空间可能被重用,或在此期间创建了另一个表,表名与被删除的表名相同。

本实验创建一个新的模式tough,并在该模式内创建一个表t,然后drop。之后使用flashback drop恢复它。

SQL> create user tough identified by tough;
SQL> grant create session, resource to tough;

//接下来以新创建的用户tough登录

SQL> create table t (id number, name varchar2(10));
SQL> create index t_idx on t(id);
SQL> alter table t add constraint t_uk unique(id);

SQL> insert into t values (1,'Tough1');
SQL> insert into t values (2,'Tough1');
SQL> commit;

//查看所创建的对象

SQL> select object_name, object_type from user_objects;
OBJECT_NAME               OBJECT_TYPE
------------------------- -------------------
T                         TABLE
T_IDX                     INDEX

//查看所创建的约束

SQL> select constraint_name, constraint_type, table_name from user_constraints;
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME
------------------  ---------------   ------------
T_UK               U               T

SQL> drop table t;

//删除表后,表上的index,constraint也被删除。被删除的对象以新的名称放到了回收站中

SQL> select object_name,original_name,type from user_recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------
BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0 T                                TABLE
BIN$bhFm5rD3Q8ajZdpMhbXdMQ==$0 T_IDX                            INDEX

//此时仍然可以对drop掉的表t作查询,但需使用回收站中的表名

SQL> select * from "BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0";
        ID NAME
---------- ----------
         1 Tough1
         2 Tough1

//但无法对回收站中的对象执行 DDL/DML

SQL> insert into "BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0" values (1,'Tough');
insert into "BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0" values (1,'Tough')
ORA-38301: 无法对回收站中的对象执行 DDL/DML

//执行flashback table恢复删除掉的表

SQL> flashback table t to before drop;

或使用下面的方式作恢复

//这样做是有必要的,可以防止闪回期间创建了另一个与删除表重名的表

SQL> flashback table t to before drop rename to t_new;

//恢复后可以查看对象,但发现index,constraint使用的还是回收站中的名字

SQL> select object_name, object_type from user_objects;
OBJECT_NAME                        OBJECT_TYPE
---------------------------------- -----------
T                                  TABLE
BIN$bhFm5rD3Q8ajZdpMhbXdMQ==$0     INDEX

SQL> select constraint_name, constraint_type, table_name from user_constraints;
CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME
------------------------------ --------------- ---------
BIN$L6IXINvgSs6FAWa2FNiVYw==$0 U               T

//我们可以对index,constraint重命名

SQL> alter index "BIN$bhFm5rD3Q8ajZdpMhbXdMQ==$0" rename to T_IDX;
SQL> alter table t rename constraint "BIN$L6IXINvgSs6FAWa2FNiVYw==$0" to T_UK;

//重命名后一切ok

SQL> select object_name, object_type from user_objects;
OBJECT_NAME               OBJECT_TYPE
------------------------- -------------------
T                         TABLE
T_IDX                     INDEX

SQL> select constraint_name, constraint_type, table_name from user_constraints;
CONSTRAINT_NAME    CONSTRAINT_TYPE TABLE_NAME
------------------ --------------- ------------
T_UK               U               T

//查询之前删除的表t,数据都恢复回来了

SQL> select * from t;
        ID NAME
---------- ----------
         1 Tough1
         2 Tough1

实验完毕。

关于闪回表,需要注意以下几点:
1. flashback drop只能执行drop命令后的恢复,而不能恢复truncate命令;
2. 如果删除了一个用户,不能闪回任何表。因为将模式删除,oracle无法维护对象(即使在回收站内),因为没有可供连接的用户;
3. 所有闪回操作出现在对象所属模式内;
4. 如果删除了表,然后创建了同名的表,接着删除了它。那么在回收站内将有两个表。它们具有不同的回收站名称,但原始名相同。默认情况下flashback drop总是闪回最新版本的表。若最新的表不是你想要的版本,你可以指定你希望恢复的版本的回收站名称,而不是原先的表名。
flashback "BIN$UXcOdSu3ROWVOHPk8Dpp+Q==$0" to before drop;
5. flashback不适用于system表空间;


Flashback删除(闪回删除)的更多相关文章

  1. oracle recyclebin详解(闪回删除的表)

    今天在SOA应用数据库上运用DBMS_REDEFITION包进行在线非分区表转换分区表操作时,本想DROP掉建的临时表cube_scope_temp不小心后面忘记加"temp"直接 ...

  2. Oracle Flashback Technologies - 闪回被drop的表

    Oracle Flashback Technologies - 闪回被drop的表 在oracle10g中,drop一个表后,表没有真正被删除,支持被rename后放在recyclebin中. #新建 ...

  3. Oracle Flashback Technologies - 闪回查询

    Oracle Flashback Technologies - 闪回查询 查看表中,某行数据的修改记录 #创建一个表,并插入和修改数据 SQL> create table y3(id )); T ...

  4. Oracle Flashback Technologies - 闪回数据库

    Oracle Flashback Technologies - 闪回数据库 根据指定的SCN,使用rman闪回数据库 #查看可以闪回到多久前 SQL> select * from v$flash ...

  5. flashback query闪回数据

    误删除了部分重要数据,已提交,需要恢复.首先尝试flashback query闪回数据. 数据库运行在归档模式,首先确认数据库的SCN的变化: SQL> col fscn for 9999999 ...

  6. PLSQL_闪回删除FlashBack Delete表误删除如何进行恢复(案例)

    2014-07-02 Created By BaoXinjian

  7. PLSQL_闪回删除FlashBack Drop表误删除如何进行恢复(案例)

    2014-06-25 Created By BaoXinjian

  8. oracle数据库flashback系列--闪回数据库在dataguard中的使用

    很多人在学习flashback database这个oracle技术的时候,都会有一个疑问,就是如果我只有一个数据库作为生产库的话,是否有这样的业务需求导致我们要把数据库闪回到以前的时间点?以及这样做 ...

  9. Flashback Database 闪回数据库

    一.  Flashback Database 说明 Flashback Database 功能非常类似与 RMAN 的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于 Fl ...

随机推荐

  1. ArcGis :正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

    解决此异常的方法有以下两种: 方法一 把vs2005菜单的 调试->异常->Managed Debuggin Assistants->LoaderLock 的选中状态去掉  如果异常 ...

  2. JS的replace方法【转】

    replace() 方法的参数 replacement 可以是函数而不是字符串.在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用.该函数的第一个参数是匹配模式的字符串.接下来的参数 ...

  3. hadoop学习记录(一)HDFS

    hadoop的灵感源于谷歌,最初目的是解决传统数据库处理数据成本高和速度慢的问题. hadoop两个核心项目是HDFS(hadoop分布式文件系统)和MapReduce. HDFS用来实现数据的存储, ...

  4. PHP用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)执行外部命令

    例如: echo `whoami`; // 导出数据库,要导入的文件夹必须要有可写权限, -u -p之后的内容必须要紧挨着写 echo `mysqldump -h localhost -u$DbUse ...

  5. 关于 VS2012 创建 MVC4 Empty 项目的一个小问题

    今天下午发现一个新建的项目工作异常,主要表现为应该返回JSON的Action没有返回JSON字符串,而是返回了JsonResult的对象名,即字符串“System.Web.Mvc.JsonResult ...

  6. poj 2942 点的双连通分量

    思路: 对于该图,直接用建图貌似没法解,所以也很容易想到建补图,这样存在边的两个点就能再圆桌上做一起.也就将问题转化为对双连通分量中是否存在奇圈了. 我们将每次查询的边保存在stack中,当遇到关键点 ...

  7. MYSQL5.5和5.6参数的差异

    performance_schema 在 MySQL 5.6 中默认是开启的,但相关的很多参数相比 MySQL 5.5 却是降低了,例如 performance_schema 自动调整到 445 个表 ...

  8. WCF配置文件详解 【转】

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  9. asp.net常见面试题(一)

    1.索引器 class Player { ]; public int this[int index] { get { || index >= ) { ; } else { return arr[ ...

  10. C#winform MDI子窗体打开时内容显示不全

    出现这种情况一般是 打开了多个MDI的子窗体,打开新窗体的时候关闭其他的子窗体就OK了, 具体代码: foreach (Form form in main.MdiChildren)           ...