0
点赞
收藏
分享

微信扫一扫

ORA-24756 分布式事务异常问题处理

适用范围

oracle 分布式事务,oracle 11.2.0.4

问题概述

某客户数据库告警日志出现错误信息如下:

ORA-24756: transaction does not exist

Mon Aug 14 12:30:45 2017             <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Issue started
opiodr aborting process unknown ospid (178868) as a result of ORA-24756
Mon Aug 14 12:30:46 2017
Errors in file /u01/app/oracle/diag/rdbms/abc_exa3/abc1/trace/abc1_pmon_154974.trc:
ORA-24756: transaction does not exist
Errors in file /u01/app/oracle/diag/rdbms/abc_exa3/abc1/trace/abc1_pmon_154974.trc:
ORA-24756: transaction does not exist
Errors in file /u01/app/oracle/diag/rdbms/abc_exa3/abc1/trace/abc1_pmon_154974.trc:
ORA-24756: transaction does not exist

环境信息

Hosname1上数据库服务名:orcl1 版本:oracle 11.2.0.4

Hosname2上数据库服务名:orcl2 版本:oracle 11.2.0.4

问题分析
分布式事务产生是由于orcl1上的的dblink访问远程数据库orcl2
查询分布式事务相关视图
在数据库orcl1 查询:

select * from dba_2pc_pending;
select * from DBA_2PC_NEIGHBORS;

可以看出有问题的子事务500.10.49441,是对应告警日志最近报错的事务,另外

还有其他三个有问题的事务是2019年遗留下来的,于是查看对应时间的告警日志有相关报错。

ORA-24756 分布式事务异常问题处理_ORA-24756

ORA-24756 分布式事务异常问题处理_分布式事务_02


ORA-24756 分布式事务异常问题处理_分布式事务_03


在数据库orcl1上查询,没有全局事务存在:

select utl_raw.cast_to_varchar2(globalid),utl_raw.cast_to_varchar2(branchid),a.*
  from v$global_transaction a
 where utl_raw.cast_to_varchar2(globalid) in
       (select global_tran_id from dba_2pc_pending);

在数据库orcl1上查询,没有查到对应的活跃事务以及子事务:

select a.addr,a.ses_addr,a.xidusn,a.xidslot,a.xidsqn,a.xid,a.start_date from v$transaction a where  a.xidusn||a.xidslot||a.xidsqn='82751646';
select a.addr,a.ses_addr,a.xidusn,a.xidslot,a.xidsqn,a.xid,a.start_date from v$transaction a where  a.xidusn||a.xidslot||a.xidsqn='5001049441';

都没有查到记录

问题原因

在mos上查询找到报错相似的文档:

Bug 24406027 - RECO may raise ORA-24756 repeatedly (Doc ID 24406027.8)

ORA-24756 分布式事务异常问题处理_分布式事务_04


ORA-24756 分布式事务异常问题处理_分布式事务_05


查看对应的补丁,确认当前数据库存在该bug:

ORA-24756 分布式事务异常问题处理_分布式事务_06


原因为Oracle的BUG,根本解决办法是需打补丁解决,大量使用DBLink,若其中一个断开连接或故障,reco将循环报ora-24756的错误。确认事务为收集状态,并且已经查询不到当前活跃事务状态,对数据没有造成影响,手工处理问题,使用Dbms_Transaction包清理有问题事务,alert日志不再出现ora-24756的报错。

解决方案

清理有问题的分布式事务,由于全局事务已经不存在,并且子事务处于收集状态,不会造成脏数据,直接清理:

execute Dbms_Transaction.purge_lost_db_entry('420.23.35666');
execute Dbms_Transaction.purge_lost_db_entry('387.5.34998');
execute Dbms_Transaction.purge_lost_db_entry('398.33.40801');
execute Dbms_Transaction.purge_lost_db_entry('500.10.49441');

参考文档

Primary Note for Troubleshooting Oracle Managed Distributed Transactions (Doc ID 100664.1)
Manually Resolving In-Doubt Transactions: Different Scenarios (Doc ID 126069.1)
Bug 24406027 - RECO may raise ORA-24756 repeatedly (Doc ID 24406027.8)

举报

相关推荐

0 条评论