問題判別の手引き

db2diag.log の解釈

db2diag.log ファイルは DB2 がログに記録した情報を含む ASCII ファイルです。 このファイルは、DIAGPATH データベース管理プログラム構成パラメーターによって指定されたディレクトリーにあります。 テキスト・エディターを使用して、 問題が生じたと思われるマシンのファイルを表示します。

db2diag.log の情報には次のものが含まれています。

db2diag.log の項目には 2 つのタイプがあります。

データベースが正常に動作している場合、 このタイプの情報は重要ではないので、無視して構いません。

注:

db2diag.log 項目のヘッダーの解釈

db2diag.log 項目のサンプルのヘッダー情報の例を次に示します。
2000-03-06-11.53.18.001160 (1)   Instance:payroll (2)  Node:000 (3)
PID:44829(db2agent (SAMPLE))(4) TID:352(5)   
Appid:*LOCAL.payroll.000306140834(6)
lock_manager (7)         sqlplrq (8)   Probe:111 (9)  Database:SAMPLE (10)
DIA9999E (11) An internal return code occurred. Report the following:
"0xFFFFE10E". (12)

凡例:

(1)
メッセージのタイム・スタンプ。

(2)
メッセージを生成するインスタンス名。

(3)
DB2 エンタープライズ拡張エディション・システムで db2nodes.cfg ファイルを使用する場合、メッセージを生成するノード。 (db2nodes.cfg ファイルを使用しない場合、値は "000" です。)

(4)
メッセージを生成するプロセスの識別。 この例では、 メッセージは 44829 と識別されるプロセスから送られています。 このプロセス名は db2agent で、SAMPLE という名前のデータベースに接続されています。

注: アプリケーションが DUOW 環境で実行されている場合、 表示されている ID は DUOW 相関トークンです。

(5)
メッセージを生成する表の識別。 この例では、メッセージは 352 と識別される表から送られています。

(6)
プロセスが作業しているアプリケーションの識別。 この例では、メッセージを生成しているプロセスは、 *LOCAL.payroll.970317140834 という ID のアプリケーションのために作業しています。

特定のアプリケーション ID についてさらに識別したい場合、 次のいずれかを行います。

(7)
メッセージを書き込む DB2 コンポーネント。 ユーザー・アプリケーションが db2AdminMsgWrite API を使用してメッセージを書き込む場合、 コンポーネントは "ユーザー・アプリケーション (User Application)" を読み取ります。

(8)
メッセージを提供する関数名。 この関数は、メッセージを書き込む DB2 サブコンポーネント内で処理されます。 ユーザー・アプリケーションが db2AdminMsgWrite API を使用してメッセージを書き込む場合、 関数は "ユーザー関数 (User Function)" を読み取ります。

関数が実行する活動の種類について詳しく知るためには、 名前の 4 番目の文字を見ます。 この例では、関数 "sqlplrq" の文字 "p" は、 データ保護の問題であることを表します (たとえば、ログの損傷など)。

次のリストに、関数名の 4 番目に使用される文字、 およびその文字によって表される活動の種類を示します。

b
バッファー・プール

c
クライアント / サーバー間の通信

d
データ・マネージメント

e
エンジン処理

o
オペレーティング・システムの呼び出し (ファイルのオープンおよびクローズ)

p
データ保護 (ロックおよびロギング)

r
リレーショナル・データベース・サービス

s
ソート

x
索引付け

(9)
報告された内部エラーの識別。

(10)
エラーが発生したデータベース。

(11)
内部エラーが生じたことを示す診断メッセージ。

(12)
内部戻りコードの 16 進表示。 詳細については、16 進コードの解釈を参照してください。

SQLCA 構造の解釈

重大エラーの場合、SQLCA 構造は db2diag.log にダンプされます。 各 SQLCA フィールドの詳細については、付録 B, SQL 連絡域 (SQLCA) を参照してください。

SQLCA ダンプがある db2diag.log の例を次に示します。
1997-03-16-11.53.18.001160    Instance:payroll   Node:000
PID:44829(db2agent (SAMPLE))     Appid:*LOCAL.payroll.970317140834
relation_data_serv          sqlrerlg    Probe:17   Database:SAMPLE
DIA9999E An internal return code occurred. Report the following : "0xFFFFE101".
Data Title :SQLCA pid(14358) (1)
sqlcaid : SQLCA    sqlcabc: 136    sqlcode: -980 (2)  sqlerrml: 0
sqlerrmc: (3)
sqlerrp : sqlrita
sqlerrd (4): (1) 0xFFFFE101  (5)  (2) 0x00000000    (3) 0x00000000
          (4) 0x00000000    (5) 0x00000000    (6) 0x00000000
sqlwarn : (1)         (2)       (3)       (4)      (5)       (6)
          (7)         (8)       (9)      (10)     (11)
sqlstate:

凡例:

(1)
SQLCA 項目の始め。

(2)
SQL 状態 (負の数の場合、エラーが生じています)。

(3)
SQL エラー・コードに関連した理由コード。

(4)
最終 SQL エラー・コードの原因となったエラーがいくつかある場合があります。 これらのエラーは sqlerrd 領域に順番に表示されます。

(5)
SQL エラーの 16 進表示。 詳細については、16 進コードの解釈を参照してください。

16 進コードの解釈

OS/2 および Windows システムでは、db2diag.log、または SQLCA エラー・コードのバイトが逆転しているものがあります。 形式が ffff nnnn の場合、そのまま解釈されます。 形式が nnnn ffff の場合、意味を読み取るためには、 バイトを逆転しなければなりません。

そのためには、最初の 4 文字を最後の 4 文字と入れ替え、 次に、5 番目と 6 番目の文字を、7 番目と 8 番目の文字と入れ替えます。

たとえば、エラー・コード "0ae6 ffff" は "ffff e60a" と変換されます。

エラー・コードが意味のある形式になっている場合、次のようにします。

  1. 16 進変換ツールを使用して、10 進形式に変換します。 そのコードがメッセージ解説書 にある場合、それは SQL コードです。
  2. エラー・コードの 10 進変換が SQL コードではない場合、戻りコードです。 戻りコードのリストは、付録 A, DB2 内部戻りコードを参照してください。

db2diag.log の解釈の例

次の例は、db2diag.log を使用してどのように問題を診断できるかを示しています。

例 1

問題: クライアント・アプリケーションがデータベース SAMPLE に対して実行されています。 実行中に、アプリケーションが必ず異常終了します。

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

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

サーバーの db2diag.log に次のような項目があったとします。


1997-03-16-20.52.27.001160    Instance:payroll   Node:000
PID:44829(db2sysc (SAMPLE))     Appid:*LOCAL.payroll.970317140834
buffer_pool_services  sqlbStartPools    Probe:0   Database:SAMPLE
Starting the database. (1)
1997-03-16-20.52.42.001160    Instance:payroll   Node:000
PID:44829(db2sysc (SAMPLE))     Appid:*LOCAL.payroll.970317140834
buffer_pool_services          sqlbcres    Probe:1100   Database:SAMPLE
DIA3726C A invalid page checksum was found for page "". (2)
ZRC=FFFFE119 (3)
1997-03-16-20.52.42.001160    Instance:payroll   Node:000
PID:44829(db2sysc (SAMPLE))     Appid:*LOCAL.payroll.970317140834
buffer_pool_services          sqlbcres    Probe:1100   Database:SAMPLE
 Obj={pool:2;obj:10;type:0} State=x27 (4)
Data Title :SQLB_OBJECT_DESC pid(104) tid(109)
0200 0a00 0200 0a00 0000 0000 0000 0000       ................
0000 002e e00c 0000 0000 0000 0000 0000       ................
0000 0000 0100 0000 2700 0000 0000 0000       ................
0000 0000 0000 0000                           ........
Dump File : C:\SQLLIB\DB2\104109.dmp Data : SQLB_PAGE

解釈:

(1)
初期接続がデータベースで行われました。 このメッセージのヘッダー情報から、データベースが SAMPLE データベースであることが分かります。

(2)
無効なページがあることを示すメッセージ。

(3)
ZRC=FFFFE119 は、 (2) で述べられている状態に対する内部 DB2 戻りコードです。 (このコードには追加メッセージがあります。 例 2 では、16 進戻りコードがどのようにエラー状態を判別するために使用されるかを示しています。)

(4)
この情報から、不整合であるとして検出されたオブジェクトが分かります。

解決方法: データベースを復元およびロールフォワードします。 これらができない場合、DB2 カスタマー・サポートに連絡します。

注: この例の場合、クライアントのマシンでのみ生じたエラーおよび症状の原因が、DB2 サーバー・マシンで生じたエラーであることを示しています。

例 2

問題: DB2 クライアント・アプリケーションを SAMPLE データベースに接続すると、 クライアント・アプリケーションは SQL1042C エラー・メッセージを受け取ります。

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

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

サーバーの db2diag.log に次のような項目があったとします。
1997-03-16-08.59.34.001160    Instance:payroll   Node:000
PID:55543(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
buffer_pool_services  sqlbStartPools    Probe:0   Database:SAMPLE
Starting the database. (1)
1997-03-16-08.59.35.001160    Instance:payroll   Node:000
PID:55543(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpresr    Probe:0   Database:SAMPLE
Crash Recovery has been initiated. (2)
1997-03-16-08.59.35.001160    Instance:payroll   Node:000
PID:55543(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpgole    Probe:30   Database:SAMPLE
A problem occurred while verifying a database log file S0000000.LOG
RC=0ae6 ffff (3)
1997-03-16-08.59.35.001160    Instance:payroll   Node:000
PID:55543(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpgilt   Probe:101  Database:SAMPLE
DiagData
0ae6 ffff
1997-03-16-08.59.36.001160    Instance:payroll   Node:000
PID:55543(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpgilt   Probe:60  Database:SAMPLE
DiagData
0ae6 ffff
1997-03-16-08.59.36.001160    Instance:payroll   Node:000
PID:55543(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpgasn   Probe:915  Database:SAMPLE
Marked the database log as bad. 0000 0000  (4)

解釈:

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

(2)
データベース破損の回復が開始されました。 最後に使用されたときに SAMPLE データベースが正常に停止しなかったことを示しています。

(3)
ログ・ファイル S0000000.LOG でエラーが生じました。 エラー・コードは "0ae6 ffff" です。

エラー・コードの形式は ffff nnnn でなければなりません。 しかし、OS/2 および Windows アーキテクチャーでは、整数のバイトを逆転します。 この例のエラー・コードの形式は nnnn ffff なので、 意味を読み取るためには、バイトを逆転しなければなりません。 詳細については、16 進コードの解釈を参照してください。

この例のエラー・コードは、ffff e60a に変換されます。 10 進形式 (-6646) に変換されるとこの SQL コードは無効になり、SQL コードではなく戻りコードになります。 付録 A, DB2 内部戻りコードで戻りコード E60A を調べると、 ファイルが存在していないことが分かります。

データベースの再始動および回復には、 データベースが停止した時に使用中だったすべてのログ・ファイルが必要となります。 この db2diag.log 項目は、 ログ・ファイル S0000000.LOG が予期していたロケーションに見つからないことを示しています。 再始動および回復処理を続けることができません。

(4)
再始動および回復処理が完了できないため、 DB2 はデータベースを「不良」とマークし、 データベースを再び使用する前に再始動および回復処理を完全に行わなければならないようにします。

解決方法: この問題を解決する最もよい方法は、バックアップから復元することです。 ログ・ファイルは S0000000.LOG (S0001005.LOG またはその他の値ではなく) ですので、 データベースのログ保存は使用可能となっていないか、新規です。 したがって、バックアップから復元するのが回復の唯一の方法です。

例 3

問題: データベース接続時に、SQL1004C メッセージを受け取りました。 このメッセージは、ファイル・システムの記憶域が足りないことを示しています。 どのファイル・システムが問題かをどのように判別できるでしょうか。

解決手順: まず、エラー・メッセージのテキスト自体を調べます。 (db2 ? sql1004c を発行するか、 メッセージ解説書 で受け取ったエラーについて調べます。) このメッセージは、コマンドをプロセスするにはファイル・システムの記憶域が不十分であることを示します。

次に、db2diag.log を調べて、どのファイル・システムがいっぱいかを正確に検索し、 追加情報があるかどうかをチェックします。

サーバーの db2diag.log に次のような項目があったとします。
1997-03-16-08.40.42.001160    Instance:payroll   Node:000
PID:66847(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpgifl    Probe:105   Database:SAMPLE
DiagData
0cd6 ffff (1)
1997-03-16-08.40.43.001160    Instance:payroll   Node:000
PID:66847(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpgifl (2)   Probe:540   Database:SAMPLE
0cd6 ffff
1997-03-16-08.42.55.001160    Instance:payroll   Node:000
PID:66847(db2syscs (SAMPLE))     Appid:*LOCAL.payroll.970317140834
data_protection       sqlpgifl    Probe:105   Database:SAMPLE
DiagData
0cd6 ffff

解釈:

(1)
関数 sqlpgifl はエラー・コード ffff d60c (nnnn ffff の形式のエラー・コードはバイトを逆転させてください) を検出しました。 このコードを 10 進表現に変換しても、有効な SQL コードにはなりません。 戻りコード D60C を 付録 A, DB2 内部戻りコードで探すと、 ディスクがいっぱいであることが分かります。

(2)
sqlpgif1 関数が繰り返しエラーを検出しています。 この関数はロギング関数です (これは、4 番目の文字が "p" だからです)。 詳細については、db2diag.log の解釈を参照してください。 この関数で繰り返し障害が起きるということは、 使用可能スペースをチェックするログ・パスをまず調べなければならないことになります。

解決方法:

  1. ログ・パスにあるスペースの量を判別するために、Windows または OS/2 では dir を、UNIX ベースの環境では df を使用します。
  2. どのくらいのスペースが必要となるかを判別するために、 ログのデータベース構成パラメーターに関して次の公式を使用します。 ログ・ファイルに必要なスペースの量 (バイト数) は次の範囲です。

    (logprimary * (logfilsiz * 4096) + 8192
    

    から

    ((logprimary + logsecond) * (logfilsiz + 2) * 4096) + 8192
    

    この計算結果は、ログ保存が使用不可となっているものと想定した場合に、 ログのために必要なスペースの範囲を示します。

    ログ保存が使用可能になっている場合、ユーザー出口が使用可能になっていないと、 ログはどんどん大きくなります。 ログ保存を使用する場合、ログ・パスにできるだけ多くの使用可能なスペースがあるようにしてください。

  3. ファイル・システムがいっぱいであると判断した場合は、次のいずれかを行います。

db2diag.log に問題を解決するのに必要な情報が含まれていない場合、 トレースを実行する必要があります。 詳細については、db2diag.log および DB2 トレースの使用例を参照してください。


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