HardBirch

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

时间:09-06-10 栏目:iOS移动应用开发技术 作者:张飞不张,文采横飞 评论:1 点击: 1,464 次

有没有因为误删除重要数据而手忙脚乱、不知所措的经历?

Oracle9i Database 推出了闪回查询选项的概念,以便检索过去某个时间点的数据,但它不能闪回 DDL 操作,如删除表的操作。唯一的恢复方法是在另一个数据库中使用表空间的时间点恢复,然后使用导出/导入或其他方法。以上内容我只能说是“据说”,因为并没有用过Oracle9i,没有在其下进行测试。

但是,Oracle Database 10g 中的闪回表特性,可以毫不费力地恢复被意外删除的表。

下面就通过一些简单的测试,了解一下闪回表的惊人之处

--删除数据并提交后恢复数据--

--查看当前模式中的所有表

SELECT * FROM TAB;

 

TNAME                          TABTYPE  CLUSTERID

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

TEST                           TABLE

--将表test删除

DROP TABLE TEST;

--droptest后再次查看当前模式中的所有表

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;

--droptest后再次查看当前模式中的所有表

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被永久删除了,而没有在回收站中出现重新命名的新表。

【误删数据不要慌,Oracle闪回表来帮忙】之一:目前有1 条留言

  1. 沙发
    xudonglee:

    NB

    2009-06-11 14:45 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐