ORA-24756处理

看到警告日誌一直報ORA-24756錯誤

Errors in file /oracle/admin/NHMIX01/bdump/nhmix01_reco_4959.trc:
ORA-24756: transaction does not exist
但是去找trace文件的時候卻沒有

想到了事務的問題,查dba_2pc_pending

select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
6.22.290635 commited

通过该视图我去到远端的数据库查询该是视图

select local_tran_id,state from dba_2pc_pending;
no rows selected.

我嘗試

commit force '6.22.290635'  卻發現被hang住了,其实此时不需要commit force了,此时是分布式事务的第三个阶段即forget phase发生错误,需要做的是在本地清除分布式事务信息。

exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635');

再kill了那个commit force动作。再去查询dba_2pc_pending的时候就找不到这个事务了。

分佈式事務总结

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

分布式事务在commit提交时候,会经历3个阶段:
1.PREPARE PHASE:
   1.1 决定哪个数据库为commit point site。(注,参数文件中commit_point_strength值[默认值为1]高的那个数据库为commit point site)         
   1.2 全局协调者(Global Coordinator)要求所有的点(除commit point site外)做好commit或者rollback的准备。此时,对分布式事务的表加锁。
   1.3 所有分布式事务的节点将它的scn告知全局协调者。
   1.4 全局协调者取各个点的最大的scn作为分布式事务的scn。(eygle在这篇文章中也测试过)
至此,所有的点都完成了准备工作,我们开始进入COMMIT PHASE阶段,此时除commit point site点外所有点的事务均为in doubt状态,直到COMMIT PHASE阶段结束。

如果数据库在此阶段出现问题,我们查询(假设远程数据库为commit point site,且本地数据库为Global Coordinator):

Scenario 1 collecting:

select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
6.22.290635 collecting

remote DB

select local_tran_id,state from dba_2pc_pending;
no rows selected.

即表示本地数据库要求做好commit或者rollback准备,现在正在收集其他点的数据库返回信息,但是远程数据库状态未知(in doubt),我们需要手动的将本地的Global Coordinator信息清除掉:

SQL> exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635');

PL/SQL procedure successfully completed.

Scenario2:prepared

select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
6.22.290635 prepared

remote DB

select local_tran_id,state from dba_2pc_pending;
no rows selected.

即表示本地Global Coordinator已做好准备,已将分布式锁放到各个事务表上,但远程数据库的状态再次未知(in doubt),我们需要手动的将本地的transaction rollback掉,并且清除分布式事务信息:

rollback force '6.22.290635';

exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635');

2.COMMIT PHASE:
    2.1 Global Coordinator将最大scn传到commit point site,要求其commit。
    2.2 commit point尝试commit或者rollback。分布式事务锁释放。
    2.3 commit point通知Global Coordinator已经commit。
    2.4 Global Coordinator通知分布式事务的所有点进行commit。

Scenario 1 local prepared ,remote commited

local:
select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
6.22.290635 prepared

 

remote DB:
select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
1.92.66874 commited

即表示远程数据库可能已经commit,但是本地数据库未知远程数据库的状态,还是处于prepared状态。我们需要如下处理:

local:
commit force '6.22.290635';

exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635');

remote DB:

exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.92.66874');

Scenario2  local commited,remote commited

local:
select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
6.22.290635 commited
remote DB:
select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
1.92.66874 commited

即表示本地和远程数据库均完成commit,但未清除分布式事务信息,我们需要如下处理:

local:

exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635');

remote DB:

exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.92.66874');

3.FORGET PHASE:
   3.1 参与的点通知commit point site他们已经完成commit,commit point site就能忘记(forget)这个事务。
   3.2 commit point site在远程数据库上清除分布式事务信息。
   3.3 commit point site通知Global Coordinator可以清除本地的分布式事务信息。
   3.4 Global Coordinator清除分布式事务信息。

local:

select local_tran_id,state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
6.22.290635 commited

remote DB

select local_tran_id,state from dba_2pc_pending;
no rows selected.

即表示远端已完成commit,通知Global Coordinator清除分布式事务信息,但是本地没有收到该信息,我们改如下处理:

local

exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635');

总结分佈式事務的狀態依次如下:

phase local_state remote_state action
prepare collecting
prepared
/
/
本地DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY
本地rollback force后PURGE_LOST_DB_ENTRY
commit prepared
commited
commited
commited
本地commit force后本地和遠程均PURGE
本地和遠程均PURGE_LOST_DB_ENTRY
forget commited / 本地PURGE_LOST_DB_ENTRY

 

本文转载自http://www.oracleblog.org/working-case/how-to-deal-with-distributed-transaction/的博客

分佈式事務故障處理暨ORA-24756: transaction does not exist處理的更多相关文章

  1. WCF分佈式事務支持

    WCF分佈式事務對Binding有要求,不支持BasicHttpBinding,BasicHttpContextBinding,NetPeerTcpBinding 要支持分佈式事務,需要進行以下配置: ...

  2. spring boot sharding-jdbc实现分佈式读写分离和分库分表的实现

    分布式读写分离和分库分表采用sharding-jdbc实现. sharding-jdbc是当当网推出的一款读写分离实现插件,其他的还有mycat,或者纯粹的Aop代码控制实现. 接下面用spring ...

  3. 比較C struct 與 C# unsafe struct内存分佈

    昨晚在群裏無意間看到一個朋友有一個需求.他是在C裏面將兩個結構體(HeadStruct,BodyStruct)的内存數據直接通過socket send發給C#寫的服務端來處理.當然他之前所使用的需求基 ...

  4. [心得] SQL Server Partition(表分區) 資料分佈探討

    最近在群裡有個朋友問了個問題是這樣的 用户表有一千多万行,主键是用户ID,我做了分区.但经常查询时,其它的表根据用户ID来关联,这样跨区查询,reads非常高.有什么好的处理办法?不分区的话,索引维护 ...

  5. mysql分库分表那些事

    为什么使用分库分表? 如下内容,引用自 Sharding Sphere 的文档,写的很大气. <ShardingSphere > 概念 & 功能 > 数据分片> 传统的 ...

  6. C# 數據事務操作

    public sealed class SQLFunc  { #region Methods #region OpenConnection /// <summary>指定包含連接字串的字串 ...

  7. 【转】redis实现的分布式锁

    参考: 1. https://www.bbsmax.com/A/WpdKpM1zVQ/ 2.https://www.oschina.net/translate/redis-distlock

  8. spring事務

    spring事物 spring事物其实就是对数据库事物的一种支持,没有数据库事物的话,spring本身是不能提供事物支持的: 在最开始使用原始的jdbc连接数据库进行炒操作是, 获取连接后可以使用co ...

  9. VMware虛擬化技術實作問答

    http://www.netadmin.com.tw/article_content.aspx?sn=1202130002&ns=1203280001&jump=3 Q4:啟用VMwa ...

随机推荐

  1. Python文件操作题

    1.如何用Python删除一个文件 os.remove(filename)或者os.unlink(filename). 2.Python如何copy一个文件 shutil模块里有一个copyfile函 ...

  2. linux 命令free -m 命令结果分析

    free -m 命令详解 free -m 分析系统内存使用情况:

  3. python egg文件解压

    unzip 就可以了. 由于项目需要将某些版本的库打包,然后 sys.path.insert方式引用(避免升级包导致某些旧的系统崩掉). 在将egg文件打包时,发现不可用.但相关模块的__path__ ...

  4. phpcms更换域名用户无法注册问题

    问题背景: 用户注册必须在后台开启phpsso,这个sso也就是单点登录了,之前做的站都没有带用户登录,也一直没注意,今天线下localhost用户登录注册都没有问题,可是移到线上测试却怎么都无法注册 ...

  5. javascript特殊运算符

    in运算符                 in运算符要求其左边的运算数是一个字符串,或可以被转换为字符串,右边的运算数十一个对象或数组.如果该 运算符左边的值是右边对象的一个属性名,则返回true, ...

  6. [k]web页面-browser兼容问题-1

    1:空的a标签在IE7/8下不能点击(2015-05-22) html代码: <ul class='oUl'><li><a href="#"> ...

  7. Metronic 与 VS2013/2015 合作开发

    Metronic 与 VS2013/2015 合作开发  去年购买了一个:METRONIC  (http://www.keenthemes.com/) ,最近下了最新的版本:V3.7 ,解压缩后,目录 ...

  8. 3.saltstack的grains和pillar学习笔记

    作者:刘耀 QQ:22102107 SaltStack_Grains Grains grains是minion第一次启动的时候采集的静态数据,可以用在salt的模块和其他组件中.其实grains在每次 ...

  9. vs2010调试程序出现“Cannot find or open the PDB file”

    项目中源程序编写好以后, (一个简单的小程序) #include int main(void) { int age; int day; age = 24; printf("tom is %d ...

  10. 把图标改成web字体

    一.下载自己想要的矢量图标,然后在AI中打开二.在AI中将有瑕疵的图标修改一下,再分别另存为svg格式的图标三.打开IcoMoon Web app网页,然后点击左上角的+Import Icons添加你 ...