[原创]Tuxedo系统xa_start()=-9实例及成因分析_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 8244 | 回复: 0   主题: [原创]Tuxedo系统xa_start()=-9实例及成因分析        下一篇 
funny
注册用户
等级:中校
经验:1529
发帖:111
精华:4
注册:2013-3-13
状态:离线
发送短消息息给funny 加好友    发送短消息息给funny 发消息
发表于: IP:您无权察看 2014-2-20 10:40:47 | [全部帖] [楼主帖] 楼主

1.概述

XXX工程师反映在28号的升级后YYY功能不稳定,失败率较高,下面对这一问题进行分析,帮助定位问题。

2.问题分析

2.1.日志分析
   生产tuxedo日志内容:

2012-12-30 11:00:04.933 DEBUG [gboss.scom.mwci.CTuxCaller] 22533 CTuxCaller.cpp:1169 sSrvName:ITF_CRM_CANCELFEE
2012-12-30 11:00:04.934 DEBUG [gboss.scom.mwci.CTuxCaller] 22533 CTuxCaller.cpp:1173 (char *)sSvcName.c_str():TAM_CBS1_L2SVC
2012-12-30 11:00:04.952 INFO [eboss.crm.acctmanm] 22213 bills.size():4,acctId:101101271102245,startCycleId:201212,endCycleId:201212


2012-12-30 11:00:04.952 TRACE [gboss.crm.trade.ITF_CRM_PRECEIVEFEE_PRINT] 22203 lcuplugins.cpp:229 [LCU]动态库运行结束

2012-12-30 11:00:04.953 TRACE [gboss.crm.trade.ITF_CCHT_CANCELFEE_HLJ] 22533 lcuplugins.cpp:648 [LCU]执行跨服务调用Tuxedo异常.[INDETERMINATE]CTuxCaller.cpp:1181,13CTuxException-10: [detail:[10][TPESVCERR - server error while handling request]]

2012-12-30 11:00:04.953 TRACE [gboss.crm.trade.ITF_CCHT_CANCELFEE_HLJ] 22533 lcuplugins.cpp:668 [LCU]TuxedoCaller运行结束.
   上述标红的日志信息显示调用错误的代码为TPESVCERR - server error while handling request,服务端无法接受该请求。下面分析Tuxedo日志。
   Tuxedo日志分析:

084349.nbjk3!tamcbs1l2server.26529.1.0: LIBTUX_CAT:1397: WARN: tpreturn transaction processing failure
084920.nbjk3!TMS_ORA.10542.1.0: gtrid x0 x50ddb141 x5ac8: CMDTUX_CAT:7027: ERROR: tms_timeout xa_rollback returned XAER_RMERR for group GRPAMCBS1
111331.nbjk3!tamcbs1l2server.26529.1.0: gtrid x0 x50ddb141 x6a9b: LIBTUX_CAT:481: ERROR: Service xa_start returned -9
111331.nbjk3!tamcbs1l2server.26529.1.0: gtrid x0 x50ddb141 x6a9f: LIBTUX_CAT:481: ERROR: Service xa_start returned -9
111439.nbjk3!tamcbs1l2server.26529.1.0: gtrid x0 x50ddb141 x6ae1: LIBTUX_CAT:481: ERROR: Service xa_start returned -9
125418.nbjk3!BBL.6883.1.0: gtrid x0 x50ddb141 x4f8b: LIBTUX_CAT:4055: ERROR: No service 'TMS' in group 'GRPITFUIF'
125418.nbjk3!BBL.6883.1.0: gtrid x0 x50ddb141 x4f64: LIBTUX_CAT:4055: ERROR: No service 'TMS' in group 'GRPITFUIF'
144846.nbjk3!TMS_ORA.7871.1.0: CMDTUX_CAT:7027: ERROR: tms_timeout xa_rollback returned -7 for group GRPCSCRM1


上述标红的错误是由tamcbs1l2server报告,而亚联工程师反映将tamcbs1l2server重启后,可以成功完成几笔交易,后面的交易请求失败率较高。下面分析以上错误信息。
2.2.分析xa_start失败原因
   Service xa_start returned -9错误代码介绍:

#define XAER_OUTSIDE -9 /* resource manager doing work outside global transaction *


该错误代码是在资源管理器(RM)在全局交易外工作。
   出现这种错误有以下两中原因:
   1、在开始全局交易前已经有一个本地交易,而且本地交易并未提交或回滚,导致建议全局交易失败。
   例如:
   Select,delete··········这里进行了数据库的增添改查之类的操作,这些操作会使Tuxedo自动建立一个本地交易,知道这个Server处理完成或在代码中显示的提交或者回滚,该交易才会完成。
   Tpbegin()·············这里开始了一个全局交易,由于上边的代码已经建立了一个本地连接,而tuxedo全局事务会对应一个本地连接的事务,这种情况下就会造成tuxedo又想自动启动一个本地事务,相当于一个单线程程序里面同时启动两个事务.这是不可能出现的,同时只能有一个事务。
   2、在全局交易超时。如下:

---------->tpbegin() ·······开始全局事务
---------->sql 1 (<---timeout) ···在SQL1处超时,该交易已经超时
---------->sql 2 ·····sql2 会执行失败
---------->sql 3 ········sql3 会导致tuxedo自动生成一个本地交易,这时就会报错误。
--------->tpcommit()/tpabort()交易失败。 


   可根据一下步骤来查找本地交易的进程或者SQL,该操作需要管理员权限:
检查长时间存在的本地交易。

select xidusn, start_time, ses_addr from v$transaction


找到最早的开始时间
select sid, program, sql_address from v$session where saddr='%ses_addr%';,这里的%ses_addr% 上面SQL查出的%ses_addr%。
找到本地交易的SQL,select sql_text from v$sqltext where address='%sql_address%';这里的%sql_address%为上一条语句查出的%sql_address%。

3.建议

1、查看最近是否有缴费返销所有调用tamcbs1l2server的代码是否有做修改。
   2、将代码所有进行数据库修改的操作进行提交后再开始全局交易,尤其是调用tamcbs1l2server前的代码。
   3、查看tpcall代码,tpcall或者tpforward的flags参数值(最后一个参数),是否有TPNOTRAN。
   4、也可以将tamcbs1l2server调用时的service修改交易参数,以下参数在ubb 的SERVICES字段处修改。
   将AUTOTRAN=Y,并且TRAMTIME=$交易超时参数,该参数修改后应进行多次测试,保证系统运行稳定后在投入生产。
   5、修改ubb配置文件,查看当天日志,是由于哪个tamcbs1l2server报Service xa_start returned -9错误,格式如下:

140200.nbjk3!tamcbs1l2server.8018.1.0: gtrid x0 x50dfc8e6 x8859: LIBTUX_CAT:481: ERROR: Service xa_start returned -9


8018为报错的server的pid,ps –ef | grep 8018 后输出为:

 tamcbs1l2server -C dom=ubss -g 660 -i 5122 -u nbjk3 -U /ngbss/tuxapp/log/ulog -m 0 -A -p 1,30:2,30 -- -T,在配置文件ubb中查找SRVID为660的组,将数据连接的OPENINFO的字符串加上nolocal=t,未修改是的字符串为:
OPENINFO="Oracle_XA:Oracle_XA+acc=P/uop_act1/mfhtgg_3+SqlNet=zwdb_i1+SesTm=120+LogDir=../log"


修改后的字符串为:

OPENINFO="Oracle_XA:Oracle_XA+acc=P/uop_act1/mfhtgg_3+SqlNet=zwdb_i1+SesTm=120+nolocal=t+LogDir=../log"


对于该参数Oracle官方的解释为:、

The nolocal=t option should not cause any performance impact.
The xaerror = -9 (XAER_OUTSIDE) error happens when a server that should be allowing Tuxedo to manage global transactions performs database operations outside of a global transaction.
When nolocal=t is set, we will get an ORA-155 error for the one service call where the application code is performing database operations outside of a global transaction, and subsequent service calls will work fine.  If nolocal is NOT set, then a situation where the application code performs database operations outside of a global transaction will cause all subsequent service calls to fail with the "xa_start flags 0 returned -9" error, and the server will need to be rebooted.
Thus, it is much less risky to use nolocal=t and setting this option is recommended.
Additionally, "nolocal=t" is an Oracle Database parameter that can be added to xa_open string to disable local transactions. Tuxedo will just pass the string(nolocal=t) to Oracle DB via xa_open().


对这个参数的添加并不会影响系统性能,而且是推荐添加的参数,建议添加该参数后对系统进行观察,是否会出现该错误。

该贴被funny编辑于2014-2-20 10:46:10

该贴被funny编辑于2014-2-21 10:30:52



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论