转载请注明:来自http://blog.csdn.net/M_ChangGong/ 作者:张燕广
有没有因为误删除重要数据而手忙脚乱、不知所措的经历?
Oracle9i Database 推出了闪回查询选项的概念,以便检索过去某个时间点的数据,但它不能闪回 DDL 操作,如删除表的操作。唯一的恢复方法是在另一个数据库中使用表空间的时间点恢复,然后使用导出/导入或其他方法。以上内容我只能说是“据说”,因为并没有用过Oracle9i,没有在其下进行测试。
但是,Oracle Database 10g 中的闪回表特性,可以毫不费力地恢复被意外删除的表。
下面就通过一些简单的测试,了解一下闪回表的惊人之处。
--删除数据并提交后恢复数据--
--查看当前模式中的所有表
SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST TABLE
--将表test删除
DROP TABLE TEST;
--drop掉test后再次查看当前模式中的所有表
SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$3OBHItXyRzah8A5iZe8E8A==$0 TABLE
表 TEST已不存在,但是出现了新表 BIN$3OBHItXyRzah8A5iZe8E8A==$0。被删除的表 TEST并没有完全消失,而是被重命名为一个由系统定义的名称。它与原表存在于同一个表空间中,具有与原始表相同的结构。如果在该表上定义了索引或触发器,则它们也被重命名,使用与该表相同的命名规则。任何相关源(如过程)都将会失效;原始表的触发器和索引都被改为放置在重命名的表BIN$yqtbmilxrxy0fkiefmfvbw==$0上,保持被删除表的完整对象结构。
被删除的表及其相关对象被放置在一个称为“回收站”的逻辑容器中,它类似PC 机中的回收站。但是,对象并没有从它们原先所在的表空间中被真正删除。所以,回收站只是一个列出被删除对象目录的逻辑结构。
执行如下命令:
show recyclebin;
显示回收站被删除对象目录:
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST BIN$3OBHItXyRzah8A5iZe8E8A==$0 TABLE 2009-06-03:14:49:29
--恢复表test
FLASHBACK TABLE TEST TO BEFORE DROP;
--恢复表test后再次查看当前模式中的所有表
SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST TABLE
可以发现drop掉的表恢复成功了。
现在我们测试一下表被删除后在回收站中的被重新命的名字是否总是唯一的:
再次执行
DROP TABLE TEST;
--drop掉test后再次查看当前模式中的所有表
SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$gPwwk/5lTY+Cjds1dFOWBg==$0 TABLE
可以发现BIN$gPwwk/5lTY+Cjds1dFOWBg与上次重新命的名字
BIN$3OBHItXyRzah8A5iZe8E8A==$0并不相同。
如果希望完全删除该表而不需要使用闪回特性,可以使用以下命令:
DROP TABLE TABLENAME PURGE;
再创建一张测试表
CREATE TABLE TEST2 AS SELECT * FROM TEST;
--创建表test2后再次查看当前模式中的所有表
SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST TABLE
TEST2 TABLE
执行永久删除表TEST2的命令:
DROP TABLE TEST2 PURGE;
--永久删除表TEST2后再次查看当前模式中的所有表
SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST TABLE
可以发现表TEST2被永久删除了,而没有在回收站中出现重新命名的新表。