sitemap

RSS地图

收藏本站

设为首页

Oracle研究中心

当前位置:Oracle研究中心 > 运维DBA >

【学习笔记】Oracle数据库分布式事务处理思路步骤案例

时间:2016-10-25 21:24   来源:Oracle研究中心   作者:HTZ   点击:

天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库分布式事务故障的一般情况的处理办法,结合MOS官方文档说明进行案例验证。
分布式事务是指一个事务在本地和远程执行,本地需要等待确认远程的事务结束后,进行下一步本地的操作。如通过dblink update远程数据库的一行记录,若在执行过程中网络异常,或其他事件导致本地数据库无法得知远程数据库的执行情况,此时就会发生in doublt的报错。此时需要根据不同情况进行处理。

1、首先检查分布式事务状态


方法如下:
select local_tran_id,state from dba_2pc_pending ;
查询结果为空或者为commited为正常。Collecting和prepared为异常。

2、状态为prepared时


处理流程如下:
rollback force ‘local_tran_id’;
执行成功或者不返回结果都可以
select state,local_tran_id from dba_2pc_pending where state=’prepared’;
检查状态变为forced rollback后可以执行以下命令清除分布式事务的日志
alter session set "_smu_debug_mode" = 4;
execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘local_tran_id ‘);
commit;

3. 状态为collecting


可以观察10分钟,看系统能否自动清理失败的分布式事务,若10分钟后状态仍然是collecting, 可以采取以下操作清理
select state,local_tran_id from dba_2pc_pending ;
rollback force ‘local_tran_id’;
执行失败报错没有这个local_tran_id
执行以下命令清除分布式事务的日志
alter session set "_smu_debug_mode" = 4;
execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘local_tran_id’);
commit;
检查是否有回滚段异常
select segment_name,status from dba_rollback_segs where status not in (‘ONLINE’,’OFFLINE’);
如果存在状态为need recovery的回滚段,需要将切换UNDO表空间到备用UNDO表空间,删除状态异常的回滚段来清理失败的事务。
更多详细的信息见MOS:
Manually Resolving In-Doubt Transactions: Different Scenarios (文档 ID 126069.1)

本文固定链接: http://www.htz.pw/2014/06/19/oracle-%e5%88%86%e5%b8%83%e5%bc%8f%e4%ba%8b%e5%8a%a1%e5%a4%84%e7%90%86%ef%bc%88%e4%b8%80%e8%88%ac%e6%83%85%e5%86%b5%ef%bc%Oracleо89-2.html | 认真就输

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle数据库分布式事务处理思路步骤案例

本文由大师惜分飞原创分享,网址:http://www.oracleplus.net/arch/1066.html

Oracle研究中心

关键词:

Oracle分布式事务一般处理办法

Oracle数据库分布式事务故障的解决办法