Flashback删除(闪回删除)
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 TSQL> 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 INDEXSQL> 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 INDEXSQL> 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删除(闪回删除)的更多相关文章
- oracle recyclebin详解(闪回删除的表)
今天在SOA应用数据库上运用DBMS_REDEFITION包进行在线非分区表转换分区表操作时,本想DROP掉建的临时表cube_scope_temp不小心后面忘记加"temp"直接 ...
- Oracle Flashback Technologies - 闪回被drop的表
Oracle Flashback Technologies - 闪回被drop的表 在oracle10g中,drop一个表后,表没有真正被删除,支持被rename后放在recyclebin中. #新建 ...
- Oracle Flashback Technologies - 闪回查询
Oracle Flashback Technologies - 闪回查询 查看表中,某行数据的修改记录 #创建一个表,并插入和修改数据 SQL> create table y3(id )); T ...
- Oracle Flashback Technologies - 闪回数据库
Oracle Flashback Technologies - 闪回数据库 根据指定的SCN,使用rman闪回数据库 #查看可以闪回到多久前 SQL> select * from v$flash ...
- flashback query闪回数据
误删除了部分重要数据,已提交,需要恢复.首先尝试flashback query闪回数据. 数据库运行在归档模式,首先确认数据库的SCN的变化: SQL> col fscn for 9999999 ...
- PLSQL_闪回删除FlashBack Delete表误删除如何进行恢复(案例)
2014-07-02 Created By BaoXinjian
- PLSQL_闪回删除FlashBack Drop表误删除如何进行恢复(案例)
2014-06-25 Created By BaoXinjian
- oracle数据库flashback系列--闪回数据库在dataguard中的使用
很多人在学习flashback database这个oracle技术的时候,都会有一个疑问,就是如果我只有一个数据库作为生产库的话,是否有这样的业务需求导致我们要把数据库闪回到以前的时间点?以及这样做 ...
- Flashback Database 闪回数据库
一. Flashback Database 说明 Flashback Database 功能非常类似与 RMAN 的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于 Fl ...
随机推荐
- ORM之PetaPoco错误--VS中NUGet程序包管理安装PetaPoco
一般在Vs中使用PetaPoco的时候都是使用NuGet程序包管理来安装PetaPoco的,如果你在安装PetaPoco前设置了ConnectionString,那么PetaPoco中的T4模板会自动 ...
- 【Irrlicht鬼火引擎】 认识鬼火引擎
一.Irrlicht简介 (1)概念 Irrlicht引擎是一个用C++书写的高性能实时3D引擎,可以应用于C++程序或者.NET语言中.通过使用Direct3D(Windows平台).OpenGL ...
- Redis中的关系查询(范围查询,模糊查询等...)
本文部分转自于:http://blog.csdn.net/dc_726/article/details/42784317 本文对Redis如何保存关系型数据,以及如何对其匹配.范围.模糊查询进行举例讲 ...
- RestEasy传值方式
一.@pathparam @PathParam 是一个参数注解,可以将一个 URL 上的参数映射到方法的参数上,它可以映射到方法参数的类型有基本类型.字符串.或者任何有一个字符串作为构造方法参数 ...
- hdu 1892 树状数组
思路:就是一个很普通的二维树状数组,注意的是x1,y1不一定在x2,y2的左下方. #include<iostream> #include<cstring> #include& ...
- poj 1523 求割点
思路:对于所有节点,每次找的子树,key[root]++;输出时,对于根节点就输出key[root],对于其它节点i,输出key[i]+1; #include<iostream> #inc ...
- css cursor url用法格式详解
css cursor url用法格式:css:{cursor:url('图标路径'),auto;} //IE,FF,chrome浏览器都可以 实例代码:html{cursor: url("h ...
- 小技巧之a标签自动解析URL
我们可能都知道javascript中的window.location对象用来获取当前页面的地址URL,并把浏览器重定向到新的页面.它有protocol.hostname.host.port.searc ...
- django 学习-10 Django多对多关系模型
1.vim blog/models.py class Author(models.Model): name = models.CharField(max_length=30) def unicod ...
- web工程中URL地址的写法
在开发中我们不可避免的要碰到许多需要写URL地址的情况,这常常让我们感到头疼.下面笔者推荐一种简单的做法.URL地址分为绝对路径和相对路径两种.相对路径又分为相对资源路径和相对根路径.显然绝对路径在开 ...