9i新特性之Flashback Query的应用-------------针对DML误操作的恢复(1)

** 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 =

  1<seconds>;  来修改参数值 
  2
  3比较显然的是,你设置了相对大的  UNDO_RETENTION,就必须设置足够大的UNDO ROLLBACK SEGMENTS。 
  4
  5** 3\.  ** ** 如何使用  Flashback Query  ** ** ?  ** ** **
  6
  7我们可以通过两种方式来使用  Flashback Query: 
  8
  9** 用  SQL  **
 10
 11使用  SELECT  语句的  AS OF  来进行闪回查询,语法如下: 
 12
 13** as of  scn ( timestamp) expr  **
 14
 15** **
 16
 17通过关键词  AS OF  可以对表,视图,物化视图  进行  Flashback Query  ,可以制定  SCN  或者  TIMESTAMP  ,其中  TIMESTAMP  是  9i  中出现的,可以有毫秒的时间单位,如 
 18
 19SQL&gt; select systimestamp from dual; 
 20
 21SYSTIMESTAMP 
 22
 23\--------------------------------------------------------------------------- 
 24
 2529-12  月  -03 10.15.05.171000  下午  +08:00 
 26
 27下面,进行一个例子: 
 28
 29SQL&gt; connect scott/tiger 
 30
 31已连接。 
 32
 33SQL&gt; create table test (id number(1)); 
 34
 35表已创建。 
 36
 37SQL&gt; insert into test values (1); 
 38
 39已创建  1  行。 
 40
 41SQL&gt; insert into test values (2); 
 42
 43已创建  1  行。 
 44
 45SQL&gt; commit; 
 46
 47提交完成。 
 48
 49SQL&gt; select * from test; 
 50
 51ID 
 52
 53\---------- 
 54
 551 
 56
 572 
 58
 59SQL&gt; delete from test where id=1; 
 60
 61已删除  1  行。 
 62
 63SQL&gt; commit; 
 64
 65提交完成。 
 66
 67SQL&gt; select * from test; 
 68
 69ID 
 70
 71\---------- 
 72
 732 
 74
 75SQL&gt; select * from test as of timestamp (systimestamp -interval'10'second); 
 76
 77ID 
 78
 79\---------- 
 80
 811 
 82
 832 
 84
 85SQL&gt; insert into test (select * from test as of timestamp (systimestamp -interva 
 86
 87l'10'second) where id =1); 
 88
 89已创建  1  行。 
 90
 91SQL&gt; commit; 
 92
 93提交完成。 
 94
 95SQL&gt; select * from test; 
 96
 97ID 
 98
 99\---------- 
100
1012 
102
1031 
104
105现在,利用了  Flashback Query  我们恢复了  test  表中被误删除的记录。当然我们可以通过一些其他的方法,类似于建立一个中间表等,进行这种少量数据的  DML  误操作的恢复. 
106
107  
108  
109  
110
111
112** **</seconds>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus