oracle-分布式事务-Oracle Gateway for SQL Server时2PC分布式事务异常处理 ora-01017 ora-02063

简介:

Oracle Gateway for SQL Server时2PC分布式事务异常处理 ora-01017 ora-02063

现象描述:

(1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理。
(2).数据库 alert 日志

    Wed Jun 08 08:40:34 2022
    Errors in file /data01/u01/app/oracle/diag/rdbms/orcls3/orcl/trace/orcl_reco_4243.trc:
    ORA-01017: invalid username/password; logon denied
    [Oracle][ODBC SQL Server Wire Protocol driver][SQL Server]用户 'RECOVER' 登录失败。 {28000,NativeErr = 18456}
    ORA-02063: preceding 2 lines from YDH
    Wed Jun 08 08:41:37 2022
    Errors in file /data01/u01/app/oracle/diag/rdbms/orcls3/orcl/trace/orcl_reco_4243.trc:
    ORA-01017: invalid username/password; logon denied
    [Oracle][ODBC SQL Server Wire Protocol driver][SQL Server]用户 'RECOVER' 登录失败。 {28000,NativeErr = 18456}
    ORA-02063: preceding 2 lines from YDH

(3).数据库 RECO 进程 trc 日志orcl_reco_4243.trc

    Trace file /data01/u01/app/oracle/diag/rdbms/orcls3/orcl/trace/orcl_reco_4243.trc
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    ORACLE_HOME = /data01/u01/app/oracle/product/11.2.0/dbhome_1
    System name:    Linux
    Node name:      host2548
    Release:        3.10.0-1160.49.1.el7.x86_64
    Version:        #1 SMP Tue Nov 9 16:09:48 UTC 2021
    Machine:        x86_64
    Instance name: orcl
    Redo thread mounted by this instance: 1
    Oracle process number: 66
    Unix process pid: 4243, image: oracle@host2548 (RECO)


    *** 2022-06-08 00:17:02.699
    *** SESSION ID:(144.1) 2022-06-08 00:17:02.699
    *** CLIENT ID:() 2022-06-08 00:17:02.699
    *** SERVICE NAME:(SYS$BACKGROUND) 2022-06-08 00:17:02.699
    *** MODULE NAME:() 2022-06-08 00:17:02.699
    *** ACTION NAME:() 2022-06-08 00:17:02.699
     
    ERROR, tran=10.10.367997, session#=1, ose=0:
    ORA-01017: invalid username/password; logon denied
    [Oracle][ODBC SQL Server Wire Protocol driver][SQL Server]用户 'RECOVER' 登录失败。 {28000,NativeErr = 18456}
    ORA-02063: preceding 2 lines from YDHUB8

故障原因:

Oracle 数据库中,RECO 进程用于自动地解决分布式事务发生错误的情况。一个节点上的 RECO 进程将会自动连接至存在 in-doubt 分布式事务的数据库上。当 RECO 进程建立了数据库连接后,它将会自动解决处于 in-dount 状态的分布式事务,并将解决后的事务从 pending transation 表中删除。
(In a distributed database, the RECO) automatically resolves failures in distributed transactions. The RECO process of a node automatically connects to other databases involved in an in-doubt distributed transaction. When RECO reestablishes a connection between the databases, it automatically resolves all in-doubt transactions, removing from each database's pending transaction table any rows that correspond to the resolved transactions.)

故障场景中,数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理。
例如:分布式事务于 PREPARE PHASE 阶段出现异常。

**则在本地端查询 dba_2pc_pending 可得类似如下结果:

set line 1000
col GLOBAL_TRAN_ID for a30
col TRAN_COMMENT for a30
col OS_TERMINAL for a20
col host for a20
col os_user for a20
select * from dba_2pc_pending;

LOCAL_TRAN_ID          GLOBAL_TRAN_ID                 STATE            MIXED ADVICE TRAN_COMMENT                   FAIL_TIME FORCE_TIME RETRY_TIME OS_USER              OS_TERMINAL          HOST                 DB_USER                        COMMIT#         
---------------------- ------------------------------ ---------------- ----- ------ ------------------------------ --------- ---------- ---------- -------------------- -------------------- -------------------- ------------------------------ ----------------
1.30.308101             orcl.1683138c.1.30.308101     collecting        no                                          24-3月-20             08-6月-22   orclService        host2252            WORKGROUP\host2252    WH                         6810389850898   
已选择 1 行。

**在远端查询 可得类似如下结果:

 SQL> select local_tran_id,state from dba_2pc_pending;
no rows selected

即表示本地数据库要求其他点做好 commit 或者 rollback 准备,现在正在"收集"其他点的数据库的返回信息,但是此时出现了错误,远端数据库未知状态(in doubt)。
而 RECO 进程不断自动处理无法解决的分布式事务,因此在数据库 alert.log 日志中不断报错。

故障处理步骤:

为防止 RECO 进程不断自动处理无法解决的分布式事务,需要将本地端的全局协调者(Global Coordinator)的 pending transation 清除掉。
依照上述例子的场景,分布式事务于 PREPARE PHASE 阶段出现异常。因此,需要以 SYS 用户登录本地端数据库,执行如下清理命令。
SQL> execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('local_tran_id'); --其中,local_tran_id 为本地端的事务 ID。

select 'exec dbms_transaction.purge_lost_db_entry('||''''||local_tran_id||''''||');commit;' "Purge"
       from dba_2pc_pending;

Purge                                                                      
---------------------------------------------------------------------------
exec dbms_transaction.purge_lost_db_entry('1.30.308101');commit;           
已选择 1 行。
参考:
How to Setup DG4MSQL to Use Distributed Transactions (Doc ID 227011.1)
If the transaction is not set up correctly the following error encounters:
ORA-02054: transaction x.x.xx in-doubt

In some rare cases where distributed transaction might fail and the logs in the log tables (dba_2pc_pending, sys.pending_trans$ ,sys.pending_sessions$ , sys.pending_sub_sessions$) are not deleted, they must be wiped out manually. To do so, log in as SYS user and do:

select * from dba_2pc_pending;
 
Check out for the LOCAL_TRAN_ID of the transaction you want to get rid of and supply it in the package:

DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('')
 
To remove those pending transactions from the DataDictionary tables, execute this package:

exec dbms_transaction.purge_lost_db_entry('<local_tran_id>');

followed by a commit - for example:

select local_tran_id from dba_2pc_pending;
=> returns for example 2.1.8263

to purge it, login as sysdba and execute:
alter system disable distributed recovery;
commit;
commit force '2.1.8263';
=> might fail, then continue with:

exec dbms_transaction.purge_lost_db_entry('2.1.8263');
commit;
alter system enable distributed recovery;
commit;
目录
相关文章
|
10月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
665 8
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
943 11
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
704 6
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键
1906 6
|
10月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
10月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
877 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)

推荐镜像

更多