已知要闪回的大致时间使用基于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. 不能Falshback到5天以前的数据。

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

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

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

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

SQL>grant execute on dbms_flashback to scott;

  

  

上一篇:jquery中奖实例代码


下一篇:Paxos协议笔记