IBM Support

[Db2] 未確定トランザクション (indoubt transaction) の回復方法

Question & Answer


Question

トランザクションログ・フルが発生しましたが、db2diag.log ではアプリケーション・ハンドルが不明です。対応方法を教えてください。
MESSAGE : ADM1823E The active log is full and is held by application handle "".         
Terminate this application by COMMIT, ROLLBACK or FORCE APPLICATION.

Cause

未確定トランザクション (indoubt transaction) があると、現在存在しないアプリケーションが原因でロック・タイムアウトやログ・フルが発生する可能性があります。
SQL0911N デッドロックまたはタイムアウトのため、現在のトランザクションがロールバックされました。理由コード"68"。SQLSTATE=40001
SQL0964C データベースのトランザクション・ログがいっぱいです。 SQLSTATE=57011
未確定トランザクションは、 未確定状態のままになっているグローバル・トランザクションです。 これは、2 フェーズ・コミット・プロトコルの第 1 フェーズ (つまり PREPARE フェーズ) が正常終了した後、トランザクション・マネージャー (TM)、 または少なくとも 1 つのリソース・マネージャー (RM) のいずれかが使用できなくなった場合に発生します。
RM のログが再度使用可能になって、TM が RM からの未確定状況情報に関するログを統合できるようになるまで、RM はトランザクション・ブランチに対して コミットとロールバックのどちらを実行すればよいのかを識別できません。

Answer

未確定トランザクションに関する情報は、現在接続されているデータベースに対して LIST INDOUBT TRANSACTIONS コマンドを実行して確認します。
$ db2 list indoubt transactions

 1.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930013422                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 10:34:57 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000AF0D

 2.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930021847                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 11:18:46 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000B05A

 3.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930014048                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 10:41:36 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000AFA1

 4.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930014752                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 10:48:30 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000B03E

 5.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930080254                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 17:02:54 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000C60B

未確定トランザクションを処理するには、LIST INDOUBT TRANSACTIONS コマンドを WITH PROMPTING オプションを指定して実行します。
対話式ダイアログ・モードが開始され、 未確定トランザクションのコミット、ロールバック、または破棄が可能になります。
$  db2 list indoubt transactions with prompting

 1.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930013422                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 10:34:57 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000AF0D

 2.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930021847
      sequence_no: 0001 status: i
      timestamp: 2011-09-30 11:18:46 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000B05A

 3.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930014048                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 10:41:36 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000AFA1

 4.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930014752                                    
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 10:48:30 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000B03E

 5.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930080254                                      
   sequence_no: 0001 status: i
      timestamp: 2011-09-30 17:02:54 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000C60B

c/r/f/l/q:

対話式ダイアログ・モードでは次のことが可能です。
  • すべての未確定トランザクションのリスト表示 (l を入力)
  • 未確定トランザクション番号 x のリスト表示 (l の後に有効なトランザクション番号を入力)
  • 終了 (q を入力)
  • トランザクション番号 x をコミット (c の後に有効なトランザクション番号を入力)
  • トランザクション番号 x をロールバック (r の後に有効なトランザクション番号を入力)
  • トランザクション番号 x を破棄 (f の後に有効なトランザクション番号を入力)

コマンド文字と引数の間は、ブランク・スペースで区切る必要があります。
今回のケースは"c/r/f/l/q:"ですが、未確定トランザクションの状態によっては"c/r/l/q:"の場合もあります。


未確定トランザクションを処理するには、2段階の操作により確定します。

1) トランザクションの確定 (トランザクションの状況に応じて r/c のいずれか) でリソースを解放します。
未確定トランザクションをロールバックする --- r 番号
未確定トランザクションをコミットする --- c 番号

上記出力例では status: i (未確定) ですので、コミットもしくはロールバックを実行できます。
'c 1' はトランザクション 1 をヒューリスティックにコミットします。
c/r/f/l/q: c 1

 1.   originator: DB2 Enterprise Server Edition
      appl_id: *N0.db2inst1.110930013422
      sequence_no: 0001 status: i
      timestamp: 2011-09-30 10:34:57 auth_id: DB2INST1
      log_full: n type: RM
      xid: 00001D3400000008 0000000000000000 0000AF0D

この未確定トランザクションをヒューリスティックに COMMIT しますか? (y/n) y
トランザクションのコミット、ロールバック、または破棄を実行する前にトランザクション・データが表示され、アクションを確認するように求められますので、 y を入力します。
このようにしてトランザクションをコミットまたはロールバックしてください。

2) 以下の状況では、コミットあるいはロールバックではなく破棄 (f) する必要があります。
コミット済みまたはロールバック済みのトランザクションを未確定トランザクションの一覧から破棄 (FORGET) する --- f 番号
  • ヒューリスティックな手法でコミットまたはロールバックされたトランザクションが原因で、 ログ満杯状態が発生した場合 (LIST INDOUBT TRANSACTIONS コマンドからの出力に示される)
  • オフライン・バックアップが行われる場合


運用上の考慮点
  • パーティション・データベースの場合、各パーティションに接続してから list indoubt transactions コマンドを実行する必要があります。
    例:SAMPLE データベースのデータベース・パーティション 3 の未確定トランザクションを表示
    export DB2NODE=3
    db2 terminate
    db2 connect to SAMPLE
    db2 list indoubt transactions
  • クラッシュ・リカバリー中に未確定トランザクションの存在を検出した場合、db2diag.log に以下のようなエントリが記録されます。
    2011-11-30-16.25.25.062152+540 I857382A463        LEVEL: Warning
    PID     : 835832               TID  : 3086        PROC : db2sysc 2
    INSTANCE: db2inst1             NODE : 002         DB   : SAMPLE
    APPHDL  : 1-51                 APPID: 
    AUTHID  : 
    EDUID   : 3086                 EDUNAME: db2agntp (SAMPLE) 2
    FUNCTION: DB2 UDB, recovery manager, sqlpresr, probe:3280
    MESSAGE : In-doubt transaction(s) exists at the end of crash recovery.
  • トランザクションのコミット、ロールバック、または破棄を実行する前に、 トランザクション・データが表示され、アクションを確認するように求められます。
  • コミットできるのは、状況が未確定 (i)、またはコミット肯定応答欠落 (m)、またはフェデレーテッド・コミット肯定応答欠落 (d) のトランザクションだけです。
  • ロールバックできるのは、状況が未確定 (i)、フェデレーテッド・ロールバック肯定応答欠落 (b)、または終了済み (e) のトランザクションだけです。
  • 破棄ができるのは、状況がコミット済み (c)、ロールバック (r)、フェデレーテッド・コミット肯定応答欠落 (d)、またはフェデレーテッド・ロールバック肯定応答欠落 (b) のトランザクションだけです。
  • 未確定トランザクションが "SQL0998N トランザクションまたはヒューリスティック処理中に、エラーが発生しました。 理由コード = 36。" で失敗する場合は、RESTART DATABASE コマンドを実行し、再度 LIST INDOUBT TRANSACTIONS コマンドを実行して未確定トランザクションがないことを確認してください。
    $  db2 list indoubt transactions with prompting
    SQL1251W  No data returned for heuristic query.  SQLSTATE=00000

    db2diag.log には以下のようなメッセージが記録されます。
    2011-11-30-16.58.09.561284+540 E860889A491        LEVEL: Warning
    PID     : 835832               TID  : 3086        PROC : db2sysc 2
    INSTANCE: db2inst1             NODE : 002         DB   : SAMPLE
    APPHDL  : 2-89                 APPID: *
    AUTHID  : 
    EDUID   : 3086                 EDUNAME: db2agent (SAMPLE) 2
    FUNCTION: DB2 UDB, recovery manager, sqlpssdw, probe:5000
    MESSAGE : Indoubt transaction processing completed.
    DATA #1 : ZRC, PD_TYPE_ZRC, 4 bytes
    0x00000000
関連情報
パスポート・アドバンテージによく寄せられる質問
LIST INDOUBT TRANSACTIONS コマンド
未確定トランザクションの手動での解決
RESTART DATABASE コマンド
X/Open 分散トランザクション処理のモデル
SQL0998N

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmcAAE","label":"Recovery-\u003ELogging"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
23 August 2023

UID

swg21965469