【故障处理】分布式事务ORA-01591错误解决

【故障处理】分布式事务ORA-01591错误解决

1  BLOG文档结构图

 

 

 

2  前言部分

2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① 分布式事务的简单概念

        ② ORA-01591错误解决

  Tips:

① 本文在ITpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同步更新

② 文章中用到的所有代码,相关软件,相关资料请前往小麦苗的云盘下载(http://blog.itpub.net/26736162/viewspace-1624453/

③ 若文章代码格式有错乱,推荐使用搜狗、360或QQ浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://blog.itpub.net/26736162/viewspace-1624453/,另外itpub格式显示有问题,可以去博客园地址阅读

④ 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。

  List of Archived Logs in backup set 11

  Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

  ---- ------- ---------- ------------------- ---------- ---------

  1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

  1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

  2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

  2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

 

[ZHLHRDB1:root]:/>lsvg -o

T_XDESK_APP1_vg

rootvg

[ZHLHRDB1:root]:/>

00:27:22 SQL> alter tablespace idxtbs read write;

 

====》2097152*512/1024/1024/1024=1G 

 

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

 

 

3  故障分析及解决过程

 

3.1  故障环境介绍

 


项目


source db


db 类型


RAC


db version


11.2.0.3


db 存储


ASM


OS版本及kernel版本


AIX 64位 6.1.0.0

 

3.2  故障发生现象及报错信息

有同事发来错误:

 

 

执行一个update语句的时候报错ORA-01591的错误。

 

3.3  故障分析及解决过程

这个错误是由于分布式事务引起,而不是普通的锁引起的,检查一般对象数据表锁定,只需要检查v$locked_object和v$transaction视图,就可以定位到具体的SQL语句和操作人等信息,但是检查之后的结果如下:

SYS@oraLHR12>  select * from gv$locked_object;

 

no rows selected

 

SYS@oraLHR12> select * from gv$transaction;

 

no rows selected

两个关键视图中,没有锁定的对象,也没有正在进行没有提交的事务。那是不是没有锁定呢?或者锁已经释放了,我们尝试对数据表加锁:

SYS@oraLHR12> select * from LHR.LHRBOKBAL for update;

select * from LHR.LHRBOKBAL for update

                   *

ERROR at line 1:

ORA-01591: lock held by in-doubt distributed transaction 20.13.14721

 

SYS@oraLHR12> select count(1) from LHR.LHRBOKBAL;

 

  COUNT(1)

----------

  30998411

 

 

系统没有像一般阻塞那样等待,而是报错ORA-01591的错误,并且提示锁被一个分布式事务持有,不能实现加锁操作,那么ORA-01591错误究竟是什么呢?我们使用oerr工具查看该错误编号,看看有没有值得关注的信息。

root@ZFLHRRSP:/# oerr ora 1591

01591, 00000, "lock held by in-doubt distributed transaction %s"

// *Cause:  Trying to access resource that is locked by a dead two-phase commit

//          transaction that is in prepared state.

// *Action: DBA should query the pending_trans$ and related tables, and attempt

//          to repair network connection(s) to coordinator and commit point.

//          If timely repair is not possible, DBA should contact DBA at commit

//          point if known or end user for correct outcome, or use heuristic

//          default if given to issue a heuristic commit or abort command to

//          finalize the local portion of the distributed transaction.

简单的说,01591错误的原因是该对象被一个处在“in-doubt”状态的分布式事务锁定。分布式事务使用的是“two-phase commit”二阶段提交技术。解决该问题的方法就是查看内部表pending_trans$,确定分布式事务信息。这种状态的事务主要是由于在进行分布式事务时候,发生网络突发中断的情况,引起分布式事务无法正常结束,等待中断节点的事务响应。于是,各节点的事务所锁定的表就不会被释放掉。

此时,我们检查视图DBA_2PC_PENDING(或者基表pending_trans$),查看是否存在这种情况。

 

果然,当前存在一个阻塞分布式事务,处在prepared状态。当前问题,主要是源于在进入prepared阶段之后,发生了网络中断的现象,引起commit的阶段不能等待到事务信息。所以,才会一直处在Prepared状态,数据表也就不会进行释放。

对于这个事务,只能通过连接网络或者强制提交回退事务来结束。我们可以使用commit force或者rollback force来进行处理,这里我们进行回滚操作:

SYS@oraLHR12> rollback force '20.13.14721';

 

Rollback complete.

 

SYS@oraLHR12>

Rollback force的参数是DBA_2PC_PENDING中记录本地事务信息的编号即LOCAL_TRAN_ID。

 

此时,再次查看数据。

 

此时,该事务状态已经变化为forced rollback表示已经强制回退,我们再次尝试锁定表操作:

16:25:31 SQL> select CURRENCY from tpcc.TPCCBOKBAL WHERE ROWNUM=1  for update;

CURRENCY

--------

001

Executed in 0.025 seconds

可以看出已经不报错了,可以正常执行。

4  分布式事务相关知识点

分布式事务,简单来说,是指一个事务在本地和远程执行,本地需要等待确认远程的事务结束后,进行下一步本地的操作。如通过dblink update远程数据库的一行记录,如果在执行过程中网络异常,或者其他事件导致本地数据库无法得知远程数据库的执行情况,此时就会发生in doublt的报错。此时需要dba介入,且需要分多种情况进行处理。

Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚。一般情况下,处理过程在很短的时间内完成,根本无法察觉到。

但是,如果在commit或rollback的时候,出现了连接中断或某个数据库 站点CRASH的情况,则提交操作可能会无法继续,此时DBA_2PC_PENDING和DBA_2PC_NEIGHBORS中会包含尚未解决的分布事务。 对于绝大多数情况,当恢复连接或CRASH的数据库重新启动后,会自动解决分布式事务,不需要人工干预。只有分布事务锁住的对象急需被访问,锁住的回滚段阻止了其他事务的使用,网络故障或CRASH的数据库的恢复需要很长的时间等情况出现时,才使用人工操作的方式来维护分布式事务。 手工强制提交或回滚将失去二层提交的特性,Oracle无法继续保证事务的一致性,事务的一致性应由手工操作者保证

使用ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY,可以使Oracle不再自动解决分布事务,即使网络恢复连接或者CRASH的数据库重新启动。

ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY恢复自动解决分布事务。

 

5  两个重要的视图

5.1  DBA_2PC_PENDING

DBA_2PC_PENDING:列出所有的悬而未决的事务﹐此视图在末填入悬而未决的事务之前是空的﹐解决这后也被清空。


列名


说明


LOCAL_TRAN_ID


本地事务标识﹐格式为integer.integer.ingeger。

当一个连接的local_tran_id和global_tran_id相同时﹐那么该节点是该事务的全局协调器。


GLOBAL_TRAN_ID


全局事务标识,格式为﹕global_db_name.db_hex_id.local_tran_id,其中db_hex_id是用来标识数据库八字符的十六进制数﹐公共事各id在分布式事务的每个节点都是相同的。


STATE


下图表进行说明


MIXED


“YES”意味着一部分事务已经在一个节点上提交﹐而在另一个节点上被回滚。


TRAN_COMMENT


事务的注释﹐或者如果使用了事务命名﹐当事各被提交时﹐事务的名字就会出现在此处


Host


主机名


Commit#


已提交的事务的全局提交数

 

DBA_2PC_PENDING的STATE列的说明


列值


说明


Connecting


通常情况下﹐只有全局协调器和本地协调器才使用这个条目﹐节点在能够决定它是否能够准备好之前﹐要收集来自于其它数据库服务的信息。


Prepared


节点已准好﹐可能或者也可能没有将已准备好的消息通知本地协调器﹐但此时﹐该节点还没有接收到提交的请求﹐仍保持着准许备好的状态﹐控制着提交事务所必需的任何本地资源。


Commited


节点(任何类型)已经提交了事务﹐但该事务所包含的其它节点可能并没有提交﹐也就是该事务在一个个或多个其它节点上仍然是悬而未决 。


Forced commit


DBA进行判断后﹐可以强行提交未决的事务﹐如果一个事务由DBA在本地节点进行手动提交时﹐产生此项目


Forced abor(rollback)


DBA进行判断后﹐可以强行回滚未决的事务﹐如果一个事务由DBA在本地节点进行手动回滚时﹐产生此项目

 

SELECT * FROM DBA_2PC_PENDING;

 

 

5.2  DBA_2PC_NEIGHBORS

DBA_2PC_NEIGHBORS:列出所有获得的(从远程客户)和送出的(给远程服务器)悬而未决的事务﹐也表示该本地节点是不是事务的提交点站点。


列名


说明


LOCAL_TRAN_ID


同上


IN_OUT


获得事务为IN﹐送出事务为OUT


Database


对获得事务来说指本地节点信息的客户数据库的名称﹔对送出的事务来说指用于访问远程服务器上信息的数据库链接的名称


DBuser_owner


对获得事务来说指远程数据库链接用于连接的本地账户﹔对于送出事务来说指该数据库链接的拥有者。


INTERFACE


‘C’代表提交信息﹐’N’表示已准备好状态的一条消息或是一条请求只读提交的请求。

当’IN_OUT’为OUT时﹐’C’表示该连接的远程的站点是提交点站点,并且知道是提交还是中断。’N’表示本地节点正在通知远程节点﹐说它已准备好。

当’IN_OUT’为IN时﹐‘C’表示本地节点或送出的远程的一个数据库是提交点站点﹐’N’表示本地节点正在通知远程节点﹐说它已准备好。

 



About Me


...............................................................................................................................

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/viewspace-2122999/

● 本文博客园地址:http://www.cnblogs.com/lhrbest/p/5738544.html

● 本文pdf版及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 联系我请加QQ好友(646634621),注明添加缘由

● 于 2016-08-02 09:00~2016-08-03 19:00 在魔都完成

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

...............................................................................................................................

拿起手机使用微信客户端扫描下边的左边图片来关注小麦苗的微信公众号:xiaomaimiaolhr,扫描右边的二维码加入小麦苗的QQ群,学习最实用的数据库技术。

时间: 2024-11-03 02:47:48

【故障处理】分布式事务ORA-01591错误解决的相关文章

plsql连接oracle数据库报ora 12154错误解决方法_oracle

plsql连接oracle数据库报ora 12154错误 今天遇到一个问题,使用sqlplus能够连接到远程的数据库,但是使用plsql却连接不上,报错"ORA-12154: TNS: 无法解析指定的连接标识符" 解决方法如下: 1.先检查服务器端的监听服务是否打开,如果没有打开请启动其监听 客户端:tnsping <tns_name> 服务器Linux下: #>lsnrctl status 查看监听状态 #>lsnrctl start 启动监听 2.通过Sql

分布式事务、XA、两阶段提交、一阶段提交

1.XA   XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口.XA接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁.XA之所以需要引入事务管理器是因为,在分布式系统中,从理论上讲(参考Fischer等的论文),两台机器理论上无法达到一致的状态,需要引

IIS 运行ASP文件500内部错误解决方法大全_win服务器

1 IIS服务器出现500错误   2错误原因:500错误的原因一般是源程序出现错误造成的. 3 解决办法:1 首先设置IE浏览器à工具->Internet选项   2 刷新或者重新打开500错误页面就会出现错误的程序部分   3 根据错误提示,然后解决问题.     4 ADODB.Connection 创建失败的可能解决方法: 1.重装MDAC2.8. MDAC 2.8下载地址: http://www.microsoft.com/downloads/details.aspx?displayl

win7组件服务COM+应用程序编录错误解决办法

一般情况下,我们遇到过的COM+应用程序编录错误共有两个:(1)第一个是打开COM+应用程序时出现"编录错误,执行最后操作发生错误,错误代码8007042C-依赖服务或组无法启动,事件或日志包含其他错误疑难信息".          解决办法其实很简单,只需将"服务"中的"System Event Notification Service"服务启动即可,它是一个监视系统事件的COM+   事件系统服务,必须确保启动. System Event N

GTS for DRDS分布式事务的实现理解

GTS介绍 全局事务服务(Global Transaction Service,简称 GTS)是一款高性能.高可靠.接入简单的分布式事务中间件,用于解决分布式环境下的数据一致性问题. 一个完整的业务往往需要调用多个子业务或服务,随着业务的不断增多,涉及的服务及数据也越来越多,越来越复杂.传统的系统难以支撑,出现了应用和数据库等的分布式系统.分布式系统又带来了数据一致性的问题,从而产生了分布式事务. 分布式事务是指事务发起者.资源管理器.事务协调者及资源分别位于不同的分布式系统的不同节点之上. G

破解世界性技术难题! GTS让分布式事务简单高效

近日,2017云栖大会·深圳峰会如期举行,多项阿里云新产品对外发布.在企业级互联网架构分会场,来自阿里中间件(Aliware)的技术专家及合作伙伴,为现场参会嘉宾带来最新的传统IT架构到企业级互联网架构跨越式升级.实现互联网转型的产品及解决方案.其中高级技术专家姜宇在分享中带来的Aliware新产品-全局事务服务(Global Transaction Service ,简称GTS),在分布式事务处理上带来的高性能和技术创新令到场参会的各路技术专家眼前一亮. Aliware新成员-全局事务服务GT

c# 分布式事务以及MSDTC

# 分布式事务 以及MSDTC.这里解决的是这个问题: # 分布式事务 以及MSDTC 这里解决的是这个问题: 如果一个请求需要执行多个操作: {     int iGet=MethodA();     if(iGet>0){         MethodB();     } } 现有两个方法: int MethodA(){} bool MethodB(){} 有可能出现A执行成功,但是B不成功,需要回滚,这就需要MSDTC的系统事务,亦为分布式事务. 其主要功能为使代码块成为事务性代码,在Sy

阿里中间件(Aliware)双十一专题——“分布式事务中间件GTS(TXC)”

一. 前言 什么是事务?大家最熟悉的莫过于数据库事务,一大堆SQL操作一个DB,要么同时成功.要么同时失败.(GTS支持ACID,特此公告,不再解释) 什么是分布式事务?一大堆SQL操作N个DB,或者一大堆服务操作1个或多个DB,要么同时成功.要么同时失败. 怎么保证事务?有一个解决办法是"两阶段提交",一阶段大家先把该做的做了但是不提交,二阶段再一起提交或都不提交. 单机事务到分布式事务的变化?在分布式环境下,所有的状态同步都需要走网络,成本变得非常高.因此做好分布式事务容易,难点在

alwaysOn为什么不支持分布式事务

Alwayson是微软从SQL2012开始引入的一种高可用和高性能架构,它既可以实现故障转移,同时又能实现查询分离,是当前SQL server的所有架构中最优秀的一种. 因此,一般我们都会推荐使用AlwaysON来部署生产数据库,不过,尽管AlwaysON的优势非常明显,但并非适应于所有的业务场景. AlwaysON不支持分布式事务和跨数据库事务 什么是分布式事务和跨数据库事务 分布式事务是指通过分布式事务协调器(MSDTC)的统一控制.将事务中的每个操作分解到多台主机上分别执行.每台主机执行成