ITPub博客

首页 > 数据库 > Oracle > 恢复oracle中误删除drop掉的表和数据

恢复oracle中误删除drop掉的表和数据

Oracle 作者:chinaphp 时间:2013-12-08 13:50:49 0 删除 编辑

--————————————光复误删的数据

alter table tbl_2_process enable row  movement;
flashback table tbl_2_process to timestamp to_timestamp("2013-05-07 15:30:00","yyyy-mm-dd hh24:mi:ss");

--————————————光复误删的表

审查回支站中表

select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin;

光复表

SQL>flashback table test_drop to before drop;或
SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop;

注:必须9i或10g以上版本支持,flashback没法光复全文索引

以下为参考资料

 哄骗 Oracle Database 10g 中的闪回表特征,可以尽不辛劳地光复被不测删除的表

  以下是一个不该产生却经常产生的状况:用户删除了一个非常首要的表 ― 固然是不测地删除 ― 并需要尽快地光复。(在某些时分,阿谁不幸的用户可能就是 DBA!)

  Oracle9i Database 推出了闪回查询选项的概念,以便检索夙昔某个工夫点的数据,但它不克不及闪回 DDL 操纵,如删除表的操纵。独一的光复圆法是在另外一个数据库中哄骗表空间的工夫点光复,然后哄骗导出/导进或其他圆法,在当前数据库中从头创立表。那一过程需要 DBA 进行年夜量工作而且破费珍贵的工夫,更不消道借要哄骗另外一个数据库进行克隆。

  请哄骗 Oracle Database 10g 中的闪回表特征,它使得被删除表的光复过程如同执行几条语句一样简单。让我们去看该特征是若何工作的。

  删除阿谁表!

  首先,让我们审查当前模式中的表。

  SQL> select * from tab;

  TNAME

  TABTYPE

  CLUSTERID

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

  RECYCLETEST

  TABLE

  目前,我们不测地删除了该表:

  SQL> drop table recycletest;

  Table dropped.

  目前让我们去审查该表的形态。

  SQL> select * from tab;

  TNAME

  TABTYPE

  CLUSTERID

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

  BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE

  表 RECYCLETEST 已不存在,但是请注意出现新表 BIN$04LhcpndanfgMAAAAAANPw==$0。那就是所产生的工作:被删除的表 RECYCLETEST 并没有完全磨灭,而是重命名为一个由系统界道的名称。它存在于统一个表空间中,具有取原始表相同的布局。若是在该表上界道了索引或触收器,则它们也被重命名,哄欺骗表相同的命名划定规矩。任何相关源(如过程)都失效;原始表的触收器和索引被改成放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被删除表的完整尽对对象布局。

  表及其相关对象被放置在一个称为"回支站"的逻辑容器中,它相似于您 PC 机中的回支站。但是,对象并没有从它们本来所在的表空间中删除;它们仍然占用那边的空间。回支站只是一个列出被删除对象目录的逻辑布局。在 SQL*Plus 提示符处哄骗以下命令去审查其内容(您需要哄骗 SQL*Plus 10.1 去进行此操纵):

  SQL> show recyclebin

  ORIGINAL NAME

  RECYCLEBIN NAME

  OBJECT TYPE

  DROP TIME

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

  RECYCLETEST

  BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE

  2004-02-16:21:13:31

  功效隐示了表的原始名称 RECYCLETEST,并隐示了回支站中的新名称,该名称取我们看到的删除后所创立的新表名称相同。(注意:切实的名称可能因平台差别而差别。)为光复该表,您所需要做的就是哄骗 FLASHBACK TABLE 命令:

  SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;

  FLASHBACK COMPLETE.

  SQL> SELECT * FROM TAB;

  TNAME

  TABTYPE

  CLUSTERID

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

  RECYCLETEST

  TABLE

  瞧!表尽不辛劳地光复了。若是目前审查回支站,它将是空的。

  记取,将表放在回支站里其实不在原始表空间中开释空间。要开释空间,您需要哄骗以下命令清空回支站:

  PURGE RECYCLEBIN;

  但是若是您期看完全删除该表而不需要哄骗闪回特征,该如何办?在那种状况下,可以哄骗以下命令永久删除该表:

  DROP TABLE RECYCLETEST PURGE;

  此命令不会将表重命名为回支站中的名称,而是永久删除该表,就象 10g 之前的版本一样。

  治理回支站

  若是在该过程中没有真际删除表 ― 因此没有开释表空间 ― 那么当被删除的对象占用了一切空间时,会产生什么事?

  答案很简单:那种状况根基不会出现。当表空间被回支站数据完全占满,导致于必须扩展数据文件去包容更多半据时,可以道表空间处于"空间压力"状况下。此时,对象以进步前辈先出的体式格式从回支站中主动覆灭。在删除表之前,相关对象(如索引)被删除。

  一样,空间压力可能由特定表空间界道的用户限额而激发。表空间可能有足够的空余空间,但用户可能将其在该表空间中所分派的局部用完了。在那种状况下,Oracle 主动覆灭该表空间中属于该用户的对象。

  另外,有几种圆法可以手动掌握回支站。若是在删除名为 TEST 的特定表今后需要从回支站中覆灭它,可以执行

  PURGE TABLE TEST;

  大要哄骗其回支站中的名称:

  PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";

  此命令将从回支站中删除表 TEST 及一切相关对象,如索引、束厄局促等,从而节省了空间。但是,若是要从回支站中永久删除索引,则可以哄骗以下命令去完成工作:

  purge index in_test1_01;

  此命令将仅仅删除索引,而将表的拷贝留在回支站中。

  偶尔在更高级别上进行覆灭可能会有用。例如,您可能期看覆灭表空间 USERS 的回支站中的一切对象。可以执行:

  PURGE TABLESPACE USERS;

  您也许期看只为该表空间中特定用户清空回支站。在数据仓库类型的环境中,用户创立和删除很多临时表,此时那种圆法可能会有用。您可以更改上述命令,限制只覆灭特定的用户:

  PURGE TABLESPACE USERS USER SCOTT;

  诸如 SCOTT 等用户可以哄骗以下命令去清空本身的回支站

  PURGE RECYCLEBIN;

  DBA 可以哄骗以下命令覆灭任何表空间中的一切对象

  PURGE DBA_RECYCLEBIN;

  可以看到,可以颠末多种差别圆法去治理回支站,以写意特定的需要。

  表版本和闪回功能

  用户可能会经常多次创立和删除统一个表,如:

  CREATE TABLE TEST (COL1 NUMBER);

  INSERT INTO TEST VALUES (1);

  commit;

  DROP TABLE TEST;

  CREATE TABLE TEST (COL1 NUMBER);

  INSERT INTO TEST VALUES (2);

  commit;

  DROP TABLE TEST;

  CREATE TABLE TEST (COL1 NUMBER);

  INSERT INTO TEST VALUES (3);

  commit;

  DROP TABLE TEST;

  此时,若是您要对表 TEST 执行闪回操纵,那么列 COL1 的值应当是什么?常规念法可能以为从回支站取回表的第一个版本,列 COL1 的值是 1。真际上,取回的是表的第三个版本,而不是第一个。是以列 COL1 的值为 3,而不是 1。

  此时您借可以取回被删除表的其他版本。但是,表 TEST 的存在不应允出现那种状况。您有两种选择:

  哄骗重命名选项:

  FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2;

  FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1;

  那些语句将表的第一个版本光复到 TEST1,将第二个版本光复到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值将划分是 1 和 2。大要,

  哄骗表的特定回支站名称进行光复。为此,首先要识别表的回支站名称,然后执行:

  FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST2;

  FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST1;

  那些语句将光复被删除表的两个版本。

  正告......

  撤除删除特征使表光复其原始名称,但是索引和触收器等相关对象并没有恢复兴始名称,它们仍然哄骗回支站的名称。在表上界道的源(如视图和过程)没有从头编译,仍然保持无效形态。必须手动获得那些原著名称并哄骗到闪回表。

  信息保存在名为 USER_RECYCLEBIN 的视图中。在对表进行闪回操纵前,请哄骗以下查询去检索原著名称。

  SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE

  FROM USER_RECYCLEBIN

  WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBIN

  WHERE ORIGINAL_NAME = "RECYCLETEST")

  AND ORIGINAL_NAME != "RECYCLETEST";

  OBJECT_NAME

  ORIGINAL_N TYPE

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

  BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01

  INDEX

  BIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT

  TRIGGER

  在表进行闪回操纵后,表 RECYCLETEST 上的索引和触收器将遵循 OBJECT_NAME 列中所示进行命名。按照以上查询,可以哄骗原始名称从头命名对象,以下所示:

  ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;

  ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;

  一个值得注意的破例状况是位图索引。当删除位图索引时,它们其实不放置在回支站中 ― 是以没法检索它们。束厄局促名称也没法从视图中检索。必须从其他前导收端对它们进行重命名。
闪回表的其他用处

  闪回删除表功能不仅限于光复表的删除操纵。取闪回查询相似,您借可以哄骗它将表光复到差别的工夫点,形如flashback table tmm2076 TO TIMESTAMP to_timestamp("2007-05-22
12:00:00","yyyy-mm-dd hh24:mi:ss")
弹出ORA-08189错误,需要执行以下命令先:
alter table tmm2076 enable row movement阿谁命令的感化是,应允oracle建正分派给行的rowid。

然后再flashback,数据被光复终了。


<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7845721/viewspace-1115913/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论