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