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. Github GUI 托管代码教程

    附录:克隆仓库到本地:git clone https://github.com/chzeze/WeiboHomeCrawl.git

  2. flask 链接 url_for()

    通常html的文件都放在template里面,那么静态的文件放在哪呢?staitc里面 调用 url_for('static', filename='css/styles.css', _externa ...

  3. HIFI播放器--磨机吐槽篇

    最近看到淘宝店提供各种随身播放器磨机服务,说的是天花乱坠,给你更换零件, 甚至更改电路,搭载上去,是如何如何的好,整个播放器就上升了几个等次,收费还 不低,至少是好几百,我实在是忍不住吐槽了,你们这些 ...

  4. iOS 深入理解UINavigationController 和 UIViewController 之间的关系

    创建三个类 BasicViewController : UIViewController SecondViewController : UIViewController ThirdViewContro ...

  5. ubuntu下ssh使用proxy:corkscrew

    1,安装corkscrew: sudo apt-get install corkscrew 2, 配置 vim ~/.ssh/config 写入如下: Host 10.1.*.* ProxyComma ...

  6. FastReport 使用技巧篇

    使用技巧篇 1.FastReport中如果访问报表中的对象?       可以使用FindObject方法.      TfrxMemoView(frxReport1.FindObject('memo ...

  7. Django~学习计划

    20160302 Excel,PDF 处理 GeoDjango学习:GIS编程,百度地图 Javascript 邮件系统 图像处理

  8. oracle触发器设置uuid变量

    create or replace trigger tri_org_department after insert or update on bjlt.sys_org for each row dec ...

  9. September 27th 2016 Week 40th Tuesday

    Friends are lost by calling too often and calling seldom. 交往过密过疏,都会失去朋友. Please mind your own busine ...

  10. September 20th 2016 Week 39th Tuesday

    Failure is not fatal, but failure to change might be. 失败并不致命,但无法改变却可能是致命的. I need change, but it see ...