9i新特性之Flashback Query的应用-------------针对DML误操作的恢复
作者:刘颖博
时间:2003-12-29
mail:[email protected],请指正
转载请注明出处及作者
在9i之前,如果出现DML的误操作,只能通过备份来完成基于时间点的恢复,9i给提供了一个新的特性Flashback Query,我们可以应用此特性,可以很方便的实现恢复。但是要注意的是,Flashback Query 仅仅是一个查询的机制,不会真正的UNDO任何数据。
1. 什么是Flashback Query?
利用Oracle 多版本读一致的特性通过undo 来提供所需的前镜像中的数据。通过这个功能,可以看到历史数据,甚至用历史数据来修复误操作引起的错误。可以通过指定时间或者SCN 来检索需要的数据。{Uses Oracle's multiversion read-consistency capabilities to restore data by applying undo as needed. You can view and repair historical data, and you can perform queries on the database as of a certain wall clock time or user-specified system commit number (SCN).}
可以理解成,Oracle在之前的版本中就已经存在了Flashback Query了,之前我们把它称为多版本的读一致性。(多版本特性提供跨多个用户会话的一致性视图,Oracle不执行dirty read)
2. 准备工作
the best way:数据库处于Automatic Undo Management 状态(也有文章说必须,我查找了oracle文档应用了这个词Prerequisite<先决条件>,同时在AskTom上我也查找到相应的解释,指明最好是自动Undo管理,手动的Undo管理也是可以的,并且有例子)
最大可以闪回查询的时间段由UNDO_RETENTION 初始化参数(单位为秒)指定,参看下面执行命令
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 600
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
SQL>
这是一个可以动态的修改的参数,可以通过ALTER SYSTEM SET UNDO_RETENTION =
比较显然的是,你设置了相对大的UNDO_RETENTION,就必须设置足够大的UNDO ROLLBACK SEGMENTS。
3. 如何使用Flashback Query?
我们可以通过两种方式来使用Flashback Query:
用SQL
使用SELECT 语句的AS OF 来进行闪回查询,语法如下:
as of scn ( timestamp) expr
通过关键词 AS OF 可以对表,视图,物化视图 进行Flashback Query,可以制定SCN或者TIMESTAMP,其中TIMESTAMP是9i中出现的,可以有毫秒的时间单位,如
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
29-12月-03 10.15.05.171000 下午 +08:00
下面,进行一个例子:
SQL> connect scott/tiger
已连接。
SQL> create table test (id number(1));
表已创建。
SQL> insert into test values (1);
已创建 1 行。
SQL> insert into test values (2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from test;
ID
----------
1
2
SQL> delete from test where id=1;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from test;
ID
----------
2
SQL> select * from test as of timestamp (systimestamp -interval'10'second);
ID
----------
1
2
SQL> insert into test (select * from test as of timestamp (systimestamp -interva
l'10'second) where id =1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from test;
ID
----------
2
1
现在,利用了Flashback Query 我们恢复了test表中被误删除的记录。当然我们可以通过一些其他的方法,类似于建立一个中间表等,进行这种少量数据的DML误操作的恢复.