問題判別の手引き

DB2 トレース機能 (db2trc) の使用

DB2 トレース機能 (db2trc コマンド) を使用すると、 イベントのトレース、ファイルへのトレース・データのダンプ、 および可読形式へのデータのフォーマットを行うことができます。 db2diag.log の情報では問題を診断するのに不十分な場合、 DB2 カスタマー・サポートからトレースを取るよう依頼されることがあります。

DB2 トレース情報はメモリーまたはディスクに保管されています。 収集時には、情報は年代順に記録されます。

トレースで収集された情報の量は、またたく間に大きくなります。 したがって、エラー状態だけを取り込み、他の活動 (たとえば、 db2start でのデータベース管理プログラム・インスタンスの開始、db2 CONNECT を使用したデータベースへの接続など) は無視するとよいでしょう。 トレースを行う際に、最小の 再生可能なシナリオを複製して取り込み、 将来行う分析で使用できるようにしておいてください。

トレースを行うプロセスは、DB2 インスタンスの動作全般に影響を与えます。 パフォーマンス低下の程度は、問題の種類およびトレース情報の収集に使用されたリソースの数によります。

プラットフォームによって、トレースを行う方法がいくつかあります。 たとえば、UNIX ベースのシステムでは、db2trc コマンドを使用しなければなりません。

始める前に

DB2 トレース機能を使用する前に、以下の点を考慮してください。

トレース機能 (db2trc) コマンドの使用

DB2 トレース機能のトレースは、db2trc on コマンドで活動化されます。 このコマンドにはさまざまなパラメーターがあり、 収集するデータの量やタイプを制御することができます。

db2trc コマンドの構文は、 以下に示してあります。 その後に、パラメーターの説明があります。

>>- db2trc--+--------------------------------------------------------+->
            |      .-----------------------------------------------. |
            |      V                                               | |
            +- on-----+-----------------------------------------+--+-+
            |         |      .-.------------------------------. |    |
            |         |      V                                | |    |
            |         +- -m----+- *------------------------+--+-+    |
            |         |        |  .-,--------------------. |    |    |
            |         |        |  V                      | |    |    |
            |         |        '------ num--+-------+----+-'    |    |
            |         |                     '- -num-'           |    |
            |         +- -e-- max_sys_errors--------------------+    |
            |         +- -r-- max_record_size-------------------+    |
            |         +- -f-- filename--------------------------+    |
            |         +-+- -l--+---------------+-+--------------+    |
            |         | |      '- buffer_size--' |              |    |
            |         | '- -i--+---------------+-'              |    |
            |         |        '- buffer_size--'                |    |
            |         '- -t-------------------------------------'    |
            +- off---------------------------------------------------+
            +- dump-- filename---------------------------------------+
            +- flw-- dump_file-- output_file-------------------------+
            '- fmt-- dump_file-- output_file-------------------------'
 
>--------------------------------------------------------------><
 

パラメーター

トレースをオンにし、ダンプ・ファイルを生成し、ダンプ・ファイルをフォーマットし、 そしてトレースをオフにするために、db2trc コマンドを数回発行しなければなりません。 次のリストには、パラメーターを使用する順に示してあります。

on
このパラメーターを使用して、DB2 トレース機能を開始します。 このパラメーターのオプションについては、DB2 トレースの開始を参照してください。

dump
メモリーをトレースしている場合、このパラメーターを使用して、 エラーを複製した後トレース情報をファイルにダンプします。 次のコマンドを実行すると、db2trc.dmp というファイルの現行ディレクトリーに情報をダンプします。

db2trc dump db2trc.dmp

ファイル名は、このパラメーターで指定する必要があります。 明示的にパスを指定しない限り、このファイルは現行ディレクトリーに保管されます。

off
トレースをファイルにダンプした後、次のように入力してトレースをオフにします。

db2trc off

flw | fmt
トレースをバイナリー・ファイルにダンプした後、 それを ASCII ファイルにフォーマットして、トレースが正常に行われたかどうかを確認します。 その際に、flw オプション (プロセスまたはスレッドでのソート)、 または fmt オプション (すべてのイベントの年代順リスト) のいずれかを使用します。 どちらのオプションでも、ダンプ・ファイル名と生成される出力ファイル名を指定しなければなりません。 たとえば、次のようになります。

db2trc flw db2trc.dmp db2trc.flw
db2trc fmt db2trc.dmp db2trc.fmt

これらのオプションは、トレースを検査するために使用します。 これらのファイルも、DB2 カスタマー・サービスおよびサポートに送付することが必要な場合があります。

DB2 トレースの開始

トレース機能を開始するには、db2trc on と入力します。 トレース・オプションのデフォルト値には、次のようなものがあります。

-m *.*.*.*
すべてをトレースします。

-e -1
すべてのエラーを収集します。

-r 16000
最大レコード・サイズは 16 KB です。

-s
トレース宛先は共用メモリー (ファイルではなく) です。

-l 2000000
最後のトレース・レコードを保存します。 バッファー・サイズは 2 MB です (AIX 以外の UNIX ベースのシステムでは、 デフォルトのバッファー・サイズは 512 KB です)。

トレースを調整するためにオプションを指定するよう指示されることがあります。 次のオプションは、DB2 カスタマー・サポートから指示された場合にだけ使用してください。

-m mask
探索の的を絞るためにトレース・レコード・タイプを指定します。 mask 変数は、 ピリオドで区切られた 4 つの単一バイト・マスクから成っています。 これらのマスクは、製品、イベント・タイプ、コンポーネント、および機能に対応します。 また、これらのマスクはフィルターのような働きをし、 各イベントについてその ID に基づいて DB2 から送信されたトレース・レコードを受け入れたり拒否したりします。

DB2 カスタマー・サポートがデフォルト値ではない値を要求する場合、 使用する値が指示されます。

-e max_sys_errors
トレースが保持する DB2 内部システム・エラーの数を max_sys_errors に制限します。 デフォルト値は -1 (すべてのエラーの収集) です。

-r max_record_size
トレース・レコードのサイズを max_record_size バイトに制限します。 これより長いトレース・レコードは切り捨てられます。

-s | -f filename
デフォルトでは、トレース出力は共用メモリー内に保管されます (-s オプション)。 この出力にアクセスできないようにするためにワークステーションが中断されている場合、-f オプションでファイルをトレースできます。 この出力を使用する場合、トレース出力が保管されるファイルを指定しなければなりません。 例については、ファイルを使用したトレースの例を参照してください。

-l [ buffer_size] | -i [buffer_size]
-l (小文字の "L") は、最後のトレース・レコードの保持を指定します (バッファーがいっぱいになった時、最初のレコードは上書きされます)。 オプション -i は、初期のトレース・レコードの保持を指定します (バッファーがいっぱいになると、レコードは書き込まれません)。

これらのオプションのいずれかを使用して、 バッファー・サイズを指定します。

-t
タイム・スタンプを含めます。 UNIX ベースの環境でのみ使用されます。 タイム・スタンプのログはパフォーマンスにかなり影響します。

DB2 トレースの検査

トレース情報は、エラーの診断に役立つ場合もあり、役立たない場合もあります。 たとえば、次のような状態ではエラー条件を取り込みません。

トレース・ファイルが読み取り可能であることを検査するには、 バイナリー・トレース・ファイルをフォーマットしてフロー制御を表示し、 フォーマット済みの出力をヌル装置に送信します。 このタスクを処理するコマンドの例を次に示します。

db2trc flw example.trc nul

このコマンドの出力は、ファイルを読み取る問題があるかどうか、 またトレースが折り返されたかどうかを明示的に表示します。

db2trc の使用例

次の例は、db2trc の使用方法を示すためのシナリオです。

メモリーを使用したトレースの例

望ましいトレースの方法は、このメモリーを使用したトレースです。 この例では、トレース・バッファー・サイズは 4 MB に指定されています。

  1. 他のすべてのアプリケーションを遮断します。
  2. 次のコマンドを使用して、トレースをオンにします。
    db2trc on -l 4000000 -e -1
    
  3. 問題のシナリオを再現します。 イベント項目を最小限に抑えるために、 DB2 活動をできるだけ小さくしてください。
  4. 次のコマンドを使用して、トレースをファイルにダンプします。
    db2trc dump db2trc.dmp
    

    (問題が発生した直後にトレースをダンプしてください。 そうしないと、エラーの後で起きる SQL エラーが取り込まれ、 重要な情報が失われてしまいます。)

  5. 次のコマンドを使用して、トレースをオフにします。
    db2trc off
    

ファイルを使用したトレースの例

ファイルを使用したトレースは、再作成される問題がワークステーションを停止して、 トレースをファイルにダンプできない場合に役立ちます。 ファイルを使用してトレースする場合、各トレース項目は入力されるたびにディスクに書き込まれます。 ファイル内の情報は、中断まで (中断そのものは含まない) のイベントを取り込みます。

この例では、ファイル・サイズは 4 MB に、 そしてファイル名は db2trc.dmp に指定されています。

  1. 他のすべてのアプリケーションを遮断します。
  2. 次のコマンドを使用して、トレースをオンにします。
    db2trc on -l 4000000 -e -1 -f db2trc.dmp
    
  3. 問題のシナリオを再現します。

    ワークステーションをリブートすると、db2trc.dmp ファイルが存在するようになります。 そのファイルには、システム破損の原因となったイベントまでの種々のイベントが含まれています。

db2diag.log および DB2 トレースの使用例

問題: クライアントからデータベースに接続しようとしているときに、SQL1042C エラー・メッセージを受け取ります。 データベースへのアクセスができません。

解決手順: 問題の解決方法を探すには、まず、エラーが起きている場所を探します。 エラーはクライアントで生じていますから、まずクライアントでエラーを探すことから始めます。 そのために、クライアント・マシンの db2diag.log を見ます。 詳細については、db2diag.log の解釈を参照してください。

クライアントの db2diag.log に、項目が含まれていないとします。 DB2 サーバー・マシンの db2diag.log を見て、サーバーでエラーが生じているかどうかを調べます。

サーバーの db2diag.log に次のような項目があったとします。
1997-03-16-08:54:37.001160    Instance:payroll   Node:000
PID:74467(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
buffer_pool_services  sqlbStartPools    Probe:0   Database:SAMPLE
Starting the database. (1)
1997-03-16-08:54:38.001160    Instance:payroll   Node:000
PID:74467(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpresr    Probe:0   Database:SAMPLE
Crash Recovery has been initiated. (2)
1997-03-16-08:54:38.001160    Instance:payroll   Node:000
PID:74467(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpresr    Probe:0   Database:SAMPLE
Low transaction lsn: 0000 005d c00c
1997-03-16-08:54:38.001160    Instance:payroll   Node:000
PID:74467(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpresr    Probe:0   Database:SAMPLE
Minimum buffer lsn: 0000 005d c00c
1997-03-16-08:54:38.001160    Instance:payroll   Node:000
PID:74467(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_management (5)     sqldmund    Probe:375   Database:SAMPLE
Error during undo. (3) 0ae6 ffff 0ae6 ffff 0000 005e efa2 6363  (4)

解釈:

(1)
SAMPLE データベースへの初期接続要求を受け取りました。 これは、クライアント要求がデータベース・サーバーに届き、 通信が行われていることを示します。

(2)
データベースは再始動が必要な状態にあります。 つまり、最後に使用された時にきちんと遮断されていませんでした。

(3)
データベース内のトランザクションがコミットされておらず、 データベースの整合のためにロール・バック (「取り消し」) された時に、 エラーが検出されました。

(4)
最初にダンプされたエラー・コードは ffff e60a (nnnn ffff の形式のエラー・コードはバイトを逆転させてください) です。 このコードを 10 進表現に変換しても、有効な SQL コードにはなりません。 付録 A, DB2 内部戻りコードで戻りコード E60A を調べると、ファイルが存在していないことが分かります。

(5)
エラーを検出したサブコンポーネントはデータ管理であるため、 データ・オブジェクトが欠落していると予測できます。

解決手順: 残念ながら、db2diag.log にはどのファイルが欠落しているかを判別するのに役立つ情報が含まれていませんでした。 エラー条件のトレースを行い、トレース・ファイルの E60A エラー・コードを走査しなければなりません。

トレース・ファイルが次のようなものだとします。
3478    DB2 non-fatal_err oper_system_services sqloopenp (1.4.15.140)
        pid 55; tid 38; cpid 112; time 365535; trace_point 6
        433a 5c44 4232 5c53 514c 3030 3030 315c   /DB2/SQL00001/
        5351 4c54 3030 3032 2e30 5c53 514c 3030 SQLT0002.0/SQL00
        3031 302e 4441 54                       010.DAT (2)
3479    DB2 cei_data      oper_system_services sqloopenp (1.25.15.140)
        pid 55; tid 38; cpid 112; time 365535; trace_point 7
        ffff ffff
3480    DB2 cei_errcode   oper_system_services sqloopenp (1.6.15.140)
        pid 55; tid 38; cpid 112; time 365535; trace_point 254
        return_code = 0xffffe60a (1) = -6646 = SQLO_FNEX

解釈:

(1)
トレース・ファイルの項目は年代順に並べられているので、 トレース・ファイルの最下部から最初へとさかのぼって探索します。 戻りコード E60A はトレース項目 3480 にあります。

(2)
トレース項目 3480 から逆方向に走査すると、 オープンされていたファイルが、 表スペース SQLT0002.0 にある SQL00010.DAT であることがわかります。

解決策: 良い状態にあるバックアップから復元し、ログの終わりまでロールフォワードして、 データが失われていないことを確認します。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]