今天学习了体验了一下oracle10g的flashback功能,发现确实强大。同时使用oracle的trace功能进行了flashback过程的跟踪
SQL>alter table FLASHBACKTEST enable row movement
SQL>alter session set events '10046 trace name context forever,level 12'
SQL>flashback table FLASHBACKTEST to scn 2345676--------此处2345676为scn号
注:在此scn后,对表flashbacktest执行了删除两条记录的操作并提交。现需要闪回。恢复两笔记录
SQL>alter session set events '10046 trace name context off';
SQL>alter table FLASHBACKTEST disable row movement
通过trace文件,发现flashback的主要几个步骤如下:
create global temporary table SYS_TEMP_FBT(schema varchar(32), object_name varchar(32), object# number, rid urowid, action char(1)) on commit preserve rows
INSERT /*+ APPEND */ into SYS_TEMP_FBT SELECT /*+ FBTSCAN FULL(S) PARALLEL(S, DEFAULT) */ :1, :2, :3, rowid, SYS_FBT_INSDEL FROM "HARVEY"."FLASHBACKTEST" as of SCN :4 S
/* Flashback Table */ DELETE /*+ BYPASS_UJVC */ FROM (SELECT /*+ ORDERED USE_NL(S) PARALLEL(S, DEFAULT) PARALLEL(T, DEFAULT) */ S.rowid FROM SYS_TEMP_FBT T, "HARVEY"."FLASHBACKTEST" S WHERE T.rid = S.rowid and T.action = 'D' and T.object# = : 1) V
/* Flashback Table */ INSERT /*+ PARALLEL(S, DEFAULT) PARALLEL(T, DEFAULT) */ INTO "HARVEY"."FLASHBACKTEST" SELECT /*+ USE_NL(S) ORDERED PARALLEL(S, DEFAULT) PARALLEL(T, DEFAULT) */ S.* FROM SYS_TEMP_FBT T , "HARVEY"."FLASHBACKTEST" as of SCN :1 S WHERE T.rid = S.rowid and T.action = 'I' and T.object# = :2
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_0"), NVL(SUM(C2),:"SYS_B_1") FROM (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("T") FULL("T") NO_PARALLEL_INDEX("T") */ :"SYS_B_2" AS C1, CASE WHEN "T"."ACTION"=:"SYS_B_3" THEN :"SYS_B_4" ELSE :"SYS_B_5" END AS C2 FROM "SYS_TEMP_FBT" "T") SAMPLESUB
truncate table SYS_TEMP_FBT
以上trace内容详细含义还待后续深入研究。但是从中可以得到主要步骤如下:
1:第一次启动flashback功能时。会在用户的schema下创建一个全局临时表 sys_temp_ftb
2:把flashback的数据插入到sys_temp_ftb 表中
3:删除原记录的rowid
4:插入旧的内容到需要回滚的表中
5:清空全局临时表SYS_TEMP_FBT
同时根据实验的结果可以确认:
1:flashback操作仅仅回滚被修改的记录。没有被修改过的记录不做任何变更----rowid号没有改变
2:被闪回的记录的rowid会发生变更。
3:如果在表中有long型数据的前提下,是不可以进行回滚的因为flashback使用了 insert into aa select xx from bb
long行数据不支持操作还有:create table Table_a as select xx from Table_b;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/180324/viewspace-660859/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/180324/viewspace-660859/