ORA-25402 transaction must roll back 且無法找到SID來處理的問題
ORA-25402 transaction must roll back 且無法找到SID來處理的問題
今天在客戶現場遇到了這個問題,當時自己的電腦不讓連線伺服器,又沒有SYS的密碼,客戶機器上的工具太難用,沒時間處理問題。最後通過重啟伺服器解決的。其實想了下,用errorstack就可以搞定
回來做了下現場模擬
環境是這樣的,一個庫(源庫)通過DB LINK向另外一個資料庫(目標庫)寫入資料,目標庫為RAC(測試的是9版本),源庫(測試的也為9版本)的DBLINK使用了TAF
TAF指向的TNSNAMES連線:
RAC = (DESCRIPTION = (LOAD_BALANCE = ON) (FAILOVER = ON) (ADDRESS = (PROTOCOL = TCP)(HOST = WESTZQ1)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = WESTZQ2)(PORT = 1521)) (CONNECT_DATA = (service_name = rac9i) (failover_mode = (type = select) (method = basic) ) ) ) |
實驗
源庫 |
目標庫 |
SQL> INSERT INTO test_25402@rac VALUES(1);
1 row created. |
|
SQL> SELECT DISTINCT sid FROM v$mystat;
SID ---------- 10
SQL> SELECT spid FROM v$process WHERE addr = (SELECT paddr FROM v$session WHERE sid=10);
SPID ------------ 6617 |
|
|
SQL> SELECT inst_id,sid FROM gv$session WHERE process='6617';
INST_ID SID ---------- ---------- 2 15 DBLINK是連線到例項2的 |
|
關閉例項2 SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. |
SQL> select count(*) from test1;
COUNT(*) ---------- 6248
SQL> select count(*) from test_25402@rac; select count(*) from test_25402@rac * ERROR at line 1: ORA-02055: distributed update operation failed; rollback required ORA-02068: following severe error from RAC ORA-03113: end-of-file on communication channel
SQL> / select count(*) from test_25402@rac * ERROR at line 1: ORA-25402: transaction must roll back |
|
--new session SQL> SELECT * FROM v$lock WHERE sid=10;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST -------- -------- ---------- -- ---------- ---------- ---------- ---------- CTIME BLOCK ---------- ---------- 52FABC40 52FABD4C 10 TX 720934 5 6 0 1003 0
可以看到還有鎖資訊 |
|
|
關閉例項1 SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. |
SQL> rollback; rollback * ERROR at line 1: ORA-02068: following severe error from RAC ORA-03113: end-of-file on communication channel |
|
SQL> SELECT * FROM v$lock WHERE sid=10;
no rows selected |
|
|
--啟動例項1,2 |
SQL> select count(*) from test_25402@rac; select count(*) from test_25402@rac * ERROR at line 1: ORA-25402: transaction must roll back |
|
SQL> select * from v$transaction;
no rows selected |
|
這個時候,事務的SID丟失,如果是BS結構中,某個連線出這個錯誤,無法找到SID來殺死事務來回滾。只能重啟
實驗過errorstack,10046,都不能得到什麼相關的資訊
-------------------------------------------------------------------------------------------
如下解決方法只是反向工程處理的結果,不保證正確性,正確性待驗證
-------------------------------------------------------------------------------------------
檢視了gv$transaction的SQL:
select inst_id,ktcxbxba,kxidusn,kxidslt,kxidsqn,ktcxbkfn,kubablk, kubaseq,kubarec, decode(ktcxbsta,0,'IDLE',1,'COLLECTING',2,'PREPARED',3,'COMMITTED', 4,'HEURISTIC ABORT',5,'HEURISTIC COMMIT', 6,'HEURISTIC DAMAGE',7,'TIMEOUT',9,'INACTIVE', 10,'ACTIVE',11,'PTX PREPARED',12,'PTX COMMITTED', 'UNKNOWN'), ktcxbstm,ktcxbssb,ktcxbssw, ktcxbsen,ktcxbsfl,ktcxbsbk,ktcxbssq,ktcxbsrc, ktcxbses,ktcxbflg, decode(bitand(ktcxbflg,16),0,'NO','YES'), decode(bitand(ktcxbflg,32),0,'NO','YES'), decode(bitand(ktcxbflg,64),0,'NO','YES'), decode(bitand(ktcxbflg,8388608),0,'NO','YES'), ktcxbnam, ktcxbpus,ktcxbpsl,ktcxbpsq, ktcxbpxu,ktcxbpxs,ktcxbpxq, ktcxbdsb, ktcxbdsw, ktcxbubk,ktcxburc,ktcxblio,ktcxbpio,ktcxbcrg,ktcxbcrc from x$ktcxb where bitand(ksspaflg,1)!=0 and bitand(ktcxbflg,2)!=0
發現這個檢視存在一個過濾。去掉BITAND(KTCXBFLG, 2) != 0 ,可以得到幾條資料。
根據前面得到的前面這個事務的ADDR 52FABC40,進行反向工程,得到如下條件
SQL> SELECT addr,xidusn,xidslot,xidsqn FROM my_transaction WHERE ubafil=0 AND ubablk=0 AND ubasqn=0 AND start_time IS NOT NULL;
ADDR XIDUSN XIDSLOT XIDSQN
-------- ---------- ---------- ----------
52FABC40 11 38 5
有了XIDUSN,XIDSLOT,XIDSQN,可以考慮logminer
SELECT timestamp,
session#,
username,
sql_redo
FROM V$LOGMNR_CONTENTS
WHERE xidusn = 11 AND xidslt = 38 AND xidsqn = 5
ORDER BY scn
TIMESTAMP SESSION# USERNAME SQL_REDO
----------------------------------------------------------------
2009-7-25 0:27:53 10 CTAIS2 set transaction read write;
2009-7-25 0:46:33 10 CTAIS2 rollback;
現在就找到了這個SID,可以把這個SESSION給殺掉了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8242091/viewspace-610401/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【問題處理】處理alert警告日誌中出現無法找到libocr*.so檔案問題
- 關於前滾(roll forward)和回滾(roll back)Forward
- ffmpeg無法接收組播流問題處理
- JSF的outputText時,無法處理換行問題JS
- 表空間無法擴充套件問題處理套件
- standby無法使用歸檔日誌問題處理
- 【ASM】ASM啟動無法找到spfile問題原因ASM
- Oracle日常問題處理-資料庫無法啟動Oracle資料庫
- 記一次AR無法拋GL問題處理
- Windows 下處理資料庫無法啟動問題Windows資料庫
- 記一次NM無法拋GL問題處理
- Ubuntu無法解析域名DNS指向127.0.0.53問題處理UbuntuDNS
- 【SQL*Plus】處理 SQL*Plus的標頭無法顯示問題SQL
- 【故障處理】RAC環境第二節點無法歸檔的詭異問題處理
- Mac openssl 未找到 / 載入失敗問題處理Mac
- 關於win平臺下,oracleservice<sid>無法正常啟動的問題Oracle
- 【問題處理】MySQL忘記root密碼的處理辦法MySql密碼
- 解決properties、xml等配置檔案無法找到問題XML
- oracle 10g asm windows 無法找到磁碟 的問題解決Oracle 10gASMWindows
- 客戶端無法同步時間伺服器問題處理客戶端伺服器
- 關於Oracle RAC 叢集日誌無法輪循的問題處理Oracle
- 【問題處理】“sqlplus / as sysdba”無法登陸——多餘的斜槓!SQL
- 應用使用JNDI,資料庫無法連線,導致的程序無法啟動問題處理資料庫
- 無法訪問GitHub網站及無法正常操作倉庫的處理方法Github網站
- 搭建Kubernetes叢集時DNS無法解析問題的處理過程DNS
- 無法找到來自源 MSSQLSERVER 的事件 ID 17052 的描述SQLServer事件
- ora-06508:無法找到正在呼叫的程式單元 錯誤處理
- 【GC】無法找到jar命令導致Download方式安裝Agent失敗的處理GCJAR
- HyperLedger Fabric 1.0的Transaction處理流程
- mysql的root使用者無法給普通使用者授權問題處理MySql
- 一次資料庫無法啟動問題的處理-ORA-00845資料庫
- 處理問題的方法
- xml處理的問題XML
- 處理mysql無法啟動且啟動時服務沒報錯的異常情況MySql
- 【問題處理】使用者無法順利刪除問題處理一則-ORA-00604和ORA-00942錯誤
- 【問題處理】因ASM磁碟組空間不足導致資料庫例項無法啟動的故障處理ASM資料庫
- Oracle資料庫無效物件問題處理Oracle資料庫物件
- 字元顯示亂碼問題處理辦法字元