首页 > 其他分享 >ORA-02062分布式事务挂起

ORA-02062分布式事务挂起

时间:2023-10-22 10:31:46浏览次数:37  
标签:CRMCENDB1 02062 SMS EC commit DBLNK ORA out 分布式

问题概述

在某套数据库升级迁移后,系统内的其他数据库收到了一些错误:

Fri Nov 25 08:00:47 2022
Errors in file /oracle/app/oracle/diag/rdbms/resdb/resdb2/trace/resdb2_reco_3277084.trc:
ORA-02062: distributed recovery received DBID ee3f1032, expected 8b98b2bc
ORA-02062: distributed recovery received DBID 36acbe83, expected a76256d8
ORA-02062: distributed recovery received DBID dd1695c4, expected b9e5f818

问题原因

数据库的reco进程,是一个与分布式事务有关的进程,结合伴随的报错信息,怀疑是数据库的分布式事务出现了异常。

Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚,当commit或rollback的时候,出现了连接中断,或数据库崩溃的情况,就无法继续执行,出现所谓的不确定性分布式事务(in-doubt distributed transaction),事务挂起的情况。

该数据库并未在升级迁移范围内,唯一的变动是对其中的一些数据库链接进行了重建(指向升级迁移系统的数据库链接);Oracle分布式事务中的关键组件就是数据库链接(database link),这很有可能导致了分布式事务连接的中断;至此,先检查重建数据库链接的可用性,发现重建的数据库链接并无异常。

SQL> select sysdate from dual@DBLNK_CRMCENDB1;

SYSDATE
---------
25-NOV-22

检查数据库内是否有挂起的分布式事务,可以看到,确实存在一些挂起的分布式事务;通过DBA_2PC_NEIGHBORS视图可以看到,这些挂起的分布式确实是与我们重建的database link相关。

state描述

  • collecting:在收集数据过程中,产生异常
  • prepared: 在接受到异步commit/rollback指令前, 产生异常
  • forced rollback: 在使用rollback force出现
  • forced commit:在使用commit force出现
SQL> select local_tran_id,state from dba_2pc_pending;

LOCAL_TRAN_ID          STATE
---------------------- ----------------
122.22.3695788         collecting
217.26.3191060         collecting
321.30.2497885         collecting
404.32.1018036         collecting
473.21.1523563         collecting
818.19.1110703         collecting
850.26.1009115         collecting

7 rows selected.


SQL> SELECT LOCAL_TRAN_ID,IN_OUT,DATABASE,INTERFACE,DBUSER_OWNER FROM DBA_2PC_NEIGHBORS;

LOCAL_TRAN_ID        IN_ DATABASE             INTERFACE            DBUSER_OWNER
-------------------- --- -------------------- -------------------- ---------------
404.32.1018036       in                       N                    EC_SMS
122.22.3695788       in                       N                    EC_SMS
321.30.2497885       in                       N                    EC_SMS
850.26.1009115       in                       N                    EC_SMS
473.21.1523563       in                       N                    EC_SMS
217.26.3191060       in                       N                    EC_SMS
818.19.1110703       in                       N                    EC_SMS
404.32.1018036       out DBLNK_CRMCENDB1      N                    EC_SMS
404.32.1018036       out DBLNK_CRMCENDB1      N                    EC_SMS
122.22.3695788       out DBLNK_CRMCENDB1      N                    EC_SMS
122.22.3695788       out DBLNK_CRMCENDB1      N                    EC_SMS

LOCAL_TRAN_ID        IN_ DATABASE             INTERFACE            DBUSER_OWNER
-------------------- --- -------------------- -------------------- ---------------
321.30.2497885       out DBLNK_CRMCENDB1      N                    EC_SMS
321.30.2497885       out DBLNK_CRMCENDB1      N                    EC_SMS
850.26.1009115       out DBLNK_CRMCENDB1      N                    EC_SMS
850.26.1009115       out DBLNK_CRMCENDB1      N                    EC_SMS
473.21.1523563       out DBLNK_CRMCENDB1      N                    EC_SMS
473.21.1523563       out DBLNK_CRMCENDB1      N                    EC_SMS
217.26.3191060       out DBLNK_CRMCENDB1      N                    EC_SMS
217.26.3191060       out DBLNK_CRMCENDB1      N                    EC_SMS
818.19.1110703       out DBLNK_CRMCENDB1      N                    EC_SMS

20 rows selected.

解决方案

清理挂起的事务,该过程用于清除本地数据库所记载的远程事务入口,如下:

   EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(' ');

SQL> select ' exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('||chr(39)||LOCAL_TRAN_ID||chr(39)||');'||chr(10)||'commit;' from dba_2pc_pending;

'EXECDBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('||CHR(39)||LOCAL_TRAN_ID||CHR(39)|
-----------------------------------------------------------------------------
 exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('122.22.3695788');
commit;

 exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('217.26.3191060');
commit;

 exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('321.30.2497885');
commit;

 exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('404.32.1018036');
commit;

 exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('473.21.1523563');
commit;

 exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('818.19.1110703');
commit;

 exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('850.26.1009115');
commit;


7 rows selected.

再次检查分布式事务挂起情况和alert日志,均再无相关内容。

SQL> select local_tran_id,state from dba_2pc_pending;

no rows selected
SQL> 
SQL> 
SQL> 
SQL> SELECT LOCAL_TRAN_ID,IN_OUT,DATABASE,INTERFACE,DBUSER_OWNER FROM DBA_2PC_NEIGHBORS;

no rows selected

标签:CRMCENDB1,02062,SMS,EC,commit,DBLNK,ORA,out,分布式
From: https://blog.51cto.com/u_13482808/7974500

相关文章

  • oracle使用dblink连接postgresql
    环境:oracle    数据库:192.168.22.201端口号6666操作系统:RHEL7.6postgresql数据库:192.168.22.20  端口号5432操作系统:RHEL7.6pg数据库配置1、修改pg_hba.conf文件hostalllanmc192.168.22.201/24md52、重新加载服务systemctlreloadpostgresql-15.serviceo......
  • oracle使用dblink连接mysql
    在oracle数据库访问mysql数据库数据环境Oracle 数据库:192.168.22.6端口1521操作系统:RHEL7.6MYSQL数据库:192.168.22.9端口3306操作系统:RHEL7.6 用户:lanmc,密码:lanmc123,数据库lanmcORACLE数据库配置1、oracle服务端安装mysqlodbcmysqlodbc下载地址:https://dev.mysql......
  • Oracle数据编纂(脱敏)
    OracleDatabase-EnterpriseEdition-Version12.1.0.2andlater1.问题描述客户需求:Oracle数据库里面能不能实现这么一个功能,让符合条件的用户可以看到表里面的所有数据,而另外一些人(比如权限低的用户)虽然能查询表,但是对某些敏感数据全部用星号加密了。效果如下图所示:=>2.问题......
  • Oracle获取执行计划的七种方法以及使用场景
    一.explainplanforselect*fromt1,t2 wheret1.id=t2.id andt1.idin(5,6);select*fromtable(dbms_xplan.display());优点无需真正执行,快捷方便缺点1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次物理读,多少次递归调用等);2.无法判断是处理了多少行;3.无法判断表被......
  • oracle怎样分批查询
    在Oracle中,分批查询通常是通过使用"分页"的方式来实现的。可以使用ROWNUM伪列、OFFSET关键字和FETCHFIRST关键字来完成分页查询。具体地,可以使用如下的SQL语句进行分页查询:SELECT*FROM(SELECTA.*,ROWNUMRNFROM(SELECT*FROMyour_tableWH......
  • Oracle数据库中文显示乱码
    问题sql脚本导入到Oracle数据库,中文数据显示乱码。原因本地环境没有配置数据库编码格式,需要跟服务器上数据库编码格式统一。解决方法1.查询数据库编码格式,使用Selectuserenv('language')fromdual语句查询数据库编码格式。2.在**系统环境变量**配置:N......
  • [swin-trans]分布式训练的debug:ValueError: Error initializing torch.distributed us
    在用torch.distributed.init_process_group(backend='nccl',init_method='env://',world_size=world_size,rank=rank)时,出现1、ValueError:Errorinitializingtorch.distributedusingenv://rendezvous:environmentvariableMASTER_ADDRexpected,b......
  • K8S使用开源CEPH作为后端StorageClass
    1引言K8S在1.13版本开始支持使用Ceph作为StorageClass。其中云原生存储Rook和开源Ceph应用都非常广泛。本文主要介绍K8S如何对接开源Ceph使用RBD卷。K8S对接Ceph的技术栈如下图所示。K8S主要通过容器存储接口CSI和Ceph进行交互。https://docs.ceph.com/en/reef/rbd/rbd-kuber......
  • typeorm oracle 表大小写问题
    oracle对于表名的定义包含了是否包含双引号的问题,但是默认typeorm创建的是包含了双引号的,造成数据查询会有问题(typeorm自身没有问题,但是外部查询会有问题)解决方法自定义命名策略参考 classOracleNameStrategyextendstypeorm.DefaultNamingStrategy{......
  • Oracle 查询排名第几到第几行的数据(rownumber效率最高)
    查询排名第5到第10行的数据  实现效率最高,如果是在前端页面用循环选择,效率是很慢的。ROWNUM是Oracle加在查询数据集的伪字段,记录的是每一行的行号。--第三步查询需要的几行数据SELECTA.NAME,A.FW_TIMESTAMPFROM(--第二步加排序编号ROWNUMSELECTA.NAME,A.FW_TIMES......