Oracle9i 中新增的闪回查询(Flashback Query)功能对于误删除或者误更新并且已经commit 了的情况,提供了简便快捷的恢复方法,而在Oracle 提供闪回查询之前,碰到这种情况只 能通过备份来进行基于时间点的恢复,无疑这比闪回查询要麻烦而且费时。[@more@]
什么是Flashback Query
利用Oracle 多版本读一致的特性,在需要的时候通过undo 来提供所需的前镜像中的数据。 利用这个功能,可以看到历史数据(呵呵,就像时光倒流。月光宝盒?),甚至用历史数据 来修复误操作引起的错误。可以通过指定时间或者SCN 来检索需要的数据。
前提条件
数据库必须处于Automatic Undo Management 状态。
最大可以闪回查询的时间段由UNDO_RETENTION 初始化参数(单位为秒)指定
可以通过ALTER SYSTEM SET UNDO_RETENTION = ;来修改参数值
如何使用Flashback Query
通过SQL
使用SELECT 语句的AS OF 来进行闪回查询,语法如下:
SQL> show parameter undo_retention
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 10800
SQL> show parameter undo_management
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
使用AS OF 关键字来对表,视图,或者物化视图进行Flashback Query,如果指定了SCN,
那么expr 部分必须是一个数字,如果指定了TIMESTAMP,那么expr 必须是一个timestamp 类型的值。查询结果将返回在指定的SCN 或者时间点上的数据。
下面我们使用scott 方案来作一个实验。
[zhangleyi@linux9 bin]$ sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Thu Oct 9 23:44:07 2003
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect scott/tiger
Connected.
SQL> select sal from emp where empno=7369;
SAL
----------
800
SQL> update emp set sal=4000 where empno=7369;
1 row updated.
SQL> commit;
Commit complete.
SQL> select sal from emp where empno=7369;
SAL
----------
4000
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)
备注:TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY)指查询距当前时间一天以
前的时间点的数据,如果我们要查询一小时以前的,那么需要将DAY 替换成HOUR 即可,
查询10 分钟以前的将'1' DAY 替换'10' MINUTE。
以上演示了对于误更新的字段进行恢复的方法,但是如果想在update 的子查询部分使用AS
OF 那么该查询只能返回一条记录,否则将会报错。如下:
SQL> select empno,sal from emp;
EMPNO SAL
---------- ----------
7369 800
7499 1600
7521 1250
7566 2975
7654 1250
7698 2850
7782 2450
7788 3000
SQL> select sal from emp
2 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
3 where empno=7369;
SAL
----------
800
SQL> update emp set sal=
2 (select sal from emp
3 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY)
4 where empno=7369)
5 where empno=7369;
1 row updated.
SQL> select sal from emp where empno=7369;
SAL
----------
800
SQL> commit;
7839 5000
7844 1500
7876 1100
EMPNO SAL
---------- ----------
7900 950
7902 3000
7934 1300
14 rows selected.
SQL> update emp set sal=4000;
14 rows updated.
SQL> commit;
Commit complete.
SQL> select empno,sal from emp;
EMPNO SAL
---------- ----------
7369 4000
7499 4000
7521 4000
7566 4000
7654 4000
7698 4000
7782 4000
7788 4000
7839 4000
7844 4000
7876 4000
EMPNO SAL
---------- ----------
7900 4000
7902 4000
7934 4000
14 rows selected.
=====================================================
Oracle9i的Flashback查询的用途非常多。终端用户或者开发者几乎每天都要恢复那些由于应用失误造成的丢失数据或者被修改的数据。
Oracle宣称你可以用Flashback查询创建具有内嵌的、面向终端用户的、自服务的纠错能力的应用程序,但是很少有Oracle使用者打算去实现自服务纠错或者是要求DBA进行flashback恢复。
你可以使用DBMS_FLASHBACK包去启用或禁用Flashback查询。你还能使用系统改变数(SCN)或者真实时间来指定flashback的时间点。
例如,假设你在上午11:15对数据库作了一个不正确的改变。只要你的Flashback查询处于启用状态,你就能使用下面的命令告诉Oracle应用上午11:00时所有的undo日志映像:
EXECUTE dbms_Flashback.Enable_At_Time('28-AUG-02 11:00:00');
现在所有的查询都将显示上午11:00时的数据,你还可以很容易地恢复丢失的或者被修改的数据。
虽然这是及时回退一个显著的有用特征,但是还是有一些限制的:服务器必须配置成使用自动undo管理。
在使用Flashback查询时不能使用DDL或者DML。
Flashback不取消DDL操作,例如DROP命令。
数据库管理员做一些必要的设置之后,一般用户才能使用Flashback查询功能,下面是所要做的设置:ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO
ALTER SYSTEM SET UNDO_RETENTION=86400
GRANT EXECUTE ON DBMS_FLASHBACK TO USERNAME;
UNDO_RETENTION的参数(单位为秒)指定Oracle保存用于flashback查询的undo映像的时间。一般你可以将这个值设为一整天(864000秒),这样你就能看到前一天全天的映像。当然,你的在线undo日志必须足够大,大到足以能保存一整天的undo日志数据,对于繁忙的Oracle系统,这个数值可以达到很多G字节。