• 已知要闪回的大致时间使用基于as of scn的闪回查询


    基本判断出要恢复误操作的dml的时间可以使用如下的方法进行数据的恢复:

    example:

      一、创建test表

      -------create table flashback_asof------

      

      create table flashback_of(
        id varchar2(5) primary key,
        name varchar2(20),
        desc1 varchar2(20),
        desc2 varchar2(20)

      );

      二、insert值

      

      ------insert values-----
      insert into flashback_of values('01','name1','desc11','desc21');
      insert into flashback_of values('02','name2','desc12','desc22');
      insert into flashback_of values('03','name3','desc13','desc23');
      insert into flashback_of values('04','name4','desc14','desc24');

      三、获得当前日期下对应的scn值

      1、select to_char(sysdate,'yyyy-mm-dd hh24;mi:ss') time ,to_char(dbms_flashback.get_system_change_number) scn from dual;

      获取当前日期下对应的scn码。

      2、另外可以通过数据字典v$database中的 current_scn获得当前的scn码

      select name,current_scn from v$database;

      注:

      scn是oracle数据库系统提供的标识时间和系统改变码之间的一种映射关系(sys.smon_scn_time)。在10g中,系统平均每3秒产生一次系统时间与SCN的匹配并存入     SYS.SMON_SCN_ TIME表。因此10g版本如果使用AS OF TIMESTAMP查询UNDO中的数据,实际获取的数据是以指定的时间对应的SCN时的数据为基准。

      使用scn查询更加准确,因为scn对应的timestamp是时间的一个区间,scn对应一段区间值,并且在低版本 中timestamp和scn的值是每隔5分钟才真正映射到           smon_scn_time表中的,所以在闪回查询中尽量使用基于scn的闪回查询。

      使用SCN查询会比TIMESTAMP更加精确,事实上,即使执行Flashback Query时指定的是AS OF TIMESTAMP,Oracle也会将其转换成SCN,这是由于Oracle内部都是通   过SCN来标记操作而不是时间。

      select to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') time,scn from smon_scn_time;

      查看时间和scn的对应关系。

      要查询指定范围的时间和scn的的映射关系可以使用函数timestamp_to_scn();或者scn_to_timestamp()函数

      select timestamp_to_scn(sysdate-30/1440) from dual;----查询半小时之前的scn码

      select scn_to_timestamp(80337709) from dual;-----查询指定scn码对应的timestamp

      四、修改数据值(dml误操作)

      update flashback_of set desc1='update1' ,desc2='update1' where id='01';

      commit;

      五、获得dml误操作之前指定的scn的全部数据值

      

        -----------------get before update---------------

       select * from flashback_of as of scn 80336359;

      六、获得误操作之前的记录保存到指定表中待处理

      

      ------------get original values  for dml opertations---------
      create table destination_table
        as select * from flashback_of as of scn 80336359;

      注:

      1、在确定了要闪回的大致时间以后可以使用如下sql确定scn

      select timestamp_to_scn(sysdate-30/1440) from dual;---获取半小时之前的scn码

      select * from tablename as of scn scn_value;------获得指定表在半小时之前的记录快照

      实现根据要闪回的大致时间获得要恢复的数据。

      2、避免直接使用 as of timestamp的方式获得闪回数据(timestamp的方式较scn不是非常的准确)

      最好是根据timestamp获得scn,然后利用scn直接获得目标闪回数据。

      

    推荐使用scn,由于oracle9i中,因为scn与时间点的同步需要5分钟,如果最近5分钟之内的数据需要Falshback query查询,可能会查询丢失,而scn则不存在这个问题。Oracle10g中这个问题已修正(scn与时间点的大致关系,可以通过logmnr分析归档日志获得)。

    Falshback query查询的局限:

    1. 不能Falshback5天以前的数据。

    2. 闪回查询无法恢复到表结构改变之前,因为闪回查询使用的是当前的数据字典。

    3. 受到undo_retention参数的影响,对于undo_retention之前的数据,Flashback不保证能Flashback成功。

    4. drop,truncate等不记录回滚的操作,不能恢复。

    5. 普通用户使用dbms_flashback包,必须通过管理员授权。命令如下:

    SQL>grant execute on dbms_flashback to scott;

      

      

  • 相关阅读:
    AJAX异步交互
    Java 异常讲解(转)
    Spring 配置文件详解 (以2.5为例)
    Java 获取当前系统时间方法比较
    Cannot change version of project facet Dynamic web module to 3.0
    使用 GCC 调试程序
    汇编 内存段划分和寄存器
    java.lang.StringBuilder
    java.lang.String
    建立和断开与MySQL服务器的连接
  • 原文地址:https://www.cnblogs.com/moonfans/p/3969755.html
Copyright © 2020-2023  润新知