首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle DBA_2PC_PENDING 完全指南:分散式交易疑難排解與手動恢復

     編輯:Oracle 資料庫相關知識

什麼是 DBA_2PC_PENDING

記錄**未解決的分散式交易** (Two-Phase Commit, 2PC)。當分散式交易的 COMMIT/ROLLBACK 階段發生網路中斷、節點故障,導致無法完成兩階段提交時,交易資訊會寫入此視圖等待恢復。

自動恢復機制

  • **RECO 背景進程** 定期掃描 DBA_2PC_PENDING
  • 網路恢復/節點重啟後,**自動完成提交或回滾**
  • 大多數情況**無需人工干預**

何時需人工介入

  1. 分散式交易鎖定的物件**急需被存取**
  2. 鎖定的回滾段**阻塞其他交易**
  3. 網路故障/節點恢復**需極長時間**
  4. 自動恢復**反覆失敗** (查看 ALERT LOG)

關鍵視圖

視圖用途
DBA_2PC_PENDING本地待解決分散式交易:LOCAL_TRAN_ID, GLOBAL_TRAN_ID, STATE, MIXED, ADVICE, HOST, COMMIT#
DBA_2PC_NEIGHBORS交易參與節點:LOCAL_TRAN_ID, IN_OUT, DATABASE, DBUSER_OWNER, INTERFACE, DBID, SESS#, BRANCH

手動解決流程

1. 查詢待解決交易


SELECT local_tran_id, global_tran_id, state, mixed, advice, host, commit#
FROM dba_2pc_pending;
  • STATE:collecting (準備階段)、prepared (已準備)、committed、forced commit、forced rollback
  • ADVICE:C (建議提交)、R (建議回滾)、 (無建議)
  • MIXED:YES 表示衝突 (部分提交部分回滾)

2. 查看參與節點


SELECT * FROM dba_2pc_neighbors WHERE local_tran_id = 'xxx.xxx.xxx';

3. 強制提交或回滾


-- 強制提交
EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('local_tran_id');
-- 或
COMMIT FORCE 'local_tran_id';

-- 強制回滾
ROLLBACK FORCE 'local_tran_id';

警告:手動強制**破壞 2PC 一致性保證**,必須確認所有節點狀態一致後再執行。

4. 清理混合狀態交易


-- 當 MIXED=YES (部分節點提交、部分回滾)
EXECUTE DBMS_TRANSACTION.PURGE_MIXED('local_tran_id');

5. 清理失聯節點交易


-- 當參與節點永久失聯 (重建/無法啟動)
EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('local_tran_id');

9i/10g/11g 重要限制

UNDO_MANAGEMENT = MANUAL 才能使用 PURGE 程序 (文件未明載)。AUTO 模式下需:

  1. ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE;
  2. 重啟資料庫
  3. 執行 PURGE
  4. 改回 AUTO、再重啟

**實務上極少使用**,通常等待自動恢復或重啟實例。

分散式交易鎖定影響

  • 鎖定涉及的表/列,**連 SELECT 也可能被阻塞** (無法確定可見版本)
  • 查詢 V$LOCK、V$SESSION_WAIT 確認阻塞鏈

停用/啟用自動恢復


-- 停用 (維護期間防止自動介入)
ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;

-- 啟用 (預設)
ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY;

SCN 同步最佳實踐

分散式查詢前確保 SCN 同步:


-- 方法 1:查詢遠端 DUAL
SELECT * FROM dual@remote_db;

-- 方法 2:提交/回滾當前交易
COMMIT;  -- 或 ROLLBACK

命名交易與建議 (ADVICE)


-- 給交易命名 (便於追蹤)
SET TRANSACTION NAME 'OrderProcess_20231101_001';

-- 交易中宣告建議 (供手動恢復參考)
ALTER SESSION ADVISE COMMIT;   -- 或 ROLLBACK
-- 執行分散式操作
-- COMMIT;

常見錯誤代碼

錯誤含義處理
ORA-02049分散式交易等待鎖逾時檢查阻塞鏈、考慮手動解決
ORA-02050交易已回滾 (遠端節點失敗)查看 ALERT LOG、重試
ORA-02051交易狀態不一致檢查 DBA_2PC_PENDING、手動恢復
ORA-02054交易處於 prepared 狀態等待 RECO 或手動 COMMIT FORCE
ORA-01591鎖定被 in-doubt 分散式交易持有查詢 DBA_2PC_PENDING、強制解決

監控腳本


-- 定期排程檢查
SELECT local_tran_id, global_tran_id, state, mixed, advice, 
       host, commit#, SYSDATE - commit#/86400 AS days_pending
FROM dba_2pc_pending
WHERE state NOT IN ('committed', 'forced commit', 'forced rollback');

-- 結合告警:若 days_pending > 1 天發送通知
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved