Comments
Description
Transcript
簡単シリーズ トレース編 目次 2002/03
簡単シリーズ トレース編 2002/03 SS&WSCC#1 目次 1 DB2 UDBのトレース機能と用途 2 DB2 イベントモニター 2−1 イベントモニター概要 2−2 SQLステートメントイベント 2−3 デッドロックイベント 2−4 イベントモニター補足事項 3. db2diag.log 4. CLIトレース 4−1 CLIトレースの収集方法 4−2 CLIトレースの調査例 5. db2trc 終わりに 付録 CLIトレースの追及例 Systems Solution & Web Server Competence Center No.1 DM Group 1-2 1 DB2 UDBのトレース機能と用途 トレース機能が欲しくなるのはどんな時でしょう? 問題の原因究明 なりゆきの把握 悪い原因の発見 証拠の収集 DB2 UDBのアプリケーションやサーバーが期待通りの動きをしない 時、何がどこまでうまく行って最後はどうなったか?成り行きを 見て原因究明を行いたいことがあります。当資料ではこういっ た目的に使えるDB2の機能の使い方と見方をご紹介します。 当資料では、各DB2の機能の正式名称にはこだわらず、この目的に合う 機能をひろくトレース機能と呼んでいます Systems Solution & Web Server Competence Center No.1 DM Group 1 DB2 UDBのトレース機能と用途 よくある関心事と解決策 アプリケーションの実行時間が長い、どこに時間がかかっているのだろう? 実行時間の長いSQLがあるのか?それはどれか? SQLの発行と発行の間に時間がかかっているのか? SQLが非常に多く発行されているのか? イベントモニター for STATEMENTS を利用してみましょう デッドロックが起こってしまった。どこに原因があるのだろう? どのアプリケーションと、どのアプリケーションで起こったのか? どんなSQLとどんなSQLで起こったのか? どのクライアントとどのクライアントで起こったのか? イベントモニター for DEADLOCKS を利用してみましょう DB2でこんな現象が起きてしまった、その状況はどこに残っていないか? db2diag.log ファイルを調べてみましょう Java や VB で不思議なエラーが返ってくる、これはなぜ? CLIトレースを収集してみましょう DB2内部エンジンの動きはわからないの? db2trc で資料収集してみましょう 今までの資料でらちがあかない、そんな時どうする? 状況によってはOSやPDツールによるiptraceも併用してみましょう Systems Solution & Web Server Competence Center No.1 DM Group 3-4 2−1 イベントモニター概要 イベントモニターの種類 イベントモニターには次の8種類の事象を収集できます、この資料ではよく使われる2つを取り上げます DATABASE データベースイベント 全アプリケーションがデータベースから切断した時に記録 TABLES 各表のイベント 全アプリケーションがデータベースから切断した時に記録 DEADLOCKS デッドロックイベント デッドロックの発生時に記録 TABLESPACE 表スペースイベント 全アプリケーションがデータベースから切断した時に記録 BUFFERPOOL バッファープールイベント 全アプリケーションがデータベースから切断した時に記録 CONNECTIONS 各アプリケーションの接続イベント 各アプリケーションがデータベースから切断した時に記録 STATEMENTS SQLステートメントイベント 各SQLステートメントの完了時に記録 TRANSACTION COMMIT/ROLLBACKイベント 各トランザクションの終了時に記録 デッドロックイベント ステートメントイベント Systems Solution & Web Server Competence Center No.1 DM Group 2−1 イベントモニター概要 イベントモニターの操作に必要な権限 作成、削除、活動、非活動 イベントモニターの操作はSYSADM または DBADM 権限に限られています イベントモニター使用の流れ CREATE EVENT MONITOR sql によるイベントモニターの登録 モニター名 モニタータイプ 書き出し先(ファイル、名前つきパイプ) オプション SET EVENT MONITOR STATE sql による イベントモニターの活動化 発生したイベントをDB2が収集、書き出し 登録 活動化 アプリケーション SET EVENT MONITOR STATE sql によるイベントモニターの非活動化 db2 catalog 0000000.evt SQL db2 出力先 ファイル 非活動化 db2evmon プログラムによる編集出力 db2evmon イベントモニターの操作はCREATE EVENT MONITOR SQL文であらかじめ登録され た収集対象のイベントを活動化させてファイルまたは名前つきパイプにイベント を収集します ファイル出力すると、非活動化後に編集プログラムdb2evmonで編集出力できます 名前つきパイプへ出力するとすぐに編集・処理プログラムへ渡すことができます イベントモニターのレコード形式は公開されていて編集プログラムをユーザーが作成す ることもできます。編集用サンプルプログラムも提供されています。 Systems Solution & Web Server Competence Center No.1 DM Group 5-6 イベントモニター 出力リスト 2−2 SQL ステートメントイベント:収集手順 収集手順 使用環境:DB2 for Windows/NT V7.1 FP3 Unix/Linux環境では書き出し先ディレクトリー名の変更と、そのディレクトリーへのdb2インスタンスのパーミッション付与が必要です イベントモニターの登録 create event monitor ev1 for statements write to file 'c:¥common¥kantan¥trace1' replace DB20000I SQL コマンドが正常に終了しました。 解説: DB2コマンドラインプロセッサーから、EV1 という名前のイベントモニターをSTATEMENTSイベントとして登録します 出力はファイル書き出しとし、書き出し先ディレクトリー名を ' ' で囲んで指定します replace オプションをつけると、活動化-非活動化、のあと再度活動化した際に、前回のファイルを上書きします 一般にトレースファイルは大きくなりがちですから、replaceオプションを使って前回分を含まない方が読みやすくなります イベントモニターの活動化 set event monitor ev1 state 1 DB20000I SQL コマンドが正常に終了しました。 登録したイベントを活動化するとイベントの収集が始まります トレースしたいアプリケーションの実行 イベントモニターの非活動化 set event monitor ev1 state 0 DB20000I SQL コマンドが正常に終了しました。 登録したイベントを非活動化するとイベントの収集が終わり、ファイル書き出しが終了します イベントの編集出力 db2evmon -db データベース別名 -evm ev1 > event1.txt イベントの出力を編集出力します。該当のデータベース別名とイベント名を指定します Systems Solution & Web Server Competence Center No.1 DM Group ブランクページ 7-8 2−2 SQL ステートメントイベント:出力の見方 実行時間の長いSQLはどれか? 8) Statement Event ... Appl Handle: 3 Appl Id: *LOCAL.DB2.010830105525 Appl Seq number: 0001 ハンドル3:アプリケーションの コネクション情報 ハンドル3の コネクションヘッダー イベントを参照 Record is the result of a flush: FALSE ------------------------------------------Select文はCloseイベン Type : Dynamic トに注目すれば十分 Operation: Close カーソルのClose Section : 201 Creator : NULLID Select文を発行したパッ パッケージ名 Package : SQLC2D01 ケージ名(参考) ③ Cursor : SQLCUR201 問 Cursor was blocking: FALSE 題 Text : select count(*) from syscat.columns x, syscat.columns y 発行された動的SQL文 の ------------------------------------------SQL Start Time: 08/30/2001 19:59:09.057957 Stop Time: 08/30/2001 19:59:33.369759 実行時間 24.3秒 Exec Time: 24.311802 seconds Number of Agents created: 1 ①時間が長い User CPU: 23.573897 seconds CPU時間 23.5秒 System CPU: 0.040058 seconds Fetch Count: 1 Select結果 1行 Sorts: 0 ②行読み取り、 Total sort time: 0 行取り出しが多い Sort overflows: 0 DB2が読み取ったのは 13,158,756行 Rows read: 13158756 Rows written: 0 Internal rows deleted: 0 Internal rows updated: 0 Internal rows inserted: 0 参考 SQLCA: 正常終了 SQLCODE 0 sqlcode: 0 sqlstate: 00000 Systems Solution & Web Server Competence Center No.1 DM Group 2−2 SQL ステートメントイベント:出力の見方:解説 実行時間の長いSQLはどれか? ①:まず、実行時間とCPU時間の多いイベントに着目しましょう Exec Time: に実行経過時間が秒単位で User CPU Time: にDB2が使用したCPU時間が秒単位で表示されます これらが長いものを選びましょう、 カーソルを使ったSelectの操作はPrepare Open Describe Close の4つのイベントとして載ります。このうちCloseの操作に着目すれ ば十分です ②:時間が長いのは取り扱った行数が多いためか、参考に見てみましょう Fetch Count: にアプリケーションに返された、アプリケーションが受け取った行数が Rows Read: には、その準備のためにDB2が内部的に読み取った行数が載ります ③:この処理に使われた動的SQLのSQL文を見てみましょう Text: に載ります、SQL文の最大長は64KB です 次でこのSQLを発行したアプリケーション名を見るために、Appl Handle: と Appl Id: の値を確認しておきましょう Systems Solution & Web Server Competence Center No.1 DM Group 9-10 2−2 SQL ステートメントイベント:出力の見方 実行時間の長いSQLを発行したアプリケーションは何か? 3) Connection Header Event ... ハンドル3の ハンドル3:アプリケーションの Appl Handle: 3 ステートメントイベントを コネクション情報 Appl Id: *LOCAL.DB2.010830105525 参照 Appl Seq number: 0001 DRDA AS Correlation Token: *LOCAL.DB2.010830105525 プログラム名 db2bp.exe (コマンドラインプロセッサー) Program Name : db2bp.exe Authorization Id: DB2ADMIN Execution Id : DB2ADMIN 接続したAUTHORIZATION IDはDB2ADMIN Codepage Id: 943 Country code: 81 Client Process Id: 832 SAMPLEデータベース Client Database Alias: sample Client Product Id: SQL07020 Client Platform: Unknown Client Communication Protocol: Local Client Network Name: Connect timestamp: 08/30/2001 19:55:25.815032 アプリケーションの情報をあらわす"コネクションヘッダーイベント"も出力に含まれています SQLの発行のステートメントイベントに載っていたAppl Handle: と Appl Id: の値を持つコネクションヘッダーイベントを探してみましょう Program Name: に 実行プログラム名が載ります。 db2bp.exe は DB2コマンドラインプロセッサーです Java ならば Java.exe 、MicroSoft Visual StudioのVisual Basic V6でADOを使っていてデバック中なら VB6.exe などと表示さ れます ほかに、データベースへ接続時に指定したユーザーID(authorization ID) や接続のデータベース別名なども載ります この実行プログラム名は db2 list applications コマンドでも表示されます Systems Solution & Web Server Competence Center No.1 DM Group 2−2 SQL ステートメントイベント:静的SQLの出力の見方 実行時間の長いSQLを発行したアプリケーションは何か? 7) Statement Event ... Appl Handle: 10 Appl Id: *LOCAL.DB2.010830152055 Appl Seq number: 0001 セク ショ ン1 ハンドル10:アプリケーションの コネクション情報 ハンドル10の コネクションヘッダー 6) Connection Header Event ... Appl Handle: 10 Record is the result of a flush: FALSE Appl Id: *LOCAL.DB2.010830152055 ------------------------------------------Appl Seq number: 0001 Type : Static DRDA AS Correlation Token: *LOCAL.DB2.010830152055 Operation: Execute Exucutes操作 Program Name : STATIC2.exe Section : 1 Authorization Id: DB2ADMIN プログラム名 Creator : DB2ADMIN Execution Id : DB2ADMIN STATIC2.exe パッケージ名STATIC2 Package : STATIC2 Codepage Id: 943 Cursor : Country code: 81 Cursor was blocking: FALSE Client Process Id: 2068 ------------------------------------------Client Database Alias: sample Start Time: 08/30/2001 14:22:46.566173 Client Product Id: SQL07020 Stop Time: 08/30/2001 14:23:20.986290 Client Platform: Unknown Exec Time: 34.420117 seconds 実行時間 34.4秒 Client Communication Protocol: Local Number of Agents created: 1 Client Network Name: User CPU: 33.868701 seconds CPU時間 33.8秒 Connect timestamp: 08/30/2001 14:22:46.556588 System CPU: 0.080115 seconds Fetch Count: 0 Sorts: 0 次に静的SQLについて見てみましょう Total sort time: 0 静的SQLとは埋め込みSQLプログラムをプリコンパイルしバインドし実行するプロ Sort overflows: 0 グラミング方式です。 Rows read: 2 実行時間やプログラム名は編集出力にあらわれますが、SQL文は直接現れませ Rows written: 0 ん。これはすでにプリコンパイラーがSQL文を翻訳を事前に終えているためです。 Internal rows deleted: 0 次に見るように、パッケージ名とセクション番号から、別のユーティリティを使って Internal rows updated: 0 SQL文を知ることができます Internal rows inserted: 0 SQLCA: sqlcode: 0 sqlstate: 00000 Systems Solution & Web Server Competence Center No.1 DM Group 11-12 2−2 SQL ステートメントイベント:静的SQLの出力の見方 実行時間の長いSQLを発行したアプリケーションは何か? 静的SQLプログラムの問題のSQL文はどんなものか? db2bfd -s static2.bnd static2.bnd: SQL Statements = 4 セク ショ ン1 Line Sec Typ Var Len SQL statement text ---- --- --- --- --- --------------------------------------------------------41 0 10 0 13 INCLUDE SQLCA 51 0 5 0 21 BEGIN DECLARE SECTION 53 0 2 0 19 END DECLARE SECTION 65 1 0 1 135 SELECT CHAR(COUNT(*)) INTO :H00001 FROM SYSCAT.TABLES X, SYSCAT.TABLES Y, SYSCAT. TABLES Z static2.bndの セクション1のSQL文 ステートメントイベントでパッケージ中でSQL文が発行されたセクション番号がわかります。 パッケージをバインドした元のバインドファイルがあれば、それに対してdb2bfdユーティリティを実行してセクション番号に対応 するSQL文を表示することができます static2.bnd は静的SQLのソースをDB2プリコンパイラーでプリコンパイルして生成されたバインドファイルです Systems Solution & Web Server Competence Center No.1 DM Group ブランクページ 13-14 2−3 デッドロック イベント:収集手順 収集手順説明 使用環境:DB2 for Windows/NT V7.1 FP3 Unix/Linux環境では書き出し先ディレクトリー名の変更と、そのディレクトリーへのdb2インスタンスのパーミッション付与が必要です イベントモニターの登録 create event monitor ev2 for deadlocks write to file 'c:¥common¥kantan¥trace2' replace DB20000I SQL コマンドが正常に終了しました。 解説: DB2コマンドラインプロセッサーから、EV2 という名前のイベントモニターをDEADLOCKSイベントとして登録します 出力はファイル書き出しとし、書き出し先ディレクトリー名を ' ' で囲んで指定します replace オプションをつけると、活動化-非活動化、のあと再度活動化した際に、前回のファイルを上書きします 一般にトレースファイルは大きくなりがちですから、replaceオプションで前回分を含まない方が読みやすくなります イベントモニターの活動化 set event monitor ev2 state 1 DB20000I SQL コマンドが正常に終了しました。 登録したイベントを活動化するとイベントの収集が始まります デッドロックの発生 イベントモニターの非活動化 set event monitor ev2 state 0 DB20000I SQL コマンドが正常に終了しました。 登録したイベントを非活動化するとイベントの収集が終わり、ファイル書き出しが終了します イベントの編集出力 db2evmon -db データベース別名 -evm ev2 > event2.txt イベントの出力を編集出力します。該当のデータベース別名とイベント名を指定します Systems Solution & Web Server Competence Center No.1 DM Group ブランクページ 15-16 2−3 デッドロックイベント:出力の見方 いつデッドロックが起こったのか? deadlock Event レコードの確認 7) Deadlocked Connection ...(デッドロック対象アプリケーション) Appl Id: *LOCAL.DB2.010830152045 (自分) Appl Seq number: 0001 (相手) Appl Id of connection holding the lock: *LOCAL.DB2.010830152046 Seq. no. of connection holding the lock: 0001 Lock wait start time: 08/30/2001 12:39:42.599334 Requesting lock as part of escalation: FALSE Deadlock detection time: 08/30/2001 12:41:29.707303 Table of lock waited on : EMPLOYEE Schema of lock waited on : ADMINISTRATOR Tablespace of lock waited on : USERSPACE1 Type of lock: Row Mode of lock: X Mode application requested on lock: NS Node lock occured on: 0 Lock object name: 257 Application Handle: 0 (自分) 6) Deadlocked Connection ...(デッドロック対象アプリケーション) Appl Id: *LOCAL.DB2.010830152046 (自分) Appl Seq number: 0001 (相手) Appl Id of connection holding the lock: *LOCAL.DB2.010830152045 Seq. no. of connection holding the lock: 0001 Lock wait start time: 08/30/2001 12:41:21.623688 Requesting lock as part of escalation: FALSE Deadlock detection time: 08/30/2001 12:41:29.707303 Table of lock waited on : EMPLOYEE Schema of lock waited on : ADMINISTRATOR Tablespace of lock waited on : USERSPACE1 Type of lock: Row Mode of lock: X Mode application requested on lock: NS Node lock occured on: 0 Lock object name: 4 Application Handle: 1 (自分) 2つのアプリケーションで発生 この時刻にDEADLOCKが発生した RollBackしたのは6)の方 5) Deadlock Event ...(デッドロックの発生) Number of applications deadlocked: 2 Deadlock detection time: 08/30/2001 12:41:29.707303 Rolled back Appl Id: : *LOCAL.DB2.010830152046 Rolled back Appl seq number: : 0001 コネクションヘッ ダー3)に対応 コネクションヘッ ダー4)に対応 Systems Solution & Web Server Competence Center No.1 DM Group 2−3 デッドロックイベント:出力の見方:解説 いつデッドロックが起こったのか? デッドロックイベントの出力にはDeadlock Event のレコードに続き、デッドロック対象のアプリケーションのレコードが載ります Deadlock Eventレコード はデッドロックの事象そのものです Deadlocked Connectionレコード がデッドロック対象アプリケーションです デッドロックイベントに発生時刻やRollbackされた側のアプリケーションID、関連したアプリケーション数が載ります デッドロック コネクションレコードには相手のアプリケーションのIDも載ります Appl Id of connection holding the lock: が相手のアプリケーションIDです デッドロック コネクションレコードには自分のAppl Id が載り、コネクションヘッダーイベントのレコードと対応付けられます。 Appl Id とAppl Handle がコネクションヘッダーイベントにもあります Systems Solution & Web Server Competence Center No.1 DM Group 17-18 2−3 デッドロックイベント:出力の見方 どのアプリケーションとどのアプリケーションでデッドロックが起こったのか? コネクションヘッダーイベントの確認 3) Connection Header Event ...(コネクションヘッダー) Appl Handle: 0 7) Appl Id: *LOCAL.DB2.010830152045 Appl Seq number: 0001 DRDA AS Correlation Token: *LOCAL.DB2.010830105525 (DB2コマンドプロセッサー) Program Name : db2bp.exe Authorization Id: DB2ADMIN Execution Id : DB2ADMIN Codepage Id: 943 Country code: 81 Client Process Id: 832 Client Database Alias: sample (SAMPLEデータベース) Client Product Id: SQL07020 Client Platform: Unknown Client Communication Protocol: Local Client Network Name: Connect timestamp: 08/30/2001 12:38:19.416275 4) Connection Header Event ...(コネクションヘッダー) Appl Handle: 1 6) Appl Id: *LOCAL.DB2.010830152046 Appl Seq number: 0001 DRDA AS Correlation Token: *LOCAL.DB2.010830135535 (DB2コマンドプロセッサー) Program Name : db2bp.exe Authorization Id: DB2ADMIN Execution Id : DB2ADMIN Codepage Id: 943 Country code: 81 Client Process Id: 1980 (SAMPLEデータベース) Client Database Alias: sample Client Product Id: SQL07020 Client Platform: Unknown Client Communication Protocol: Local Client Network Name: Connect timestamp: 08/30/2001 12:38:27.186339 前々ページのデッ ドロックコネクショ ンレコード7) に対応 前々ページの デッドロックコネ クションレコード 6)に対応 デッドロックコネクションレコードのAppl Id: か Appl Handle:の値を使ってコネクションヘッダーイベントを見つけることができます コネクションヘッダーイベントにはプログラム名があります Program Name: db2bp.exe は DB2コマンドプロセッサーがアプリケーションプログラムであることを示します Systems Solution & Web Server Competence Center No.1 DM Group 2−3 デッドロックイベント:出力の見方 どんなSQLと、どんなSQLで起こったのか? Deadlocked Connectionレコードの確認 対象表名はTable of lock waited on とSchema of lock waited on でわかります、この場合Administrator.Employee表です SQL文そのものは、この資料だけではわかりません しかしながら、取得されたLockのModeから発行されたSQLのタイプの候補を推測できます このケースでは、INSERT/UPDATE/DELETE (Xロック)後SELECT(NSロック)された可能性があります ただしNSロックはSELECTだけとは限りませんのでこれ以外の可能性もあります、SQL文を特定するには別の情報が要ります 6) Deadlocked Connection ...(デッドロック対象アプリケーション) Appl Id: *LOCAL.DB2.010830152046 (自分) Appl Seq number: 0001 (相手) Appl Id of connection holding the lock: *LOCAL.DB2.010830152045 Seq. no. of connection holding the lock: 0001 Lock wait start time: 08/30/2001 12:41:21.623688 Requesting lock as part of escalation: FALSE Deadlock detection time: 08/30/2001 12:41:29.707303 Table of lock waited on : EMPLOYEE 対象表 Schema of lock waited on : ADMINISTRATOR Tablespace of lock waited on : USERSPACE1 Type of lock: Row 行のX (相手の保持していたロック) Mode of lock: X ロック Mode application requested on lock: NS (自分の要求したロック) Node lock occured on: 0 行のNextKey Lock object name: 4 Shareロック Application Handle: 1 (自分) 相手がEMPLOYEE表の行のExclusive Lock持っ ている時に、 自分はその行にNext Key Share Lockを取ろうと した 7) Deadlocked Connection ...(デッドロック対象アプリケーション) Appl Id: *LOCAL.DB2.010830152045 (自分) Appl Seq number: 0001 (相手) Appl Id of connection holding the lock: *LOCAL.DB2.010830152046 Seq. no. of connection holding the lock: 0001 Lock wait start time: 08/30/2001 12:39:42.599334 Requesting lock as part of escalation: FALSE Deadlock detection time: 08/30/2001 12:41:29.707303 Table of lock waited on : EMPLOYEE 対象表 Schema of lock waited on : ADMINISTRATOR Tablespace of lock waited on : USERSPACE1 Type of lock: Row 行のX (相手の保持していたロック) Mode of lock: X ロック Mode application requested on lock: NS (自分の要求したロック) Node lock occured on: 0 行のNextKey Lock object name: 257 Shareロック Application Handle: 0 (自分) 相手がEMPLOYEE表の行のExclusive Lock持っ ている時に、 自分はその行にNext Key Share Lockを取ろうと した Systems Solution & Web Server Competence Center No.1 DM Group 19-20 2−3 デッドロックトイベント:出力の見方 どのクライアントと、どのクライアントで起こったのか? コネクションヘッダーイベントの確認 3) Connection Header Event ...(コネクションヘッダー) Appl Handle: 0 Appl Id: *LOCAL.DB2.010830152045 Appl Seq number: 0001 DRDA AS Correlation Token: *LOCAL.DB2.010830105525 Program Name : db2bp.exe (DB2コマンドプロセッサー) Authorization Id: DB2ADMIN Execution Id : DB2ADMIN Codepage Id: 943 Country code: 81 Client Process Id: 832 Client Database Alias: sample (SAMPLEデータベース) Client Product Id: SQL07020 Client Platform: Unknown Client Communication Protocol: Local (ローカルクライアント) Client Network Name: Connect timestamp: 08/30/2001 12:38:19.416275 4) Connection Header Event ...(コネクションヘッダー) Appl Handle: 1 Appl Id: *LOCAL.DB2.010830152046 Appl Seq number: 0001 DRDA AS Correlation Token: *LOCAL.DB2.010830135535 Program Name : db2bp.exe (DB2コマンドプロセッサー) Authorization Id: DB2ADMIN Execution Id : DB2ADMIN Codepage Id: 943 Country code: 81 Client Process Id: 1980 Client Database Alias: sample (SAMPLEデータベース) Client Product Id: SQL07020 Client Platform: Unknown Client Communication Protocol: Local (ローカルクライアント) Client Network Name: Connect timestamp: 08/30/2001 12:38:27.186339 このケースは Client Communication Protocol: Local となっていますので、サーバー内のアプリケーションでデッドロックが発生してい ます Client Communication Protocolが TCP/IPの場合、IPアドレスは application snapshot で知ることができます db2 get snapshot for all applications on データベース別名 でその時点のapplication snapshot をあらかじめ取得しておきます applicaiton snapshotには各アプリケーションのあるクライアントのIPアドレスが出力されます、これとAppl Id でつき合わせことでIP アドレスがわかります、今回の例にはのっていません Systems Solution & Web Server Competence Center No.1 DM Group 2−3 デッドロックイベント:再現させたSQLの流れ このケースでの発生原因(分離レベルCS) Appl Id: FROM *LOCAL.DB2.010830152046 1)DELETE EMPLOYEE WHERE EMPNO='000010' 削除行にXロック EMPNOに索引あり 3)SELECT COUNT(*) FROM EMPLOYEE WHERE SALARY = 1000.00 索引の無い列Salaryの検索のために全件読み、 2)のXロックへを待つ Appl Id: *LOCAL.DB2.010830152045 2)DELETE FROM EMPLOYEE WHERE EMPNO='000340' 削除行にXロック EMPNOに索引あり 4)SELECT COUNT(*) FROM EMPLOYEE WHERE SALARY = 2000.00 索引の無い列Salaryの検索のために全件読み、 1)のXロックを待つ デッドロックを発生させる流れは次の通り 1)左のアプリケーションでEMPLYEE表のキー000010をautocommit off でDELETEする 2)右のアプリケーションでEMPLYEE表のキー000340をautocommit off でDELETEする 3)左のアプリケーションでEMPLYEE表のSALARY = 1000.00 の条件を満たす行数をautocommit off で SELECTする SALARYには索引が無いので全行読んで調べるしかなく、1)で右が更新した行を読むためにNSロックを獲得しようとする、この時、 右側のアプリケーションのDELETEによるXロック(Exclusive Lock)は保持されたままなのでロック待ちとなる NSロックは分離レベルCSでCommitずみの値を読むために要求される 4)右のアプリケーションでEMPLYEE表のSALARY = 2000.00 の条件を満たす行数をautocommit off で SELECTする SALARYには索引が無いので全行読んで調べるしかなく、2)で左が更新した行を読むためにNSロックを獲得しようとする、この時、 左側のアプリケーションのDELETEによるXロック(Exclusive Lock)は保持されたままなのでロック待ちとなる NSロックは分離レベルCSでCommitずみの値を読むために要求される 5)左右ともロック待ちが解けないため、デッドロックが成立する Systems Solution & Web Server Competence Center No.1 DM Group 21-22 2−4 イベントモニター補足事項 イベントモニターの消去 db2 drop event monitor for ev1 DB20000I SQL コマンドが正常に終了しました。 登録したイベントモニターを削除します イベントモニターの再収集 drop event monitor していなければ 何度でも "活動化、再現テスト、非活動化 、編集出力" を繰り返すことができます。 参照情報記載場所 CREATE EVENT MONITOR 他 db2evmon イベントモニター出力の解説 出力編集サンプルプログラム SQL 解説書 コマンド解説書 システムモニター手引きおよび解説書 sqllib¥samples¥c¥ evm.c evmread.c evmprint.c Systems Solution & Web Server Competence Center No.1 DM Group ブランクページ 23-24 3 db2diag.log ファイルの利用:概要 db2diag.log ファイルの概要 db2diag.logはDB2が情報を記録するASCIIファイル 記録内容 BACKUP / RESTORE などデータベース管理事象のログ エラー情報 エラーの理由を示すDIAメッセージ エラーSQLCODE データベースのクラッシュ時の情報、ダンプファイル、トラップファイル ファイルの場所 データベースマネジャー構成パラメーターDB2DIAGPATHディレクトリー 省略時:Windows SQLLIB¥DB2 ディレクトリー Unix インスタンスオーナーのホームディレクトリーの sqllib/db2dump 記録方法 常に最後に追加される タイムスタンプ付き 単調増大するため定期的に保存・削除が必要 DIAGLEVELパラメータによる記録レベル指定(0−4、省略時3) DB2 EE/WE/PEでは3を推薦 4はinformationalメッセージが必要な場合に使用 DB2 EEE本番システムでは3を推薦 4ではNFS共有ファイルへの書き込みのためパフォーマンスダウンの影響 DIAGPATHをNFSからローカルdiskに代えれば4も現実的 Systems Solution & Web Server Competence Center No.1 DM Group 解説:3 db2diag.log ファイルの利用:概要 db2diag.logファイルはdb2が情報を記録するasciiファイルです。記録内容には2種類ありま す。ひとつはデータベースのバックアップ・リストアなのデータベース管理の事象の記録で す。もうひとつは発生したエラーに関する情報です。DIAではじまるメッセージコードでエ ラーの理由を説明する診断メッセージが書かれ、あわせてSQLCODEや発生したダンプ ファイルやトラップファイルを示します。 db2diag.logファイルはDB2DIAGPATHデータベースマネジャー構成パラメータの示すディレ クトリーに書かれます。省略時ではWindowsでsqllib¥db2 ディレクトリーにUnix/Linuxでは インスタンスオーナーのホームディレクトリーのsqllib/db2dumpディレクトリーです。 ファイルは常に最後に追加して書かれます。ファイルは単調増大するため、定期的に保 存し削除する運用が必要です。メッセージにはタイムスタンプが付加されていて事象の発 生時刻がわかります。 データベース構成パラメータのDIAGLEVELパラメータ(0から4まで)により記録される情 報のレベルが変わります。省略時は3でwarningまで記録されますが、4にするとより多く、 informationalメッセージまで記録されます。DB2 EEではレベル4ではかなり情報量が多い ためレベル3を推薦します。DB2 WE/PEも同様です。 DB2 EEEでは省略時ではdb2diag.logファイルはNFS共有ファイルであるため書き出し量の 多いレベル4ではパフォーマンスダウンを起こしえます。このため本番システムではレベ ル3を推薦します。レベル4を使いたい場合はDIAGPATHディレクトリーをNFSでなくローカ ルディスクへ変更することを推薦します Systems Solution & Web Server Competence Center No.1 DM Group 25-26 3 db2diag.log ファイルの利用:ロックエスカレーション ロックエスカレーション事象の確認 ロックエスカレーションが発生した時刻や表名、ロックタイプ等を知ることができます ロックエスカレーションの発生はSNAPSHOTモニターのデータベース スナップショットのLock escalations(ロックエスカレーショ ン発生回数)やExclusive lock escalations(Xロックのロックエスカレーション回数)を見てわかります。 db2diag.logを参照すれば時刻、表、該当Applid 等、より詳しい情報が把握できます DIAGLEVELは3で記録されます,DIAGLEVEL4ではさらにロックエスカレーションを起こした動的SQL文も表示されます 2001-09-05-08.48.38.752000 Instance:DB2 Node:000 PID:852(db2syscs.exe) TID:1164 Appid:*LOCAL.DB2.010904234838 data_management sqldEscalateLocks Probe:2 Database:TEST1 ----- Lock Count, Target : 1253, 626 Table (ID) Name : (2;6) DB2ADMIN.T1 Locks, Request Type : 1251, X Result (0 = success): 0 タイムスタンプ ロックエスカレーション事象 表名:DB2ADMIN.T1 Xロック(Exclusive ロック) Systems Solution & Web Server Competence Center No.1 DM Group 3 db2diag.log ファイルの利用:ロックタイムアウト ロックタイムアウト事象の確認 ロックタイムアウトの発生はSNAPSHOTモニターのデータベース スナップショットでのLock Timeouts(ロックタイムアウト発生回 数)を見てわかります db2diag.logを参照すれば時刻、該当Applid 等、より詳しい情報が把握できます 前提DIAGLEVELは4で記録されます 行のXロック要求がロックタイムアウト発生した例 表のIXロック要求がロックタイムアウト発生した例 2001-09-05-09.09.36.370000 Instance:DB2 Node:000 PID:848(db2syscs.exe) TID:1848 Appid:*LOCAL.DB2.010905000925 lock_manager sqlplnfd Probe:80 Database:TEST1 2001-09-05-09.08.40.931000 Instance:DB2 Node:000 PID:848(db2syscs.exe) TID:1848 Appid:*LOCAL.DB2.010905000830 lock_manager sqlplnfd Probe:80 Database:TEST1 Request for lock "REC: (2, 6) RID 00000939" in mode "..X" timed out Application caused the lock wait is "*LOCAL.DB2.010905000654" Package name: CURSOR2 パッケージ名 セクション番号 Section: 2 Request for lock "TAB: (2, 6)" in mode ".IX" timed out Application caused the lock wait is "*LOCAL.DB2.010905000654" Package name: CURSOR2 パッケージ名 セクション番号 Section: 1 Systems Solution & Web Server Competence Center No.1 DM Group 27-28 3 db2diag.log ファイルの利用:ロックタイムアウト db2diag.logに載っているロックタイムアウトを起こしたパッケージ名とセクション名から、該当する静的SQLプログラムのSQL文を調査 してみましょう。今回はDB2のカタログ視点からSQL文を調べてみます。 前ページ左の行のXロック要求がロックタイムアウトした例はパッケージCURSOR2のセクション2でしたが、これはUPDATE文で あることがSYSCAT.STATEMNTSをSELECTすることによりわかります このケースではロックタイムアウトの再現操作としてコマンドラインプロセッサーから次のSQLを発行しました db2 +c DELETE FROM T1 WHERE C1=1000 前ページ右の表のIXロック要求がロックタイムアウトした例はパッケージCURSOR2のセクション1でしたが、これはSELECT文で あることがSYSCAT.STATEMNTSをSELECTすることによりわかります。実際のコーディング上のステートメントはこの SELECT文に対するOpen cursor 文でロックタイムアウトが発生します。 このケースではロックタイムアウトの再現操作としてコマンドラインプロセッサーから次のSQLを発行しました db2 +c LOCK TABLE T1 IN EXCLUSIVE MODE カタログ視点を使うとBINDされたパッケージのSQL文を実際に見ることができて確実です。一方、db2bfdユーティリティは使わ れたバインドファイルが確実にわかっているなら、データベースに全く影響を与えずにSQL文を調査できる利点があり ます select pkgname, sectno, substr(text,1,128) as sql from syscat.statements where pkgname='CURSOR2' PKGNAME SECTNO SQL -------- ------ ---------------------------------------------------------CURSOR2 1 SELECT c1, c2 FROM t1 FOR UPDATE OF c2 CURSOR2 2 UPDATE T1 SET C2=C2+1 WHERE CURRENT OF C1 セクション1のSQL セクション2のSQL 2 レコードが選択されました。 Systems Solution & Web Server Competence Center No.1 DM Group 3 db2diag.log ファイルの利用:デッドロック デッドロック事象の確認 デッドロックの発生はSNAPSHOTモニターのデータベース スナップショットのDeadlock Detected(デッドロック検知した回数)を 見てわかります db2diag.logを参照すれば時刻、Rollbackした動的SQL、要求されていたロックタイプ等、詳しい情報が把握できます DIAGLEVELは4で記録されます 2001-09-05-09.23.21.457000 Instance:DB2 Node:000 PID:1856(db2syscs.exe) TID:1196 Appid:*LOCAL.DB2.010904121913 lock_manager sqlplnfd Probe:80 Database:SAMPLE Rollbackした側 NSロック要求待ちで デッドロックになった Request for lock "REC: (2, 6) RID 0000001B" in mode ".NS" failed due to deadlock 相手のAppli Id Application caused the lock wait is "*LOCAL.DB2.010905002035" Statement: 7365 6c65 6374 2063 6f75 6e74 282a 2920 select count(*) 6672 6f6d 2065 6d70 6c6f 7965 6520 7768 from employee wh ロールバックしたSQL 6572 6520 7361 6c61 7279 3d30 ere salary=0 Systems Solution & Web Server Competence Center No.1 DM Group 29-30 4 CLIトレース:概要 CLI(コールレベルインターフェース)の概要 CLIとDB2 Jdbc, ODBC, VB ADO, IBM native OLEDBプロバイダーなどはDB2へSQLを発行す るインターフェースとしてCLI(コールレベルインターフェース)を使っていま す。それぞれのプログラミングの結果がCLIのインターフェース変換されて DB2へ要求されます CLIはマイクロソフト社が提唱したODBCをもとに国際標準となったSQL/CLIプログラ ミングインターフェースです。 DB2は国際標準SQL/CLIとODBC両方をサポートしています。DB2アプリケーション プログラミングはCLIプログラミングと埋め込みSQLプログラミングの2つに 大別されます CLIの特徴 CLIにはODBCの特徴でもあるデータベースの一覧を得るAPIや表の一覧を得るAPI が備わっています。CLIプログラミングでは表の一覧を得るために、データ ベースのカタログ表の名前や列名を知る必要がありません。 埋め込みSQLプログラミングのようなアプリケーションプログラムのプリコンパイルは 必要ありません。その代わりに、実行時に動的に必要な処理を行います。 例えばアプリケーションプログラムがSELECT文を発行したら、結果を受け 取る前にアプリケーションプログラムは、DB2に、”わたしが出したSELECT 文の結果は何列ありましたっけ?”とか”1番目の列は列タイプは何で、長さ はいくらでしたっけ?”、”二番目の列は......"のように動的に列属性に応じた 処理をアプリケーションプログラムで行います。このためCLIのAPIは50個程 度もあり、トレースも各列ごとにエントリーがあるためかなり長いものとなりま す。 CLIトレースの用途 JdbcやVB ADOからのプログラミングで予定外の事象が発生した場合はDB2へと CLIアプリケーションプログラムの接点でのなりゆきを示すCLIトレースの解 析が役立ちます 以下で資料の取り方と着眼点を紹介しましょう Systems Solution & Web Server Competence Center No.1 DM Group ブランクページ 31-32 4-1 CLIトレースの収集方法 CLIトレース収集の指定 CLIはアプリケーションプログラムとDB2クライアントの接点となるインターフェースです。トレース収集 の指定はDB2クライアント機に行います。 以下はWindows 2000での指定です。Unix/Linux の場合は環境にあわせたディレクトリー名を指 定し、DB2のインスタンスから書き出せるようにパーミッションを指定してください CLIアプリケーションの動くクライアントPCやクライアントインスタンスのdb2cli.iniファイルを編集します sqllib¥db2cli.ini (Windowsの場合) sqllib/cfg/db2cli.ini (Unix/Linuxの場合) [COMMON] TRACEPATHNAME=C:¥CLITRACE TRACE=1 TRACEFLUSH=1 説明 TRACEPATHNAME CLIトレースを書き出すディレクトリーを指定します マルチスレッドアプリケーションではスレッドごとにファイルができます TRACE=1 CLIトレースを掛けることを指定します TRACEFLUSH=1 トレースを同期的にディスクへ書き出す指定です、同期的書き出しの方がトレース収集のも れがないので安心です コメント化の方法 ;TRACE=1 のように先頭に; を付加すればコメントになります 指定のタイミング db2cli.ini ファイルを変更した後に、アプリケーションをデータベースへの接続から始めてください Systems Solution & Web Server Competence Center No.1 DM Group 4-2 CLIトレース調査例 例題:ストアードプロシージャビルダーで"ソース取得"がエラー ストアードプロシージャビルダーで開発したストアードプロシージャのソースはDB2カタログに格納され ます。ストアードプロシージャビルダーを終了して次に開発の続きを行う場合はソースの取得という操 作でソースプログラムを呼び出します この問題をCLIトレースで判別します、CLIトレースをエラーの起こるPCと正常のPCの両方で取得しま す ストアードプロシージャビルダーはJava jdbcアプリケーションです、jdbcドライバーはdb2へCLIの インターフェースでSQL発行します Systems Solution & Web Server Competence Center No.1 DM Group 33-34 4-2 CLIトレース調査例 トレース取得操作 db2cli.ini にトレース取得のパラメータをセットします ストアードプロシージャビルダーを起動し、再現する直前まで操作します 再現直前時点のトレースファイルコピー(参考) CLIトレースは多量に出力されるのでエラー個所を特定するためには"エラー発生前"のトレース範囲を知っておくと絞り込みが容 易です 参考のため、再現直前の段階でトレースディレクトリーに書かれたトレースファイルを別のディレクトリーにコピーしておきましょ う。 再現操作 エラーが起きる操作を行って、エラーを再現させます 再現直後のトレースファイルコピー エラー発生以降のエントリーができるだけ含まれないようにすみやかにコピーしましょう db2cli.ini修正 db2アプリケーション開始 再現直前まで操作 トレースコピー 再現前 トレース 注目 個所 再現 トレースコピー 再現後 トレース Systems Solution & Web Server Competence Center No.1 DM Group 4-2 CLIトレース調査例 トレースファイルの確認 再現直前にコピーしておいたトレースファイルと再現直後にコピーしたトレースファイルを比べると次のことがわかります ファイル数が、3個から4個に増えている 1564.2のファイルの大きさが増えて最終更新時刻が1分あとに変わっている 1564.3のファイルが再現後、新規に増えている このことから、問題のエラーの個所は1564.2のファイルの437バイト目より後、か1564.3ファイルに載っていると絞込むことができます 注目個所 C:¥CLITRACE¥0906-1 のディレクトリ 2001/09/06 2001/09/06 2001/09/06 2001/09/06 2001/09/06 06:23 <DIR> . 06:23 <DIR> .. 06:22 39,181 1564.0 06:23 140,560 1564.1 06:23 437 1564.2 3 個のファイル 180,178 バイト 再現直後 トレース C:¥CLITRACE¥0906-2 のディレクトリ 2001/09/06 2001/09/06 2001/09/06 2001/09/06 2001/09/06 2001/09/06 06:24 <DIR> 06:24 <DIR> 06:22 06:23 06:24 06:24 4 個のファイル 188,334 バイト Systems Solution & Web Server Competence Center No.1 DM Group 35-36 39,181 140,560 611 7,982 . .. 1564.0 1564.1 1564.2 1564.3 注 目 個 所 再現直前 トレース 4-2 CLIトレース調査例 エラーメッセージ発生個所の確認 1564.3ファイルで SQL_ERROR を検索してみましょう、CLIプログラムでエラーメッセージが返される場合には必ずSQL_ERROR戻りコー ドが返ります ここではSQLGetDataInternal(列からのデータの取り出し)要求に対してSQL_ERRORが返っています、次にこのSQL_ERRORが問 題のCLI0150Eメッセージ、SQLSTATE=HYC00になったのかどうか確認しましょう 再現直後 トレース 2001/09/06 2001/09/06 2001/09/06 2001/09/06 2001/09/06 2001/09/06 06:24 <DIR> 06:24 <DIR> 06:22 06:23 06:24 06:24 4 個のファイル 188,334 バイト 39,181 140,560 611 7,982 . .. 1564.0 1564.1 1564.2 1564.3 注 目 個 所 C:¥CLITRACE¥0906-2 のディレクトリ SQL_ERROR という文字を検索 CLI関数名 SQLDescribeColW( hStmt=1:2, iCol=1, pszColName=NULL, cbColNameMax=0, pcbColName=NULL, pfSQLType=&0ab2fb08, pcbColDef=&0ab2fb0c, pibScale=NULL, pfNullable=NULL ) ---> Time elapsed - +6.798000E-003 seconds 要求 SQLDescribeColW( pfSQLType=SQL_LONGVARCHAR, pcbColDef=10485760 ) <--- SQL_SUCCESS Time elapsed - +8.699900E-002 seconds 応答 SQLGetDataInternal( hStmt=1:2, iCol=1, fCType=SQL_C_WCHAR, prgbValue=&0ab2fb48, cbValueMax=20971522, pcbValue=&0ab2fb54 ) ---> Time elapsed - +6.043000E-003 seconds 要求 SQLGetDataInternal( ) <--- SQL_ERROR Time elapsed - +5.761200E-002 seconds 応答 Systems Solution & Web Server Competence Center No.1 DM Group 4-2 CLIトレース調査例 エラーメッセージ発生個所の確認 エラーメッセージはSQL_ERROR戻りコードが返った後にアプリケーションプログラムからのエラーメッセージ取り出し要求に返されます。 下の例ではSQL_ERRORの発生後、2組の診断データ構造フィールドの要求・応答の後、アプリケーションがDB2へエラー情報を要 求し、DB2からエラーメッセージコード、SQLSTATE、SQLCODEが返されています CLI関数名 前ページより SQLGetDataInternal( ) <--- SQL_ERROR Time elapsed - +5.761200E-002 seconds SQLGetDiagFieldW( fHandleType=SQL_HANDLE_STMT, hHandle=1:2, iRecNumber=1, fDiagIdentifier=Unknown value 2467, pDiagInfo=&0ab2f9e4, cbDiagInfoMax=140, pcbDiagInfo=&0ab2fa92 ) ---> Time elapsed - +6.737000E-003 seconds SQLGetDiagFieldW( pDiagInfo=1650747904, pcbDiagInfo=0 ) <--- SQL_SUCCESS Time elapsed - +7.845800E-002 seconds SQLGetDiagFieldW( fHandleType=SQL_HANDLE_STMT, hHandle=1:2, iRecNumber=1, fDiagIdentifier=Unknown value 2461, pDiagInfo=&0ab2fa80, cbDiagInfoMax=4, pcbDiagInfo=&0ab2fa92 ) ---> Time elapsed - +6.226000E-003 seconds SQLGetDiagFieldW( pDiagInfo=0, pcbDiagInfo=0 ) <--- SQL_SUCCESS Time elapsed - +7.465700E-002 seconds SQLErrorW( hEnv=0:0, hDbc=0:0, hStmt=1:2, pszSqlState=&0ab2fa70, pfNativeError=&0ab2fa7c, pszErrorMsg=&0ab2f1e0, cbErrorMsgMax=1024, pcbErrorMsg=&0ab2fa86 ) DB2へエラー情報の取り出し要求 ---> Time elapsed - +6.685000E-003 seconds SQLErrorW( pszSqlState="HYC00 at " - X"4800590043003000300000006179FEFF00000000", pfNativeError=-99999, pszErrorMsg="[IBM][CLI Driver] CLI0150E EeDuL(gM [・ SQLSTATE=HYC00" - X"5B00490042004D005D005B0043004C0049002000440072006900760 0650072005D00200043004C0049003000310035003000450020002000C930E930A430D030FC 304C307F4F287567304D307E305B30933002302000530051004C00530054004100540045003D0048005900430030003000", pcbErrorMsg=57 ) <--- SQL_SUCCESS Time elapsed - +9.428800E-002 seconds DB2からのエラー情報応答 Systems Solution & Web Server Competence Center No.1 DM Group 37-38 4-2 CLIトレース調査例 エラー発生個所のまとめ "どんな要求に対してどんなエラーメッセージが返されたのか?" トレースの第一次分析はここまでで十分です。前の2ページでわかったことをまとめてみましょう SQLGetDataInternal(列の値の取り出し)要求に対して、戻りコードSQL_ERROR が返された、 エラーメッセージはCLI0150E SQLSTATEは HYC00, SQLCODE は -99999 次に何をするか? エラーメッセージだけでは、"何をやったら"がわからなくて"どうなったか"だけしかわかりません。 CLIトレースによって"何をやったら"の流れが始めからわかります。 エラー発生より上を見て行く。 このトレースの上を見ていけば原因は究明できるはずです。それには流れを追うためにCLIのプログラミングの知識が必要です。 幸いCLIはODBCとISO のSQL/CLI の標準に準拠していますから、それらのプログラミングの経験者の方にも追いやすい ものです。 正常に動くトレースと比較する 正常ケースのトレースと比較して違いを見つければ、あまりプログラミング知識がなくても原因がわかるでしょう。 正常ケースとの環境の違いを見つける db2cli.iniの指定の違いなど、プログラムの外にある環境の違いでプログラムの動き方は変わります。db2cli.iniの指定はデータベー スのコネクションの際にトレースに載りますから、トレースを見ても違いがわかります。 サポート部門への問い合わせ、事例照会 ここまで資料がとれればIBMアンサーラインセンターなど専門の部門で追求ができるでしょう、また同様の事例検索のためのキー ワードもメッセージより多く得られたので問題事例照会も精度が上がるでしょう。これ以降の追及手順は付録に載せます。 Systems Solution & Web Server Competence Center No.1 DM Group ブランクページ 39-40 5 db2trc db2trcの概要 概要 db2エンジンの動作の流れをトレース イベントモニターfor STATESMENTS や CLIトレースはアプリケーションプログラムから見たDB2への要求と応答の流れが載るもの でした。これに対しdb2trcはdb2のエンジン内部の動きをトレースするツールです。 出力情報は非公開 db2trcの出力ファイルは読み方が公開されていません。アンサーラインセンターから要求されたら取得し、出力ファイルを送付しま す。 注意点 トレースは多量に出力されます、トレース収集は再現用のシステムを占有使用して、必要最小限の操作だけ行うのが現実的です トレース収集は負荷のかかるため一般に、本番システムはサービス停止中に行うか別のシステムで再現させて収集します 必要な権限はSYSADM SYSCTRL SYSMAINT です DB2 EEE ではそれぞれのノードでトレース収集を実行する必要があります 取得手順 トレース取得手順はアンサーラインセンターから毎回具体的に指示されます。ここでは一例を紹介します。 コマンドの仕様はコマンド解説書に記述されています db2trc on -e -1 -l 16000000 トレースを開始します -e -1 はエラーが何個発生してもトレースを停止しない -l はトレースバッファーサイズです 問題を再現する db2trc dump trace.dat メモリー上のトレースをファイルに書き出します db2trc off トレースを止めます db2trc fmt trace.dat trace.fmt トレースのバイナリーファイルをフォーマットします、トレースがwrapしていないことをメッセージで確かめます wrapしていたら、始めの部分が上書きされて残っていません、トレースバッファーサイズを大きくするか、または 手際よく、早く操作してとりなおしましょう db2trc flw trace.dat trace.flw フォーマットされたトレースがうまくとれていたら、トレースの流れのサマリーをあらわすflow トレースファイルを出力 しましょう Systems Solution & Web Server Competence Center No.1 DM Group 5 db2trc db2trcの利用例 db2問題判別の手引きより 問題:DB2を起動してアプリケーションからデータベースへCONNECTするとSQL1042C "予期しないシステムエラーが発生しました"の メッセージで全くCONNECTできない db2diag.log に情報があるが詳細が不明 SQL1042Cの"メッセージのユーザーの応答":"データベースの接続中にエラーが起きた場合はトレースを取得(以下に指示があり ます)して、IBMサポートに連絡してください " db2diag.logメッセージ 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) db2trcのfmt出力 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 Systems Solution & Web Server Competence Center No.1 DM Group 41-42 db2diag.log のメッセージ 0ae6 ffff はWindowsではバイト反転しているため 実際は FFFF E60A です E60A は 問題判別の手引き:付録A DB2 Internral Reuturn Codesの表ではFile does not exist です どんなファイルが存在しなかったのか?ファイル名 まではdb2diag.logには載っていません db2trcのトレース出力 trace.fmt から e60a または E60A を検索すると トレースの3480番に0xffffe60a が見つかります これはOSのサービスsqloopenp の戻りコードです が、上へたどると/DB2/SQL00001/SQLT0002.0 /SQL00010.DAT ファイルを処理していることがわ かります。この処理の結果ファイルが見つからない メッセージが返されました ファイルの存在やUnix/Linuxならファイルのパー ミッションを確認し、もし本当になければ、データ ベースのバックアップをrestoreしてend of log まで rollforwardすればこのファイルも回復できるでしょう 終わりに その他のツール 参照情報 DB2問題判別の手引き 第16章トレース Administration Tools Trace コントロールセンター、アラートセンター、コマンドセンターなど管理ツールのトレースを収集します ddcsトレース DB2 Connectのトレースです。ホストDB2への接続時の問題判別に有効です。DB2 Connect使用者の手引きに使い方があります db2drdat DRDA 接続時に交換されるデータストリーム上の問題判別やパフォーマンスチューニングに有効です SNAトレース SNA接続のホストDB2との通信に関してDB2がSNAアラートを生成する機能です 同様にDB2はSNMPアラートも生成します CLIトレースのその他のトレース用キーワード TRACECOMM=0|1 1でCLI要求・応答がネットワークを通った情報が載ります TRACETIMESTAMP= 3 タイムスタンプ(秒)がトレースに載ります 2 年月日秒マイクロ秒がトレースに載ります 1 タイムスタンプ(秒)と年月日秒マイクロ秒の両方がトレースに載ります TRACEPIDTID=0|1 1 プロセスIDとスレッドIDがトレースに載ります JDBCトレース JDBCメソッドについてのトレースを収集します、db2cli.iniに以下のパラメータを指定します JDBCTRACE=1 JDBCTRACEPATHNAME=C:¥CLITRACE JDBCFLUSH=1 ODBCドライバーマネジャートレース ODBCドライバーマネジャートレースはアプリケーションがODBCドライバーマネジャーを呼び出す部分のトレースです (ODBCの場合CLIトレースはその後に、ODBCドライバーマネジャーからDB2クライアントが呼び出された部分のトレースです) これについてははMicrosoft ODBC3.0 SDKプログラマーズレファレンスを参照してください OSその他のトレース アプリケーションサーバーとデータベースサーバー間の問題判別の際にOSの持つIPトレースの機能やスニファーなどネットワーク上 のトレースツールが有効な場合もあります。 Systems Solution & Web Server Competence Center No.1 DM Group 付録 CLIトレースの追求例 着眼点:列値を取り出そうとしてエラーとなった元のSELECT文はどんなものか? この操作はステートメントハンドル1:2を使ってSQLを発行して結果を操作しています、トレースを上にたどり、ステートメントハンドル1:2が (フリーされ再割り振りされたりせずに)有効な範囲でステートメントハンドル1:2のSQL文を探すとSELECT文のPrepareが見つかります SQLPrepareW( ) <--- SQL_SUCCESS 応答 上へたどる CLI関数名 SQLPrepareW( hStmt=1:2, pszSqlStr="select class_source from sysibm.sysjarcontents where jarschema = ? and jar_id = ? and class = ?" X"730065006C00650063007400200063006C006100730073005F0073006F0075007200630065002000660072006F006D0020007300 79007300690062006D002E007300790073006A006100720063006F006E00740065006E007400730020007700680065007200650020 006A006100720073006300680065006D00610020003D0020003F00200061006E00640020006A00610072005F006900640020003D0 20003F00200061006E006400200063006C0061007300730020003D0020003F00", cbSqlStr=95 ) ---> Time elapsed - +3.798000E-003 seconds 要求 ( StmtOut="select class_source from sysibm.sysjarcontents where jarschema = ? and jar_id = ? and class = ?" ) Time elapsed - +3.589300E-002 seconds 中略 CLI関数名 SQLDescribeColW( hStmt=1:2, iCol=1, pszColName=NULL, cbColNameMax=0, pcbColName=NULL, pfSQLType=&0ab2fb08, pcbColDef=&0ab2fb0c, pibScale=NULL, pfNullable=NULL ) ---> Time elapsed - +6.798000E-003 seconds 要求 SQLDescribeColW( pfSQLType=SQL_LONGVARCHAR, pcbColDef=10485760 ) <--- SQL_SUCCESS Time elapsed - +8.699900E-002 seconds 応答 SQLGetDataInternal( hStmt=1:2, iCol=1, fCType=SQL_C_WCHAR, prgbValue=&0ab2fb48, cbValueMax=20971522, pcbValue=&0ab2fb54 ) ---> Time elapsed - +6.043000E-003 seconds 要求 SQLGetDataInternal( ) <--- SQL_ERROR Time elapsed - +5.761200E-002 seconds 応答 Systems Solution & Web Server Competence Center No.1 DM Group 43-44 問題の SELECT文 付録 CLIトレースの追求例 着眼点:問題のSELECTの列1はどんなものか? 表名がsysibm.sysjarcontents で問題の列名がclass_sourceであることがわかりましたからDESCRIBE TABLEコマンドで CLASS_SOURCE列の列属性がわかります 一方、問題発生直前のSQLDescribeCol関数は(第一列の)列属性をDB2に聞くためのものですが、ここではlong型10485760バイ トとDB2から返されていますこの不一致はなぜでしょう? SQLPrepareW( hStmt=1:2, pszSqlStr="select class_source from sysibm.sysjarcontents where jarschema = ? and jar_id = ? and class = ?" (途中省略) ---> Time elapsed - +3.798000E-003 seconds 要求 問題の SELECT文 ( StmtOut="select class_source from sysibm.sysjarcontents where jarschema = ? and jar_id = ? and class = ?" ) CLASS_SOURCE列 SQLPrepareW( ) CLOB(10485760) <--- SQL_SUCCESS Time elapsed - +3.589300E-002 seconds 応答 中略 不一致? SQLDescribeColW( hStmt=1:2, iCol=1, pszColName=NULL, cbColNameMax=0, pcbColName=NULL, pfSQLType=&0ab2fb08, pcbColDef=&0ab2fb0c, pibScale=NULL, pfNullable=NULL ) ---> Time elapsed - +6.798000E-003 seconds 要求 SELECTの第一列(CLASS_SOURCE列) LONG VARCHAR型 10485760バイト SQLDescribeColW( pfSQLType=SQL_LONGVARCHAR, pcbColDef=10485760 ) <--- SQL_SUCCESS Time elapsed - +8.699900E-002 seconds 応答 SQLGetDataInternal( hStmt=1:2, iCol=1, fCType=SQL_C_WCHAR, prgbValue=&0ab2fb48, cbValueMax=20971522, pcbValue=&0ab2fb54 ) ---> Time elapsed - +6.043000E-003 seconds 要求 SQLGetDataInternal( ) <--- SQL_ERROR Time elapsed - +5.761200E-002 seconds 応答 Systems Solution & Web Server Competence Center No.1 DM Group 付録 CLIトレースの追求例 注意点:真の原因は問題発生点よりずっと前に存在しうる このケースの原因はdb2cli.iniにLONGDATACOMPAT=1 という指定があったためでした。正常ケースと異常ケースを比較すると4つに分かれたトレースファイル の最初のファイル1564.0 にあるデータベースへの接続のパラメータにLOGNDATACOMPAT=1が追加されていることがわかります。この指定によりCLOBなど ラージオブジェクトをサポートしないアプリケーションのためにCLOBをLONG VARCHARとして見せる変換が働き、アプリケーションには列1の属性がLONG VARCHAR型として返されました。しかしLONG VARCHARはもともと32700バイトまでしか許されないため、今回のような10485760バイトでは"CLI0150Eドライ バーが使用できません"エラーとなりました。パラメータをはずせば解決です。 最初のトレースファイルのデータベース接続部分 connect 要求 connect 応答 SQLDriverConnectW( hDbc=0:1, hwnd=0:0, szConnStrIn="DSN=TEST1;UID=db2admin;PWD=********", cbConnStrIn=35, szConnStrOut=NULL, cbConnStrOutMax=0, pcbConnStrOut=NULL, fDriverCompletion=SQL_DRIVER_NOPROMPT ) ---> Time elapsed - +9.634000E-003 seconds ( DBMS NAME="DB2/NT", Version="07.02.0000", Fixpack="0x23010105" ) ( Application Codepage=943, Database Codepage=943, Char Send/Recv Codepage=943, Graphic Send/Recv Codepage=941, iGraphic Codepage=941 ) SQLDriverConnectW( ) <--- SQL_SUCCESS Time elapsed - +2.496622E+000 seconds ( DSN="TEST1" ) ( UID="db2admin" ) ( PWD="********" ) ( DBALIAS="test1" ) db2cli.iniから追加さ ( LONGDATACOMPAT="1" ) れたパラメータ db2カタログ 情報の属性 SQLDescribeCol関数でアプリケー ションに返された属性 CLASS_SOURCE列 CLOB(10485760) SELECTの第一列(CLASS_SOURCE列) LONG VARCHAR型 10485760バイト db2が列型を置き 換えて見せる 矛盾 DB2制限 LONG VARCHAR型 32700バイトま で Systems Solution & Web Server Competence Center No.1 DM Group 45-46 CLI0150Eドライバー が使用できません