适用范围
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年遗留下来的,于是查看对应时间的告警日志有相关报错。
在数据库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)
查看对应的补丁,确认当前数据库存在该bug:
原因为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)