因为失误,drop table ,导致关键表丢失,恢复办法如下
DROP TABLE 在oracle中,只是对该表进行重命名,并在数据字典中修改了相关数据,而并没有释放表所占用的物理空间,且还是占用着原来的表空间。
这个时候这张表去哪了呢,drop table 就是将该表重命名为BIN$ 开头的,放在了回收站里即 recyclebin。
要想恢复误drop掉的表,只需要从回收站里取出来就可以了,oracle9i开始引入了flashback table 这个概念。
flashback table ,用于恢复用户误删除的对象,其既可以对DML操作进行恢复,也可以对DDL操作进行恢复(就像drop table),flashback table的使用 依赖于recyclebin【回收站】。
测试:
SQL> conn scott/123456;
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
注释:recyclebin 是默认打开的
SQL> drop table test;
Table dropped.
注释:失误将test表drop掉;
解决办法:
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST BIN$BnzUiiqUBgngUwsKChQQcQ==$0 TABLE 2014-10-28:22:34:30
注释:recyclebin 是 user_recyclebin 的同意词,所以查询相应的表,要在相应的用户下才能查到drop掉的表的信息;
注释:确保误drop掉的表在回收站里
SQL> flashback table test to before drop;
Flashback complete.
注释:使用上述命令即可恢复误drop 掉的表
注意: 被误删的表可以恢复,但是表上的索引以及约束,就不会被恢复,所以恢复完表以后,切记把上面的索引以及约束等进行重建
有时候,并不能从回收站里将误删的表恢复,这就涉及到recyclebin的管理,和oracle空间的利用原则
回收站的管理:
1:直接跳过回收站drop table,并且释放空间,就不会在recyclebin中找到相应的表,同时用flashback table也恢复不了
DROP TABLE PURGE;
2:清空整个回收站
purge recyclebin;
也可以清除指定的对象,如 PURGE TABLE ;
3:show recyclebin; 查看回收站内容
4:如果多次删除同一个名字的表,在回收站中是怎么记录的,怎么管理的,怎么恢复
在删除表的时候,除了重命名为 BIN$ 开头的名字外,还会在dba_recyclebin中的CREATETIME,DROPTIME,DROPSCN等字段来协助唯一定位某张表,并恢复
SQL> flashback table "BIN$BoBD7teTC0jgUwsKChQpVQ==$0" to before drop;
Flashback complete.
oracle空间的利用规则: