oracle取消drop命令,恢复oracle中误删除drop掉的表和数据

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

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,数据被光复终了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值