現象描述:html
(1).數據庫經過
調用透明網絡實現分佈式事務,但透明網關停用後,失敗的分佈式事務並未清理。
(2).數據庫 alert 日誌
Thu Sep 06 06:53:00 2018
Errors in file /u01/app/oracle/diag/rdbms/zszdb/ZSZDB/trace/ZSZDB_reco_12245.trc:
ORA-01017: invalid username/password; logon denied
[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER' ʧ {28000,NativeErr = 18456}
ORA-02063: preceding 2 lines from MSQL
(3).數據庫 RECO 進程 trc 日誌
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1
System name: Linux
Node name: zszdb
Release: 2.6.27.19-5-default
Version: #1 SMP 2009-02-28 04:40:21 +0100
Machine: x86_64
Instance name: ZSZDB
Redo thread mounted by this instance: 1
Oracle process number: 19
Unix process pid: 12245, image: oracle@zszdb (RECO)
*** 2018-09-06 06:06:59.158
*** SESSION ID:(325.1) 2018-09-06 06:06:59.158
*** CLIENT ID:() 2018-09-06 06:06:59.158
*** SERVICE NAME:(SYS$BACKGROUND) 2018-09-06 06:06:59.158
*** MODULE NAME:() 2018-09-06 06:06:59.158
*** ACTION NAME:() 2018-09-06 06:06:59.158
ERROR, tran=9.13.220456, session#=1, ose=0:
ORA-01017: invalid username/password; logon denied
[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER' ʧ {28000,NativeErr = 18456}
ORA-02063: preceding 2 lines from MSQL
故障緣由:
Or
a
cle 數據庫中,RECO 進程用於自動地解決分佈式事務發生錯誤的狀況。一個節點上的 RECO 進程將會自動鏈接至存在 in-doubt 分佈式事務的數據庫上。當 RECO 進程創建了數據庫鏈接後,它將會自動解決處於 in-dount 狀態的分佈式事務,並將解決後的事務從 pending transation 表中刪除。
(
In a
distributed database
, the
RECO)
automatically resolves failures in
distributed transactions
. The RECO
process of a node automatically connects to other databases involved in an in-doubt distributed transaction. When RECO
reestablishes a connection between the databases, it automatically resolves all in-doubt transactions, removing from each database's pending transaction table any rows that correspond to the resolved transactions.)
故障場景中,數據庫經過調用透明網絡實現分佈式事務,但
透明網關停用後,失敗的分佈式事務並未清理。
例如:分佈式事務於 PREPARE PHASE 階段出現異常。
則在本地端查詢 SQL>
select local_tran_id,state from dba_2pc_pending; 可得相似以下結果:
LOCAL_TRAN_ID STATE
---------------------- ----------------
2.12.64845 collecting
在遠端查詢 SQL>
select local_tran_id,state from dba_2pc_pending; 可得相似以下結果:
no rows selected
即表示本地數據庫要求其餘點作好 commit 或者 rollback 準備,如今正在「收集」其餘點的數據庫的返回信息,可是此時出現了錯誤,遠端數據庫未知狀態(in doubt)。
而 RECO 進程不斷自動處理沒法解決的分佈式事務,所以在數據庫 alert.log 日誌中不斷報錯。
故障處理步驟:
爲防止 RECO 進程不斷自動處理沒法解決的分佈式事務,須要將本地端的全局協調者(Global Coordinator)的 pending transation 清除掉。
依照上述例子的場景,分佈式事務於 PREPARE PHASE 階段出現異常。所以,須要以 SYS 用戶登陸本地端數據庫,執行以下清理命令。
SQL>
execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('
local_tran_id
');
其中,
local_tran_id
爲本地端的事務 ID。
參考文檔:
(1).http://blog.sina.com.cn/s/blog_6cfadffb0100m48t.html