今天一個朋友遇到的問題,警示日誌中出現如下資訊:
ORA-1591:lockheldbyin-doubtdistributedtransaction1.92.66874
查詢dba_2pc的表,發現沒有分散式交易資訊:
selectlocal_tran_id,statefromdba_2pc_pending where local_tran_id='1.92.66874';
no rowsselected
但是去查實際的rollback segment資訊,卻發現有prepared狀態的分散式交易存在:
SELECTKTUXEUSN,KTUXESLT,KTUXESQN,/* Transaction ID */
KTUXESTA Status,KTUXECFL FlagsFROM x$ktuxeWHERE ktuxesta!='INACTIVE'AND ktuxeusn=1;
KTUXEUSN KTUXESLT KTUXESQN STATUS FLAGS
---------- ---------- ---------- ---------------- ------------------------
1 92 66874 PREPARED SCO|COL|REV|DEAD
我們無法做commit force或者rollback force:
rollbackforce'1.92.66874';
ORA-02058:no preparedtransactionfoundwithID1.92.66874
遇到這種情況,只能製造虛假資料,再類比清理未提交的分散式交易;
alter system disable distributed recovery;
INSERT INTO PENDING_TRANS$
(LOCAL_TRAN_ID,
GLOBAL_TRAN_FMT,
GLOBAL_Oracle_ID,
STATE,
STATUS,
SESSION_VECTOR,
RECO_VECTOR,
TYPE#,
FAIL_TIME,
RECO_TIME)
VALUES
('1.92.66874', /* <== 此處為你的local tran id */
306206, /* */
'XXXXXXX.12345.1.2.3', /* 這些值不必更改, */
'prepared',
'P', /* 是靜態參數,可以直接 */
HEXTORAW('00000001'), /* 在這個sql中使用 */
HEXTORAW('00000000'), /* */
0,
SYSDATE,
SYSDATE);
INSERT INTO PENDING_SESSIONS$
VALUES
('1.92.66874', /* <==此處為你的local tran id */
1,
HEXTORAW('05004F003A1500000104'),
'C',
0,
30258592,
'',
146);
commit;