相关命令:
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/