** 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> select systimestamp from dual;
20
21SYSTIMESTAMP
22
23\---------------------------------------------------------------------------
24
2529-12 月 -03 10.15.05.171000 下午 +08:00
26
27下面,进行一个例子:
28
29SQL> connect scott/tiger
30
31已连接。
32
33SQL> create table test (id number(1));
34
35表已创建。
36
37SQL> insert into test values (1);
38
39已创建 1 行。
40
41SQL> insert into test values (2);
42
43已创建 1 行。
44
45SQL> commit;
46
47提交完成。
48
49SQL> select * from test;
50
51ID
52
53\----------
54
551
56
572
58
59SQL> delete from test where id=1;
60
61已删除 1 行。
62
63SQL> commit;
64
65提交完成。
66
67SQL> select * from test;
68
69ID
70
71\----------
72
732
74
75SQL> select * from test as of timestamp (systimestamp -interval'10'second);
76
77ID
78
79\----------
80
811
82
832
84
85SQL> insert into test (select * from test as of timestamp (systimestamp -interva
86
87l'10'second) where id =1);
88
89已创建 1 行。
90
91SQL> commit;
92
93提交完成。
94
95SQL> 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>