본문 바로가기

Oracle/admin

2pc_pending 처리

#########################
# 2pc pending 처리 절차 #
#########################

DISTRIBUTED TRANSACTION TROUBLESHOOTING (ORA-1591해결 방법)

STEP 1: alert.log file을 check한다.
STEP 2: network 환경을 확인한다.
STEP 3: RECO process가 떠 있는지 확인한다.
        os> ps -ef | grep reco
STEP 4: DBA_2PC_PENDING을 조회해 본다.

        set linesize 200
        col global_tran_id format a30
        col host format a20
        SQL>select local_tran_id, global_tran_id, state, mixed, host, commit#
        from dba_2pc_pending;
STEP 7: DBA_2PC_PENDING의 MIXED column을 확인한다.
      - MIXED값이 NO인 경우 : STEP 8 수행
      - MIXED값이 YES인 경우: STEP 9 수행

STEP 8: DBA_2PC_PENDING의 STATE column의 값을 확인한다.

CASE 8-1: STATE field ---> COMMITTED인 경우
           SQL>exec dbms_transaction.purge_lost_db_entry('<TRANS_ID>');
           SQL>commit;

CASE 8-2: STATE field ---> PREPARED인 경우  <-- Lock 인상태
           SQL>rollback force '<TRANS_ID>'; 혹은
           SQL>commit force '<TRANS_ID>';

CASE 8-3: STATE field ---> COLLECTING인 경우
           SQL>exec dbms_transaction.purge_lost_db_entry('<TRANS_ID>');
           SQL>commit;

CASE 8-4: STATE field ---> FORCED ROLLBACK/FORCED COMMIT 인 경우
           SQL>exec dbms_transaction.purge_lost_db_entry('<TRANS_ID>');  
           SQL>commit;

STEP 9: 불일치 사항을 파악하고 DBA_2PC_PENDING을 정리한다.
   MIXED가 YES인 상태에서, inconsistency를 받아들이고 DBA_2PC_PENDING view를
   정리하려면 다음과 같이 수행한다.
           SQL>exec dbms_transaction.purge_mixed('1.8.238');
           SQL>commit;