您的位置:首页 > 数据库 > Oracle

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

2009-06-10 21:51 225 查看
转载请注明:来自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;
未选定行
说明drop表TEST2后该表上的索引也自动删除。
现在执行仅仅在回收站中彻底删除该索引的语句:
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;
通过以上测试可以发现通过多种不同方法都能管理回收站,以满足特定的需要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: