SQL30081N TCP/IP 通信エラー

SQL30081N TCP/IP 通信プロトコル・エラーと推奨される解決策を示します。

原因

通信プロトコル・エラーの原因は、使用するプラットフォームによって異なる可能性があります。 それぞれのプロトコル・エラーには、独自の定義と対応するアクション計画があります。

SQL30081N エラー・メッセージは、以下のような形式です。

通信エラーが検出されました。 使用された通信プロトコル:protocol。 
使用している通信 API: interface。 
エラーが検出されたロケーション: location。 
エラーを検出した
通信関数:function。 
プロトコル固有エラー・コード: rc1rc2rc3

SQL30081N A communication error has been detected. Communication protocol
being used: "TCP/IP". Communication API being used: "SOCKETS". Location
where the error was detected: "". Communication function detecting the error: "connect".
Protocol specific error code(s): "111", "*", "*".

これらのエラー・メッセージは、 Db2® が、 Db2の外部のコンポーネントからエラー・メッセージを受け取るオペレーティング・システム・ソケット API を呼び出すときに返されます。 これらのソケット・エラーは、 Db2に再び伝搬されます。これにより、エラーが SQL30081N メッセージ内にカプセル化されます。 根本原因は、 Db2の外部にあります。これは、クライアント/サーバー・ネットワーク・スタックにあるか、その間にあるネットワーク・デバイスにある可能性があります。 ネットワーク管理者に依頼して、クライアント・サイドとサーバー・サイドの両方からネットワーク・トレースを収集して分析し、根本原因を判別してください。

解決方法

表 1 は、さまざまなプラットフォームで発生するプロトコル固有のエラーと、それらのエラーを解決するための対応するアクション・プランをリストしています。 エラー・コードが表にリストされていない場合は、オペレーティング・システムの資料を検索してください。
  • Linux および AIX システムの場合は、 /usr/include/errno.hにアクセスします。
  • Windows システムの場合は、 システム・エラー・コード を参照してください。
非 Java アプリケーション・キーワードについては、以下の資料を参照してください。
  • db2cli.ini キーワード。CLI/ODBC アプリケーションで使用されます。

  • db2dsdriver.cfg キーワード。 IBM .NET プロバイダーを使用する Windows アプリケーションによって使用されます。

  • DB2 レジストリー変数( 「通信」 グループの下)。

  • FAQ JDBC ERRORCODE=-4499 接続、Java アプリケーションで使用

    表 1. プラットフォーム別の TCP/IP 関連のエラー
    Windows AIX Linux 短縮名 アクション計画
    10061 79 111 ECONNREFUSED 接続が拒否されました クライアントは、無効な IP またはポートを使用してサーバーへの接続を確立しようとします。
    サーバー・サイドで、以下の条件が存在することを確認します。
    • Db2 環境変数 DB2COMM は、 DB2COMM=TCPIP のように設定されます。
    • DBM CFG の SVCENAME がインスタンスのポート番号またはサービス名に設定されていること。 このパラメーターを更新するコマンドは db2 update dbm cfg using svcename <port/service name> です。
    • サービス名が設定されている場合は、「services」ファイルを調べて、その名前が未使用のポート番号に対応しているかどうかを確認します。
    • Db2 サーバー・インスタンスが正しく開始されていることを確認してください。
    クライアント・サイドで、ノード・ディレクトリー項目を確認し、以下の条件が存在することを確認します。
    • サービス名は、 Db2 サーバーのインスタンス・ポート (svcename 設定) に対応する正しいポート番号またはサービス名を示します。
    • サーバーのポートが開いているかどうかを確認するには、 telnet <hostname> <port> を参照してください。
    • コマンドが失敗すると、サーバー上のポートは開かれず、問題は Db2 領域の外部にあります。

    ECONNREFUSED について詳しくは、以下を参照してください。

    http://www.ibm.com/support/docview.wss?rs=71&uid=swg21328644
    10053 72 103 SOCECONNABORTED ソフトウェアが接続を終了しました。 ソフトウェアが接続をクローズしました。
    ODBC/CLI を使用して Db2 サーバーに接続するクライアント・アプリケーションでエラーが報告された場合は、以下のステップを実行します。
    1. Db2 CLI タイムアウトを無効にするには、クライアント・サイドの db2cli.ini ファイルに QUERYTIMEOUTINTERVAL=0 を追加します。
    2. アプリケーションにタイムアウト (ADO タイムアウトや VB タイムアウトなど) があるかどうかを確認します。
    3. アプリケーションが OS390 サーバーに接続する場合、OS390 で idlethreadtimeout パラメーター (IDTHTOIN) を確認します。
      注: このパラメーターは、 OS390でのアクティブ・スレッドのタイムアウト制限を設定します。
    10054 73 104 ECONNRESET パートナーによって接続がリセットされます。 接続されているパートナーが接続を閉じます。

    パートナー側のタイムアウト制限 (ファイアウォール、アプリケーション、 Db2 CLI 層など) を確認します。

    ODBC/CLI を使用して Db2 サーバーに接続するクライアント・アプリケーションでエラーが報告された場合は、以下のステップを実行します。
    1. Db2 CLI タイムアウトを無効にします。
    2. QUERYTIMEOUTINTERVAL=0 をクライアント・サイドの db2cli.ini ファイルに追加します。
    3. クライアントとサーバーの間にファイアウォールが存在するかどうかを確認します。
    4. オープン接続に何らかの時間制限がある場合は、アプリケーションに ADO タイムアウトや VB タイムアウトなどのタイムアウトがあるかどうかを確認します。
    注: TCPIP 接続を使用してデータベースに接続すると、エラー SQL30081 が発生する可能性があります。 データベース接続がローカルで、データベース名とは異なる別名を使用してカタログされている場合、エラーが発生する可能性があります。 SQL30081 エラーが発生した場合は、サーバー上のデータベースの名前とは異なる別名を使用して、データベースがカタログされていないことを確認してください。
    10060 78 110 ETIMEDOUT 接続タイムアウト 接続がネットワーク・タイムアウト制限に達し、ネットワークによって切断されました。

    タイムアウトは TCP/IP 層によって開始されます。

    TCP/IP にはタイムアウト値があります。 オープン接続が長すぎると、TCP/IP は接続を強制的にオフにします。

    多くの場合、この切断はネットワークの問題です。

    以下の回避策を試してください。
    1
    10048 67 98 EADDRINUSE 指定されたアドレスは既に使用中です。 このエラーは、通常、以下の状況で発生します。
    • 同じサーバー上で開始されている 2 つのインスタンスが同じポートで listen している場合。 (このエラーは通常、 db2start 上でトラップされます)。
    • クライアント・アプリケーションまたはエージェントが、別の接続で使用されているソケットを使用してデータベースに接続している場合。
    • クライアント・アプリケーションまたはエージェントが、待ち状態 (2MSL 状態) のソケットを使用してデータベースに接続している場合。
    このエラーは通常、Windows クライアントで発生します。

    このエラーは Microsoft エラーです。 Winsock には、既に使用されているポート (Winsock 障害)、または閉じているがまだ待ち状態になっているポートが用意されています。

    Windows の場合は、以下の回避策を試してください。
    • ソケットがクローズされた後に待ち状態になる時間の長さを調整します (デフォルトは 2 分間)

      TcpTimedWaitDelay

      2

    • 使用可能なポートの数を調整します (デフォルトは 5000)

      MaxUserPort

      3

    • 接続と切断の設定を調整して、プログラム内で素早く循環しないようにします (最良の解決策)。 10048 は、多くの場合、アプリケーションの高速接続および切断ロジックが原因で発生します。これにより、time_wait 状態 (2MSL) になっているポートが多すぎます。 アプリケーションが複数のステートメントを発行するときに接続ハンドルを再使用することが、この状態を処理する最良の方法です (ステートメントが完了するたびに切断して再接続しないでください)。
    • アプリケーション・ロジックを内部で変更する必要がないように、クライアント・サイド接続プーリングを実装します。 プールが接続の 80% を処理するのに十分な大きさであることを確認してください。 プールに、アイドル状態の切断のための何らかの形式の再接続ロジックがあることを確認してください。
    10055 74 105 ENOBUFS 使用可能なバッファー・スペースがありません このエラーは、システムが TCP/IP 呼び出しを完了するためのリソースを使い尽くしたときに発生します。

    Windows システムの場合、この問題は、デスクトップ・ヒープまたはシステム・ページ・テーブル・エントリーが不足していることが原因で発生します。 これは Db2 関連ではありません。

    この問題を解決するには、Windows SystemPages レジストリー項目を増やしてください。

      32 32 EPIPE (パイプの破損)

    クライアントとサーバーの間のネットワーク接続の問題。

    この問題を解決するには、クライアントとサーバーの両方でネットワーク・スニファー・トレースを実行します。

    10004 (WSAEINTR)       接続はクライアントによってクローズされます。 Db2 については、 技術情報 を参照してください。
    10065 81 113 WSAEHOSTUNREACH

    ホストへの経路が存在しません。

    Linux サーバーに接続しようとしている Windows クライアントの場合は、 Linux サーバー上のファイアウォールを設定解除して、接続が通過できるようにします。

状況によっては、戻りコードが返されないことがあります。
症状 1
SQL30081N 通信エラーが検出されました。 使用している通信プロトコル: 'TCP/IP'。 使用している通信 API: 'SOCKETS'。 エラーが検出されたロケーション: '192.168.1.200'。 エラーを検出した通信関数: 'SelectForConnectTimeout'。 プロトコルに固有のエラー・コード: '0','*','*'。 SQLSTATE=08001.
考えられる原因
192.168.1.200 は、他のデバイスにも割り当てられる仮想 IP です。 この割り当てにより、 SQL30081N エラー・メッセージが断続的に出されます。 他の問題がこのエラー・メッセージを生成する可能性があります。
症状 2
SQL30081N 通信エラーが検出されました。 使用されている通信プロトコル: "TCP/IP"。 使用されている通信 API: "SOCKETS"。 エラーが検出された場所: 「192.168.1.200」。 エラーを検出した通信関数: 「recv」。プロトコル固有のエラー・コード:「*」、「*」、「0」。 SQLSTATE=08001.
考えられる原因

エラー・コード *、 *、および「0」は、接続がピアによってクローズされたことを示します。 このピアは、クライアントと Db2 サーバーの間の任意のネットワーク・デバイス (ファイアウォール、ルーター、ワークロード・バランシング・デバイスなど)、または Db2 サーバー自体にすることができます。

Db2 データベース・サーバー上で実行されているネットワーク・セキュリティー・ソフトウェアおよびサーバー・セキュリティー・ソフトウェアを無効にすると、問題が解決する可能性があります。 異なるベンダーの複数のセキュリティー製品が否定的に相互作用し、*、 *、 0 エラー・コードを生成する可能性があります。

Db2 サーバーでワークロード・マネージャー (WLM) が有効になっているかどうかを確認します。 WLM が使用可能になっている場合は、xx 分を超える時間を要する SQL 照会が切断されていないかどうかを確認してください。 この例は、15 分の UOWTOTALTIME 設定を示しています。

db2 "select substr(workloadname,1,25) as workloadname,serviceclassname from syscat.workloads with UR"

WORKLOADNAME SERVICECLASSNAME
---------------- ------------------
SYSDEFAULTUSERWORKLOAD SYSDEFAULTSUBCLASS
SYSDEFAULTADMWORKLOAD SYSDEFAULTSUBCLASS
TEST_WL MAIN_SC

db2 "select workloadname,ENABLED from syscat.workloads with UR"

WORKLOADNAME ENABLED
-------------------- ----------
SYSDEFAULTUSERWORKLOAD Y SYSDEFAULTADMWORKLOAD Y
TEST_WL Y

CREATE THRESHOLD "TEST_UOW_CONC_TH"
FOR WORKLOAD TEST_WL ACTIVITIES
ENFORCEMENT DATABASE
WHEN UOWTOTALTIME > 15 MINUTES
COLLECT ACTIVITY DATA
ON COORDINATOR DATABASE PARTITION
WITH DETAILS
FORCE APPLICATION;

また、 Db2 サーバーを調べて、 通信レジストリー変数 が設定されているかどうかを判別してください。 同じタイム・スタンプに近いメッセージが db2diag.log ファイルに存在するかどうかを確認します。

次の作業

TCP/IP エラーを処理するためにさらにアクションが必要な場合は、以下のタスクを試行してください。

  • Db2 クライアントと Db2 サーバーの両方から Db2 トレース結果を収集します。
    注: このタスクは、 JDBC ドライバー (db2jcc.jar または db2jcc4.jar) を使用する Java アプリケーションには適用されません。 Java アプリケーションについては、 データの収集: IBM Data Server Driver for JDBC および SQL J を使用したトレースを参照してください。
    クライアント・サイドで、以下のタスクを実行します。
    1. db2trc on -t -f ctrace.dmp -Madd SQLJC -Madd SQLJR -Madd SQLR -Madd SQLCC を実行します。
    2. SQL30081 エラーが報告されるまで待ちます。
    3. db2trc off を実行します。
    4. トレースをフォーマットします。
      db2trc flw -t -wc ctrace.dmp ctrace.flw
      注: 古いバージョンの Db2 では、「-wc」オプションはサポートされません。 古いバージョンの場合、このパラメーターは削除してください。
      db2trc fmt ctrace.dmp ctrace.fmt
      db2trc fmt -c ctrace.dmp ctrace_drda.fmt
    サーバー・サイドで、以下のタスクを実行します。
    1. db2trc on -t -f strace.dmp -Madd SQLJC -Madd SQLJS -Madd SQLR -Madd SQLCC を実行します。
    2. SQL30081 エラーが報告されるまで待ちます。
    3. db2trc off を実行します。
    4. トレースをフォーマットします。
      db2trc flw -t -wc strace.dmp strace.flw
      db2trc flw -t -wc strace.dmp strace.flw
      db2trc fmt strace.dmp strace.fmt
      db2trc fmt -c strace.dmp strace_drda.fmt
  • ネットワーク管理者に、クライアント・サイドとサーバー・サイドの両方からネットワーク・スニファー・トレース (Linux: tcpdump、Windows: Wireshark) を収集して分析してもらってください。 この結果は、 Db2 トレースからの提案が役に立たない場合に、 SQL30081 エラーの根本原因を判別するのに役立つことがあります。 Db2 診断は、オペレーティング・システムによって提供されるソケット API が呼び出された後は、オペレーティング・システムおよびネットワーク層を可視化しません。
  • スタンドアロン pct ツールを実行して、 Db2の外部のクライアント・モードとサーバー・モードの両方でネットワーク接続をテストします。 pctt ツールは、 Linux および AIX システムの場合は ~/sqllib/bin フォルダーに、Windows システムの場合は C:\Program Files\IBM\SQLLIB\bin フォルダーにあります。 このツールは、テストのためにクライアントとサーバーの間に別個のネットワーク接続をセットアップします。
    注: サーバー・モード (例えば、 pctt s /b 32767) で大きなバッファー・サイズを指定すると、リスナーがコア・ダンプを取る可能性があります。 より小さいバッファー・サイズを使用してください。 このプログラムは、断続的な接続の問題を再現しない可能性があります。 pctt の使用法は、「 IBM Db2 Universal Database トラブルシューティング・ガイド 」の 132 ページに記載されています。

    Db2 に組み込まれている ping コマンドを実行して、不整合な待ち時間の問題が存在するかどうかを判別します。

    $ db2 ping dbName request 32767 5
    
    Elapsed time: 692983 microseconds
    
    Elapsed time: 419739 microseconds
    
    Elapsed time: 419867 microseconds
    
    Elapsed time: 210229 microseconds
    
    Elapsed time: 210103 microseconds
    
    $ db2 ping dbName response 32767 5
    
    Elapsed time: 1241 microseconds
    
    Elapsed time: 1217 microseconds
    
    Elapsed time: 1236 microseconds
    
    Elapsed time: 2575774 microseconds   <<<<< 2.5 seconds
    
    Elapsed time: 3526 microseconds
1

Db2 は、TCP/IP 接続の KEEPALIVE オプションを使用して、接続障害が発生したかどうかを検出します。 このオプションは、パートナーがまだ稼働しているかどうかを判別するために、メッセージを定期的に送信します。 パートナーがそのメッセージに応答しない場合、接続は切断されたと判断されて、エラーが返されます。

2 このパラメーターは、接続がクローズされているときに、接続が TIME_WAIT 状態のままである時間の長さを決定します。 接続が TIME_WAIT 状態の間は、ソケットのペアを再利用することはできません。 この値は、ネットワーク上の最大セグメント存続時間の約 2 倍であるため、この状態は 2MSL 状態とも呼ばれます。 詳しくは、RFC 793 を参照してください。
3 このパラメーターは、アプリケーションがシステムから使用可能なユーザー・ポートを要求するときに使用される最大ポート番号を制御します。 通常、短命ポートは 1024 から 5000 までの範囲で割り振られます。 このパラメーターを有効範囲外の値に設定すると、最も近い有効値 (5000 または 65534) が使用されます。