首页 > 开发 > 综合 > 正文

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

2024-07-21 02:11:38
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  •  
    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 =<seconds>;来修改参数值

    比较显然的是,你设置了相对大的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误操作的恢复.




     
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表