误 drop table 的恢复

时间:2025-04-09 20:40:20

因为失误,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空间的利用规则:

    1. 使用现有的表空间的未使用空间
    2. 如果没有了空闲空间,则检查回收站,对于回收站的对象按照先进先出的原则,对于最先删除的对象,

       oracle在空间不足之时会最先从回收站删除以满足新分配空间的需求
    3. 如果回收站也没有对象可以清理,则检查表空间是否自扩展,如果自扩展则扩展表空间,然后分配新空

       间
    4.如果表空间非自扩展,或者已经不能自扩展(到达最大限制),则直接报表空间不足错误,程序终止