ORACLE11G-闪回事务处理取消

ORACLE10G 中使用闪回版本查询和闪回事务处理查询 来实现恢复错误的数据变化。
相关命令:
SELECT versions_startscn,
       versions_starttime,
       versions_endscn,
       versions_endtime,
       versions_xid,
       versions_operation,
       name,
       num
  FROM flash_test
       VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP ('2015-11-20 14:25:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP ('2015-11-20 14:31:00', 'YYYY-MM-DD HH24:MI:SS')
where VERSIONS_OPERATION is not null;

SELECT start_scn,
       commit_scn,
       logon_user,
       operation,
       table_name,
       undo_sql  --然后执行undo_sql
  FROM flashback_transaction_query
 WHERE xid = '040006000A210000'
 and logon_user='ADMIN';

ORACLE 11G 使用心得闪回事务处理取消特性完成必须由闪回版本查询和闪回事务处理查询共同完成的任务。
- 先决条件,要开启补充日志
alter database add supplemental log data;
alter database add supplemental log data (primary key) columns;
还要给使用闪回特性的用户授予以下权限:
grant execute on dbms_flashback to hr;
grant select any transaction to hr;

- 使用TRANSACTION_BACKOUT过程

在继续讨论此功能前,首先应了解一个概念:事务的依赖性。比如,两个事务TX1和TX2,若符合以下3个条件的任意一个就可以认为TX2依赖TX1:

(1)WAW依赖(Write After Write),即在TX1修改了表的某行之后,TX2又修改了同一行。

(2)主键依赖,即在一张拥有主键的表中TX1首先删除了一行,之后TX2又插入了具有相同主键值的另一行。

(3)外建依赖,即由于TX1的修改(insert或update)而产生了新的可被外键参考的字段值,之后TX2修改(insert或update)外键字段时利用了TX1所产生的字段值。

了解事务依赖性有助于解决在撤销事务时遇到的矛盾,以主键依赖为例,试想若直接将事务TX1撤销并且不理会事务TX2,岂不是会出现主键值重复的行!

TRANSACTION_BACKOUT存储过程的OPTIONS参数就是为了解决事务依赖性问题而存在的,在该参数上管理员可以使用4种撤销事务的方案,假设被撤销的事务是TX1,若其具有依赖事务,则称为TX2:

(1)NOCASCADE,TX1不可以被任何其他事务依赖(即TX2不存在),否则撤销操作报错。

(2)CASCADE,将TX1连同TX2一起撤销。

(3)NOCASCADE_FORCE,忽略TX2,直接执行TX1的撤销SQL将TX1撤销,如果没有约束上的冲突,操作将成功,否则约束报错导致撤销操作失败。

(4)NONCONFILICT_ONLY,在不影响TX2的前提下,撤销TX1的修改。与NOCASCADE_FORCE的不同点在于会首先过滤一下TX1的撤销SQL,确保它们不会作用在TX2修改的行上。


使用DBMS_FLASHBACK.BACKOUT_TRANSACTION的步骤如下:

(1)将需要撤销的事务的事务号或事务名载入对应的VARRAY集合变量。

(2)以NOCASCADE方式调用BACKOUT_TRANSACTION。如果报错,再从另外3种方式中选择一个调用BACKOUT_TRANSACTION。

(3)查看闪回事务操作的报告。

(4)最后决定提交或回滚。

示例:
create table flash_test2 (empno varchar2(20),salary number);
insert into flash_test2 values('1',10000);
insert into flash_test2 values('2',13000);
insert into flash_test2 values('3',8000);
insert into flash_test2 values('4',5000);
commit;

transaction T1
update flash_test2 set salary=salary*3;
transaction T2
update flash_test2 set salary=salary*1.1 where empno='1';

上面的例子 由于T1的错误操作,导致T2的操作也得到了错误的结果。因此我们需要将T1和T2一起撤销。
查询事务号
select distinct xid,commit_scn
    from flashback_transaction_query
    where table_owner='ADMIN' and
    table_name='FLASH_TEST2' and
    commit_timestamp > systimestamp - interval '15' minute
    order by commit_scn;

由于T1 T2 存在WAW 依赖关系 因此options 选择 cascade
declare
     xids sys.xid_array;
    begin
     xids := sys.xid_array('05001200412C0000');
     dbms_flashback.transaction_backout(1,xids,options=>dbms_flashback.cascade);
    end;
    /
commit;

回退完毕。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15412087/viewspace-1842162/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15412087/viewspace-1842162/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值