問題判別の手引き

問題判別のヒント

この章では、DB2 サーバーにアクセスするアプリケーション開発者が直面することの多い問題を処理する方法について説明しています。 以下に挙げるアプリケーションの問題の予防と解決に関するヒントは、 DB2 カスタマー・サポートから入手した情報に基づいています。 DB2 カスタマー・サポートにお寄せいただいた問題の報告が、 以下のヒントを作成する上で役立っています。 この章では、以下のトピックを扱います。

DB2 エンタープライズ拡張エディションでのアプリケーションの開発も参照してください。

重要: DB2 に関する完全な最新情報については、DB2 Product and Service Technical Library (URL は http://www-4.ibm.com/software/data/db2/library/) を参照してください。 (この情報は英語のみですのでご注意ください。)

アプリケーションの開発

アプリケーションを開発する場合、以下のことを確認してください。

[ ]
組み込み SQL ステートメントが構文的および意味的に正しい。 可能であれば、SQL ステートメントをアプリケーションに埋め込むのは、 コマンド行プロセッサーを使用して手動で各 SQL ステートメントを順番に試行してみてからにしてください。 こうすることにより、安心して有効な SQL ステートメントを使用しながら、 必須の関数を実行することができます。

[ ]
SQL ステートメントを実行するのに必要な権限および特権を持っている。

[ ]
アプリケーションがロックを保持している時間が長過ぎない。 詳細については、ロック問題の診断を参照してください。

[ ]
静的 SQL ステートメントを発行する前に、アプリケーションをバインドしてある。 sqlabndx バインド API については、管理 API 解説書 を参照してください。

[ ]
DB2 に接続するアプリケーションに、SQL エラーを処理するためのコードを組み込んである。

DB2 アプリケーションは、 各 SQL ステートメントに続く SQLCA データ構造の SQLCODE または SQLSTATE 要素の値を検査することが必要です。 負の数の SQLCODE を検出した場合、 アプリケーション側で適切な処置をとる必要があります。 たとえば、アプリケーションは SQLCODE および SQLCA 構造を取り込んでおき、 後で分析できるようにしなければなりません。

デバッグが目的の場合、 sqlaintp() API は表示できるように形式化されたエラー・メッセージを提供します。 この API の使用方法の例については、 アプリケーション開発の手引き を参照し、以下のサンプル・プログラムを使用してください。

接続を終了させる結果になる負の数の SQLCODE は、DB2 診断ログ (db2diag.log) ファイルに記録されます。 また、データベース・モニター・アプリケーション ID は、 クライアントおよびアプリケーションを識別できるように、SQLCA とともにサーバーでログに記録されます。

[ ]
使用している変数のために十分なメモリーを提供している。

[ ]
コード・ページ変換を考慮に入れてある。

様々なオペレーティング・システムでデータを処理するためのプログラムを作成する場合、 使用することになる様々なコード・ページについて考慮に入れなければなりません。 詳細については、アプリケーション開発の手引き を参照してください。

[ ]
アプリケーションがユーザー定義関数、ストアード・プロシージャー、 分散作業単位またはマルチスレッド化を使用する場合、 アプリケーション開発の手引き およびコール・レベル・インターフェースの手引きおよび解説書 にあるガイドラインに従っている。

[ ]
前のリリースと互換性がある。

アプリケーションが DB2 の前のバージョンのレガシー・コードである場合、 管理の手引き: 計画 にある非互換性のリストを検討してください。

アプリケーションのコンパイルおよびリンク

コンパイル時に、以下のことを確認してください。

[ ]
コンパイラー環境が正しく、 すべての組み込みファイルおよび環境変数が最新のものである。 詳細については、コンパイラーの資料を参照してください。

[ ]
コンパイル・オプションが正しい。 サポートされているコンパイラーに特有の情報については、 アプリケーション構築の手引き を参照してください。

[ ]
コンパイラー・エラー・メッセージを受け取っていない。 (構文エラーがあれば、まずそれを訂正してから先に進んでください。)

リンク時に、以下のことを確認してください。

[ ]
リンク・オプションおよびリンク・ライブラリーが正しく定義されている。 詳細については、 アプリケーション構築の手引き で、ご使用のオペレーティング・システムの指示を参照してください。

アプリケーションの実行

実行時に問題が起きる場合、以下のことを確認してください。

[ ]
組み込み SQL ステートメントを含むパッケージに対する EXECUTE 特権、 およびすべての動的 SQL ステートメントに対する必須権限および特権を持っている。

[ ]
http://www-4.ibm.com/data/db2/java の IBM DB2 および Java ページにある、JDBC (Java データベース・コネクティビティー) および SQLJ (Java Embedded SQL) に関する情報をすでに調べてある。

[ ]
受け取ったすべてのエラー・メッセージについて調査した。 (たとえば、組み込み SQL ステートメント、DB2 API、 または CLI ステートメントがメッセージを戻すことがあります。)

[ ]
問題を見つけるために、 コマンド行プロセッサーから手動で組み込み SQL ステートメントを順番に実行する。 アプリケーション内のステートメントが実行されるものの、 間違った結果になってしまう場合には、この技法を試してみることをお勧めします。

[ ]
すべてのアプリケーション・エラーを解決する。 デバッガーが役立ちます。

[ ]
アプリケーションがロックを保持している時間が長過ぎない。 詳細については、ロック問題の診断を参照してください。

[ ]
CLI/ODBC/JDBC アプリケーションを使用している場合は、 CLI/ODBC/JDBC アプリケーションの使用にある考慮事項を検討する。

アプリケーションの中断またはループの診断

照会またはアプリケーションを開始した後、 アプリケーションが中断 (全く活動していないようであるため) またはループ (活動しているようではあるが、 結果がアプリケーションに戻されないため) ではないかと思われる場合があります。 この状態でシステムを再始動する方法については、 中断およびループに対する応答を参照してください。

システムを再始動した後、 ループまたは中断の原因となっているアプリケーションの問題を診断するのに、 以下のツールがきっと役立ちます。

また、ご使用のアプリケーションを修正して、 コードが中断またはループしている個所を突き止めるためのアプリケーション・ログ・ファイルを作成することも考慮できるでしょう。

CLI/ODBC/JDBC アプリケーションの使用

この節では、CLI/ODBC/JDBC アプリケーションに共通に関連する問題判別のヒントを扱います。

CLI/ODBC/JDBC アプリケーションの開発

CLI/ODBC/JDBC アプリケーションを開発する場合、以下のことに注意してください。

[ ]
CLI/ODBC/JDBC アプリケーションで既知の互換性の問題の修正モジュールを指定するには、PATCH1/PATCH2 キーワードを使用しなければなりません。 db2cli.ini ファイルを編集することによって、 または (OS/2、Windows 95、Windows 98、および Windows NT の場合)「クライアント構成アシスタント」にある「CLI/ODBC 設定 (CLI/ODBC Settings)」の「サービス (Service)」タブをクリックすることによってこのキーワードを設定してください。 このキーワードについては、インストールおよび構成 補足 を参照してください。

サーバーへの接続時に、CLI/ODBC/JDBC アプリケーションが失敗する

症状
DB2 サーバーへの接続時に、 Microsoft Query、Microsoft Access、またはロータス アプローチなどのアプリケーションが失敗します。 通常、SQL1003N メッセージを受け取るかまたは一般保護障害 (GPF) が発生します。

処置
以下のことを確認してください。

[ ]
DB2 CLI/ODBC ドライバーが正しく構成されている。

DB2 クライアント構成アシスタントを使用することによって、 ドライバーを構成することができます。

  1. 構成する DB2 データベース別名を選択する。
  2. 「プロパティー (Properties)」をクリックして、 「データベースのプロパティー (Database Properties)」ウィンドウを表示する。
  3. 「設定 (Settings)」をクリックして、 「CLI/ODBC 設定 (CLI/ODBC Settings)」ウィンドウを表示する。
  4. 「拡張 (Advanced)」をクリックする。 構成キーワードを設定できるウィンドウが表示されます。 特に、以下のことを確認してください。
    • ラージ・オブジェクト 2 進 (LOB) データにアクセスしている場合、LONGDATACOMPAT=1
    • 表名に下線 (_) がある場合、UNDERSCORE=0

あるいは、db2cli.ini ファイルを編集し、 接続しているデータベースの別名の後にリストされているパラメーターのリストにキーワードが表示されるようにしてください。 キーワードがそこにない場合、ファイルを編集し、別の行にそれらを追加してください。

注:CLI ドライバーをカスタマイズすると、一部のアプリケーションに障害が発生する可能性があります。 これには、DB2 Java ベースのユーティリティーの一部も含まれます。 それぞれの CLI/ODBC/JDBC ベースのアプリケーションに複数のデータベース別名を作成して、 各アプリケーションについてドライバー設定を独立して変更できるようにするとよいでしょう。

[ ]
DB2 CLI/ODBC ドライバーは、Lotus Approach、Microsoft Access、または Visual Basic 用に最適化されています。

DB2 クライアント構成アシスタントを使用することによって、 ドライバーを最適化することができます。

  1. 構成する DB2 データベース別名を選択する。
  2. 「プロパティー (Properties)」をクリックして、 「データベースのプロパティー (Database Properties)」ウィンドウを表示する。
  3. 「設定 (Settings)」をクリックして、 「CLI/ODBC 設定 (CLI/ODBC Settings)」ウィンドウを表示する。
  4. 「最適化 (Optimize)」押しボタンを選択する。 ウィンドウが表示され、この上部に表示されるアプリケーションのうち 1 つを選択します。 このアプリケーションについて、事前定義されたパッチ値および構成オプションを使用して、 CLI ドライバーが自動的に構成されます。

[ ]
Microsoft ODBC ドライバー・マネージャー互換ファイルがある。 これらのファイルを更新すると、GPF を解決することができます。

ODBC アプリケーションで作成された大文字小文字混合の名前が原因で障害が発生する

症状
DB2 では、 表名またはフィールド名は大文字小文字混合になります。 このような表名やフィールド名を、 特定の種類のアプリケーション (たとえば、ロータス アプローチなどの ODBC アプリケーション) で作成し、 その後で別の方式で (たとえば、DB2 コマンド行プロセッサーによって) これにアクセスしたとします。 この場合、表へのアクセスに問題の起こることがあります。 たとえば、SELECT * FROM table1 などの SQL ステートメントに対して、 次のようなエラー・メッセージが返されることがあります。

   SQL0204N "USERID.TABLE1" is an undefined name. SQLSTATE=42704

たとえ表が存在していても、このエラー・メッセージが返され、 コントロール・センターの表のリスト、 または LIST TABLES コマンドの出力に示されます。

また、列へのアクセスに問題の起こることがあります。 たとえば、SELECT column1 FROM table2 などの SQL ステートメントに対して、 次のようなエラー・メッセージが返されることがあります。

   SQL0206N "COLUMN1" is not a column in an inserted table, updated 
   table, or any table identified in a FROM clause or is not a valid 
   transition variable for the subject table of a trigger. 
   SQLSTATE=42703

このエラー・メッセージは、以下の条件が満たされる場合であっても戻されます。

  1. COLUMN1 が存在し、コントロール・センターに表示される。

    または

    SQL ステートメント SELECT tabname, colname FROM SYSCAT.COLUMNS WHERE tabname='ta-ble2' が、COLUMN1 に関する適切な情報を返す。

  2. SQL ステートメント SELECT * FROM table2 が、COLUMN1 列を含め、すべての列を返す。

この問題は、オブジェクトの作成時には大文字だけで名前を付けたのに、 オブジェクト名を指定するときには大文字小文字混合で、引用符を使った場合にも生じます。 たとえば、ステートメント SELECT * FROM "Org" も、 SQL0204N "USERID.Org" is an undefined name. SQLSTATE=42704. を返します。

推定原因
DB2 のオブジェクト名は、表名と列名を含め、大文字小文字混合です。 オブジェクト名は大文字小文字混合で、二重引用符に囲んで指定しなければなりません。 そうしないと、DB2 はその名前を大文字に変換します。

これは、CREATE TABLE および DROP TABLE ステートメントだけでなく、SELECT ステートメントを含む、すべての SQL ステートメントにあてはまります。

ロータス アプローチを含む、多くの ODBC アプリケーションは、 表名および列名の大文字小文字の区別を保持します。 ODBC アプリケーションで表を作成する時、 表名と列名を大文字小文字混合で指定すると、 次の SQL ステートメントが DB2 に送られます。

   CREATE TABLE "test1" ("col1" CHAR(5))

この場合、 表名と列名がそれぞれ二重引用符で囲まれているので、DB2 は名前を小文字で保持します。 名前を二重引用符で囲まずにこの表にアクセスしようとしても、 絶対に成功しません。

コントロール・センターでは、 大文字小文字が混在する名前のオブジェクトは、 二重引用符で囲まれて表示されます。

処置
ODBC アプリケーションを使用して DB2 表を作成する場合は、 表名と列名を大文字で指定してください。 そうすると、 二重引用符の有無に関係なくこれらの表または列にアクセスできるようになります。

表および列を大文字小文字混合で処理することが必要な場合は、 オブジェクト名をすべて二重引用符で囲んでください。

たとえば、以下のように表を作成すると、 その後の SELECT ステートメントは両方とも成功します。

   CREATE TABLE "User1"."Table1" ("column1" CHAR(5))
   SELECT * FROM "User1"."Table1"
   SELECT "column1" FROM "User1"."Table1"

ODBC アプリケーションの実行時に複数のエラー・メッセージと警告が表示される

症状
ロータス アプローチ、Microsoft Access、 または Powerbuilder などの ODBC (または CLI) アプリケーションを実行している時に、 エラー・メッセージまたは警告のダイアログ・ボックスがいくつか表示されます。 それぞれのダイアログ・ボックスの表題に、 エラーまたは警告を返した関数が示されています。

推定原因
これらのエラーおよび警告は、DB2 とアプリケーションの間の通常のやり取りの一部です。 必ずしも、DB2 またはアプリケーションに問題が生じたことを示すものではありません。

これらのエラーおよび警告は、 db2cli.ini ファイルで CLI/ODBC 構成キーワード POPUPMESSAGE が 1 に設定されている場合に表示されます。 このキーワードは、 「クライアント構成アシスタント」の「CLI/ODBC 設定 (CLI/ODBC Settings)」ノートブックからアクセスすることもできます。 「エラー・ポップアップ (Error popup)」パラメーターは、 「サービス (Service)」タブにあります。

処置
実動システムでは、CLI/ODBC 構成キーワード POPUPMESSAGE をゼロに設定する必要があります。

POPUPMESSAGE キーワードと db2cli.ini ファイルの詳細については、 コール・レベル・インターフェースの手引きおよび解説書 の『DB2 CLI/ODBC 構成キーワードのリスト』の節で、 『POPUPMESSAGE』の部分を参照してください。

クライアント構成アシスタント (ご使用のオペレーティング・システムで利用可能な場合) を使用して DB2 CLI/ODBC ドライバーを構成する手順は、 次のとおりです。

  1. DB2 クライアント構成アシスタントを開始する。
  2. 構成する DB2 データベース別名を選択する。
  3. 「プロパティー (Properties)」をクリックして、 「データベースのプロパティー (Database Properties)」ウィンドウをオープンする。
  4. 「設定 (Settings)」をクリックして、 「CLI/ODBC 設定 (CLI/ODBC Settings)」ウィンドウをオープンする。
  5. 「拡張 (Advanced)」をクリックする。
  6. 「サービス (Service)」タブをクリックし、 「エラー・ポップアップ (Error popup)」パラメーターを選択する。
  7. 「ポップアップ・エラー・メッセージ (Popup error message)」の横の「値 (Value)」セクションにチェック・マークが入っていないことを確認する。

更新を実行できない

ODBC アプリケーション (ロータス アプローチなど) の中には、 更新されるすべての表に固有の索引が定義されることを要求するものもあります。 これらのアプリケーションの場合、 更新しようとしている表に対する基本キーまたは固有索引を作成する必要があります。 そうしなければ、操作が実行できないことを示すエラーを受け取ります。

詳細については、 アプリケーション開発の手引き および  http://www-4.ibm.com/software/data/db2/db2lotus/ の DB2/Lotus Approach Web ページを参照してください。 ここで、"Why does Approach open my DB2 table in read only mode?" という質問を入力してください。

SQLJ アプリケーションの使用

OS/2 サーバー上で Java ストアード・プロシージャーまたはユーザー定義関数 (UDF) を実行するには、DB2 をサーバーの HPFS ドライブにインストールする必要があります。 そうすると、 ストアード・プロシージャーまたは UDF の ".class" ファイルを、 ファイル名の拡張子を切り捨てないで、%DB2PATH%\function ディレクトリーに保管できます。

SQLJ プログラムを作成するには、 次のコマンドを使用して、Java Development Kit の just-in-time コンパイラー機能をオフにする必要があります。

SET JAVA_COMPILER=NONE

注:SQLJ ソース・ファイルにファイル終わり文字 (EOF) が含まれていると、SQLJ 変換プログラム 'sqlj' が、以下のような例外を報告して失敗する原因になります。

Cursor.sqlj:122.2: Error: Java Parsing. Encountered: \u001a
Expected: > ; "abstract" ...; "public" ...; "interface" ...; 
"#sql" ...; ";" ...;
Total 1 error.

問題の EOF を取り除くには、 自動的に EOF を付加しないテキスト・エディターで SQLJ ソース・ファイルをオープンし、 ファイルの末尾にブランク行を追加するという修正をファイルに加えてから、 このファイルを再度保存します。

db2ocat ツールの使用

DB2 ODBC カタログ・オプティマイザー・ツールは、 ODBC、CLI、および JDBC のアクセス用に最適化されたカタログ表を作成します。

このツールを使用すると、 基本システム・カタログ表のロックの数が減少します。 その理由は以下のとおりです。

パフォーマンスの低下に対処する方法

ODBC または DB2 CLI インターフェースを使用して作成されたアプリケーションの多くは、 システム・カタログを酷使します。 データベース・オブジェクトの数が少ない場合、 これがデータベースにとって問題となることはありませんが、 より大きな DB2 データベースでこうしたアプリケーションを使用すると、 パフォーマンス上の問題を引き起こす可能性があります。 こうしたパフォーマンスの低下の主な要因は以下の 2 つです。

db2ocat ツールによるパフォーマンスの向上

DB2 ODBC カタログ・オプティマイザー・ツールは、 特定のアプリケーションによる ODBC アクセス用に最適化された代替カタログ表を作成することにより、 パフォーマンスの低下の問題を解決します。 このユーティリティーは、 データベース管理者が特定のアプリケーションに必要なカタログ情報のサブセットを識別するのを支援し、 そのアプリケーションが使用するための ODBC 最適化カタログを作成します。 結果として、基本システム・カタログ表にかけられるロックの数は減少し、 カタログの照会時間、および照会の結果として返されるデータの量も著しく減少します。

注:

  1. アプリケーションが SQL ステートメントの準備を明示的に要求している場合、 db2ocat ツールは、アプリケーションによるシステム表の照会を妨げません。

  2. db2ocat ツールは、SQLTables、SQLColumns、 および SQLFunctions のような、CLI API を使用するシステム表に対するドライバー生成の照会だけに影響を与えます。 このツールは、最適化プログラムがシステム・カタログにアクセスして、 アクセス・プランを生成することを妨げません。

db2ocat を使用したパフォーマンスの改善

db2ocat ユーティリティーを使用したパフォーマンスを向上させるには、 以下を実行してください。

注:

  1. DB2 ユニバーサル・データベースに用意されている複数の CLI/ODBC 初期設定キーワードを使用すると、 初めてデータベースに接続した後の「情報収集」ステージで、 最初の API 呼び出しによって返されるデータの量を制限することができます。

  2. db2cli.ini ファイルの CLISCHEMA キーワードは、ODBC カタログ・スキーマに設定する必要があります。 CLISCHEMA オプションは、 カタログ情報を取得するために DB2 CLI および ODBC カタログ機能呼び出しが発行されたときに、 SYSIBM (または SYSTEM、QSYS2) スキーマの代わりに検索される代替スキーマ、表、および索引のセットを指定します。

  3. CLISCHEMA='SERGE'を指定すると、 通常はシステム表を参照する内部 CLI/ODBC API 呼び出しは、 以下のユーザー表を代わりに参照します。

ストアード・プロシージャー

ストアード・プロシージャー とは、 データベース・サーバーに保管される一種のアプリケーションです。 呼び出しプロシージャー (またはクライアント・アプリケーション) は、 データベース・クライアントで実行され、 使用可能な API の方式を使用してストアード・プロシージャーを呼び出します。

ストアード・プロシージャーは、 クライアント・アプリケーションによって呼び出される (または起動される) と、 データベース・サーバー上で稼働し、 得られた結果をクライアント・アプリケーションに返します。

呼び出しプロシージャーとストアード・プロシージャーは、 ご使用のオペレーティング・システム用の DB2 でサポートされている言語であれば、 どれを使って作成してもかまいません。 両者を同一の言語で作成する必要はありません。

ストアード・プロシージャーをデバッグするには、 これをデバッグ・モードで実行します。 ストアード・プロシージャーのテストは、 呼び出しアプリケーション・プログラムとは別個に行うことができます。 他のアプリケーションのデバッグの場合と同様、 使用する言語のコンパイラーに付属のデバッガーを使用して、 ローカルに分離されたストアード・プロシージャーをデバッグできます。 付属のデバッガーの使用方法については、コンパイラーの資料を参照してください。

ストアード・プロシージャーの問題判別の詳細については、 アプリケーション開発の手引き の『ストアード・プロシージャー』の章の『問題の解決』という節を参照してください。

ストアード・プロシージャーの呼び出し時にエラーを受け取った

症状
ストアード・プロシージャーの名前がホスト変数にあるにもかかわらず、 このストアード・プロシージャーへの呼び出しの際にエラー (Error: Expected stored procedure name. Found: ?) を受け取りました。

推定原因
ホスト変数のプロシージャー名への使用は、SQL92 標準ではありません。 SQLJ は SQL92 標準に基づいているため、 CALL ステートメントのホスト変数をプロシージャーの名前に使用することはサポートされていません。

処置
CALL ステートメントで、プロシージャーの名前にホスト変数を使用することはできません。


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