oracle 10g中的flashback过程以及对long型数据的不支持

今天学习了体验了一下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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值