基本判断出要恢复误操作的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;