【误删数据不要慌,Oracle闪回表来帮忙】之二

转载请注明:来自http://blog.csdn.net/M_ChangGong/ 作者:张燕广

如果在删除表的过程中没有实际删除表因而没有释放表空间那么当被删除的对象占用了所有空间时,会发生什么事?

答案很简单:这种情况根本不会出现。当表空间被回收站数据完全占满,以至于必须扩展数据文件来容纳更多数据时,可以说表空间处于空间压力情况下。此时,对象以先进先出的方式从回收站中自动清除。在删除表之前,相关对象(如索引)被删除。

同样,空间压力可能由特定表空间定义的用户限额而引起。表空间可能有足够的空余空间,但用户可能将其在该表空间中所分配的部分用完了。在这种情况下,Oracle 自动清除该表空间中属于该用户的对象。

此外,有几种方法可以手动控制回收站。

创建测试表TEST2

CREATE TABLE TEST2 AS SELECT * FROM TEST;

DROP  TABLE  TEST2;

--drop掉表test2后再次查看当前模式中的所有表

SELECT * FROM TAB;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

TEST                           TABLE

BIN$ZugeZyQZQYGPau4oeCY4cg==$0 TABLE

再次执行

                       PURGE TABLE TEST2; 

彻底删除表TEST2

或者使用其回收站中的名称,执行   

  PURGE TABLE " BIN$ZugeZyQZQYGPau4oeCY4cg==$0"; 

彻底删除表TEST2

此命令将从回收站中删除表 TEST 及所有相关对象,如索引、约束等,从而节省了空间。但是,如果仅仅是从回收站中永久删除索引,则可以使用以下命令来完成工作:

  PURGE INDEX INDEX_NAME;

创建测试表TEST2

CREATE TABLE TEST2 AS SELECT * FROM TEST;

为表TEST2创建索引IDX_TEST2

CREATE INDEX IDX_TEST2 ON TEST2(ID);

SELECT INDEX_NAME FROM USER_INDEXES;

INDEX_NAME

------------------------------

IDX_TEST2

执行删除表TEST2

DROP  TABLE  TEST2;

再次执行如下查询语句:

SELECT INDEX_NAME FROM USER_INDEXES;

未选定行

说明dropTEST2后该表上的索引也自动删除。

现在执行仅仅在回收站中彻底删除该索引的语句:

PURGE INDEX IDX_TEST2;

索引已清除。

下面再做一个测试:

先把表Test2 drop掉然后利用闪回表进行恢复,观察一下表恢复后索引的变化:

依次执行如下语句:

PURGE TABLE TEST2;

CREATE TABLE TEST2 AS SELECT * FROM TEST;

CREATE INDEX IDX_TEST2 ON TEST2(ID);

DROP  TABLE  TEST2;

执行恢复表命令:

FLASHBACK TABLE TEST2 TO BEFORE DROP;

执行查询索引的语句:

SELECT INDEX_NAME FROM USER_INDEXES;

INDEX_NAME

------------------------------

BIN$BFl7lTEgRz2ZzK+/xTeNCw==$0

可以发现恢复表TEST2后,该表上的索引已被系统重命名。(不知道有没有在利用闪回表恢复表后,该表上索引名称不改变的方法???)

现在把表TEST2再次drop掉:

DROP  TABLE  TEST2;

然后再次执行仅仅在回收站中彻底删除该索引的语句

PURGE INDEX IDX_TEST2;

还可行吗?

结果为:

SQL> PURGE INDEX IDX_TEST2;

PURGE INDEX IDX_TEST2

*

1 行出现错误:

ORA-38307: 对象不在回收站中

为什么不行了呢?因为在利用闪回表把TEST2恢复时(红色标注的语句),索引IDX_TEST2的名称已经变化为:BIN$BFl7lTEgRz2ZzK+/xTeNCw==$0

现在试一下下面的语句:

PURGE INDEX  BIN$BFl7lTEgRz2ZzK+/xTeNCw==$0;

结果为:

SQL> PURGE INDEX  BIN$BFl7lTEgRz2ZzK+/xTeNCw==$0;

PURGE INDEX  BIN$BFl7lTEgRz2ZzK+/xTeNCw==$0

                                   *

1 行出现错误:

ORA-00933: SQL 命令未正确结束

看来是行不通,我测试到这个程度,深层次的原因目前还不清楚。

有时在更高级别上进行清除可能会有用。例如,可能希望清除表空间

USERS 的回收站中的所有对象。可以执行:   

                               PURGE TABLESPACE USERS;

如果希望只为该表空间中特定用户清空回收站。在数据仓库类型的环境中,用户创建和删除许多临时表,此时这种方法可能会有用。更改上述命令,限定只清除特定的用户:

 PURGE TABLESPACE USERS USER SCOTT;

 

   例如SCOTT 等用户可以使用以下命令来清空自己的回收站:

PURGE RECYCLEBIN;

DBA 可以使用以下命令清除任何表空间中的所有对象:

    PURGE DBA_RECYCLEBIN;

通过以上测试可以发现通过多种不同方法都能管理回收站,以满足特定的需要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值