在Oracle11G中,当你删除一张表的时候,Oracle并不会立马就把这个表从数据库中移除,而是将该表与其相关的对象,比如建立在该表上的索引等改一个名字然后一起放在回收站当中.这个特性叫做Flashback Drop.Oracle这样做的目的是为了避免误删除,能够让数据在误删除之后,可以被找回来.这个是一个非常人性化的特性.至少,我和我的小伙伴们觉着这个特性是极好的.

什么是回收站
回收站其实就是一个数据字典,这个数据字典中保存了很多已经被删除的表以及其他相关联的各种对象,比如索引,约束,嵌套表等等.这些已经被删除掉的对象仍旧在占用空间,它们仍旧会占用当前的磁盘配额.只有当我们使用了purge语句来进行清除或者是数据库因为表空间的约束等原因主动来清空回收站.
每一个用户都可以查询自己的回收站信息,除非当前的用户具备SYSDBA的权限,否则当前的用户只能够查询自己的回收站信息.可以通过下面的语句来进行查询回收站的信息:
SELECT * FROM RECYCLEBIN;
当你使用删除表空间以及表空间中的内容的时候,这个表空间中的对象是不会保存在回收站当中的,回收站将会清理掉里面的所有对象.甚至仅仅是删除表空间的时候,回收站也都是要被清空的.还有下面的情况:当删除一个用户的时候,该用户下的所有的对象也不会保存在回收站,并且已经存在回收站的信息也会被清除.类似的情况还有删除一个簇的时候,删除一个类型的时候.
下面是一个例子:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> CREATE TABLESPACE TEST
  2   DATAFILE 'd:\TEST.DBF' size 30M autoextend on next 10M maxsize unlimited E
XTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
  3  /
Tablespace created.
SQL> create user test identified by test default tablespace test temporary table
space temp;
User created.
SQL> grant all privileges to test;
Grant succeeded.
SQL> connect test/test
Connected.
SQL> create table foo as select level as value from dual connect by level<=100;
Table created.
SQL> drop table foo;
Table dropped.
SQL> create table foo as select level as value from dual connect by level<=100;
Table created.
SQL> create index foo_index on foo(value);
Index created.
SQL> drop table foo;
Table dropped.
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$986nsfRiR06Fih8zSV9S/g==$0 FOO_INDEX
BIN$BXC+oYZPQ02UuTQl5mcpbw==$0 FOO
BIN$zRgQq7WcSA6fosez88IG8w==$0 FOO
SQL> connect / as sysdba
Connected.
SQL> drop tablespace test;
Tablespace dropped.
SQL> connect test/test
Connected.
SQL> select object_name,original_name from recyclebin;
no rows selected
SQL>
通过上面的演示,我们可以看到,当我们删除一个表空间的时候,原来表空间中的对象也被回收站清空了.
当一个对象被删除,然后被放在回收站的时候,这些被删除的表以及与其一同删除的对象,都会被给一个系统自动生成的名字.这个事情是非常必要的,因为这种方式是可以用于解决因为多次删除同一个名字的表而导致的命名的冲突.比如:有一个用户删除了一个名字为 T1 的表,然后重新创建了这个表T1,然后又给删掉了.或者是有两个人删除了同名的两个表.系统给被删除的对象的命名规则是这样子的:
BIN$unique_id$version
上述:
1) unique_id是一个二十六个字母的GUID,这个字符串可以让整个回收站的名字在整个数据库中是唯一的.
2) version是一个由数据库来指定的版本号.
你可以在启动参数中利用recyclebin相关的参数来进行回收站的启动和关闭,当回收站开启的时候,删除表的时候,表以及相关的对象就会放到回收站中.当回收站是关闭的时候,这些表就会被直接删除掉了,这个时候你如果误删除了表的时候,就需要找到另外的恢复手段来进行数据的恢复,比如利用备份文件的方式.
回收站的设置默认是开启的.
ALTER SESSION SET RECYCLEBIN=OFF;
ALTER SESSION SET RECYCLEBIN=ON;
可以在找到initSID.ora在其中修改相关的recyclebin的值来修改回收站的开关信息.
查看回收站中的对象
Oracle数据库提供了两种视图来查看在回收站中的对象.
1)user_recyclebin 这个视图可以用来查看自己已经drop的对象,它有一个同义词recyclebin,让查询变得更加简单.下面的两条语句是一样的:
SELECT * FROM USER_RECYCLEBIN;
SELECT * FROM RECYCLEBIN;
2)dba_recyclebin 这个视图可以提供给具有管理员权限的用户查看回收站中的数据.
SELECT * FROM DBA_RECYCLEBIN WHERE owner='SCOTT';
另外一种方式,你可以通过SQL*PLUS下面的命令来查看回收站中的信息:
SHOW RECYCLEBIN;
除此之外,Oracle还提供了一个非常不错的方式来查询已经在回收站中的数据:
SELECT * FROM "BIN$wFuUFpdPTHmj1LCCWIAJMA==$0";
1)上面应该是双引号,不能是单引号
2)上面应该是表名,type为table才能被查询出数据.
从回收站中清除对象
如果你确定你已经删除的对象已经确实不需要,并且需要释放其占用的空间的时候,你可以使用PURGE关键字来删除回收站中的信息,当然,前提是你的角色需要具备删除对象的权限.
你可以通过下面的查询语句从回收站中查看所有对象,并且可以查询该已经被删除的表中的数据,然后找到确定的表进行删除操作:
ChenZw> select object_name,original_name,type from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$mCyic562TjebGEtVSB7JwA==$0 FOO                              TABLE
BIN$GKo5uAbmRSqZlMofs4Wx+A==$0 FOO                              TABLE
已选择2行。
ChenZw> select * from "BIN$GKo5uAbmRSqZlMofs4Wx+A==$0" where rownum<=2;
     VALUE
----------
     33316
     87980
已选择2行。
ChenZw> purge table "BIN$GKo5uAbmRSqZlMofs4Wx+A==$0";
表已清除。
ChenZw> select object_name,original_name,type from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$mCyic562TjebGEtVSB7JwA==$0 FOO                              TABLE
已选择 1 行。
ChenZw> purge table foo;
表已清除。
除了上面的两种方式之外,还可以使用其他方式来清空当前的回收站中的对象,比如:
PURGE TABLESPACE example;
PURGE TABLESPACE example USER oe;
用户也可以通过使用PURGE RECYCLEBIN命令来删除当前用户下的所有的回收站中的对象。
从回收站中恢复对象
使用FLASHBACK TABLE ... TO BEFORE BEFORE DROP [RENAME TO ...]语句从回收站中恢复数据.后面的rename to是可选的,使用这个可选项可以将恢复的表进行重命名.
下面是一个例子:
SQL> drop table foo;
Table dropped.
SQL> select object_name,original_name,type from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME        TYPE
------------------------------ -------------------- -------------------------
BIN$Cn9JxNU8TzKp2HViGiUF+A==$4 BIN$YDga921kR2eloMbv INDEX
                               BO/FTA==$3
BIN$IOUy08o7QkmhQRUXp98VWg==$0 FOO                  TABLE
SQL> flashback table foo to before drop;
Flashback complete.
SQL> select count(1) from foo;
  COUNT(1)
----------
       100
SQL> select object_name,original_name,type from recyclebin;
no rows selected
SQL> drop table foo;
Table dropped.
SQL> select object_name,original_name,type from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME        TYPE
------------------------------ -------------------- -------------------------
BIN$SEokzU4/TTGzrqYAI1U8CA==$5 BIN$Cn9JxNU8TzKp2HVi INDEX
                               GiUF+A==$4
BIN$lHpRFqtkSYmth5kPQUHxtw==$0 FOO                  TABLE
SQL> flashback table foo to before drop rename to foobak;
Flashback complete.
SQL> select count(1) from foo;
select count(1) from foo
                     *
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select count(1) from foobak;
  COUNT(1)
----------
       100
SQL>
系统提供的自动生成的GUID是一个避免删除表重名的一种非常好的方式,例如下面的例子,我们连续删除了三个名字为foo的表,我们可以使用其中的object_name进行指定的恢复.
SQL> select object_name,original_name,type from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME        TYPE
------------------------------ -------------------- -------------------------
BIN$BSZ/y+VqSZunPgWVSzjXmQ==$0 FOO                  TABLE
BIN$vVUFoa2nSYmNFgdJoce95g==$7 BIN$yYC/5QdqRFu5MY90 INDEX
                               4yVI+w==$6
BIN$v+IfzkDyQNa4MbUP+zFPQw==$0 FOO                  TABLE
BIN$lg5YQjdJQGmz57Dj5NQWIw==$0 FOO                  TABLE
SQL> flashback table "BIN$v+IfzkDyQNa4MbUP+zFPQw==$0" to before drop rename to f
ooback;
Flashback complete.
SQL> select count(1) from fooback;
  COUNT(1)
----------
       100
SQL>
作者 陈字文(热衷于PM\ORACLE\JAVA等,欢迎同行交流)EMAIL:ziwen@163.com  QQ:409020100
我们恢复了里面的表之后,这个表相关联的数据也就会被恢复,但是恢复之后的INDEX等数据仍旧是ORACLE生成的索引的名字.所以我们需要自己来修改里面的索引的名字
SQL> select index_name from user_indexes where table_name = upper('fooback');
INDEX_NAME
------------------------------
BIN$vVUFoa2nSYmNFgdJoce95g==$7
SQL> alter index "BIN$vVUFoa2nSYmNFgdJoce95g==$7" rename to fooback_index;
Index altered.

在Oracle中如何使用Flashback Drop以及管理回收站相关推荐

  1. Oracle 闪回特性(FLASHBACK DROP RECYCLEBIN)

    --============================================== -- Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN) --= ...

  2. oracle中角色的用户和权限管理,用户角色与权限控制

    一.oracle中的用户 系统用户:sys.system(系统创建的用户) 登录命令:sqlplus sys/密码 as sysdba 备注:sys是oracle数据库中最高权限用户,角色为sysdb ...

  3. oracle表没有数据判断,Oracle中判断有表DROP无表CREATE的存储过程

    CREATE OR REPLACE PROCEDURE PD_GENERATE_HELP_LAST_TABLES IS --把从sqlserver中生成的vw_last_xxx所对应的视图生成本地的数 ...

  4. oracle中drop、delete和truncate的区别

    oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...

  5. oracle恢复drop建的表首次,Oracle中Drop,Delete,Truancate表恢复

    Oracle中Drop,delete,truancate表恢复 oracle中,常常会由于一些失误导致表的删除,以下是我写的一些表恢复的方法. 闪回模式得满足条件(启用闪回区和启用归档): 1.检查是 ...

  6. Oracle Flashback之Flashback table和flashback drop

    在Oracle 10g中, Flash back家族分为以下成员: Flashback Database Flashback Drop Flashback Table Flashback Query( ...

  7. 【回收站】恢复oracle中误删除drop掉的表

    恢复oracle中误删除drop掉的表 查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime, ...

  8. Oracle回收站及flashback drop

    Oracle回收站及flashback drop 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你 ...

  9. Oracle回收站及flashback drop(上)

    Oracle回收站及flashback drop(上) 一.1  BLOG文档结构图 Oracle回收站及flashback drop - 3 - 1.1 BLOG文档结构图 - 3 - 1.2 前言 ...

最新文章

  1. 程序猿必备的10款web前端开发插件一
  2. 如何向微软提交 Windows 7 测试反馈
  3. React Native Android端多环境自动打包
  4. 收集Redis 经典面试题
  5. idea 连接云mysql_IDEA开发环境下配置JDBC连接MySQL
  6. pandas系列 read_csv 与 to_csv 方法各参数详解(全,中文版)
  7. c语言入门敲打,C语言基础三(敲打键盘、寻找资料,循环语句)
  8. 从M个数中随机等可能的取出N个的问题
  9. HDU2084 数塔【DP】
  10. Coder Essential之编程语言学习知识点纲要
  11. 渗透之——ASP Web提权
  12. 协议——UART(RS232)
  13. intellij idea 汉化包
  14. Java中dynamic是什么_java中dynamic web project与web project 的区别
  15. Excel入门(一)
  16. 2019年8月10日工作总结
  17. Arduino uno控制蜂鸣器播放音乐(以《大鱼》为例)
  18. 4.12leetcode468. 验证IP地址
  19. Iverilog 源码分析 -- VCD的实现机制
  20. ​交通运输部办公厅关于印发《收费公路政府和社会资本合作操作指南》的通知...

热门文章

  1. labview 的小波包变换工具包使用(三)(范例分析)
  2. lamp部署配置及部署phpmyadmin
  3. CCPL: Contrastive Coherence Preserving Loss for Versatile Style Transfer
  4. B2C外贸独立站怎么引流?策略比渠道重要
  5. Lua(十二)——表
  6. python怎么处理中英文符号网名_python 过滤中文、英文标点特殊符号
  7. 举头望明月,低头敲程序
  8. 【seeprettyface.com】开源源码:人脸属性编辑器
  9. 谁是君的良配?——评张无忌及倚天四女
  10. Mac OS 卸载 betterzip 后,右键还是有 “使用betterzip解压/压缩