IBM Support

[Db2] 自動クライアント・リルートが有効なとき、クライアントの db2diag.log に GetAddrInfo のエラーが記録され、接続に時間がかかることがある

Troubleshooting


Problem

自動クライアント・リルート (ACR) を構成していると、データベースへの接続時にクライアント側の db2diag.log へ GetAddrInfo failed のログが記録されることがあります。
このとき、接続に時間がかかったり、後続の接続でクライアント・リルートが動作してスタンバイ・サーバーにアクセスが発生することもあります。
db2diag.log の例
2021-03-25-10.47.20.328000+540 I1286H350          LEVEL: Warning
PID     : 1508                 TID  : 6500        PROC : db2bp.exe
INSTANCE: DB2_15               NODE : 000
EDUID   : 6500
FUNCTION: DB2 UDB, DRDA Application Requester, sqljrUpdateSrvlst, probe:150
MESSAGE : ZRC=0x00002AF9=11001 (WSAHOST_NOT_FOUND)
DATA #1 : String, 18 bytes
GetAddrInfo failed
上の例は Windows クライアントなので、winsock のエラーコード (WSAHOST_NOT_FOUND) が記録されています。
このエラーコードはクライアントのプラットフォームに依存します。また、名前解決ができないときに必ず db2diag.log にエラーが記録されることを保証するものではありません。

Cause

Db2 サーバーのデータベース・ディレクトリーに代替サーバー (alternate server) が設定されている場合、データベース・マネージャーはデータべース初回接続時の ACCRDBRM (データベース接続完了メッセージ) で、クライアントに SRVLST (サーバー・リスト) を通知します。なお、pureScale や Sysplex サーバーに接続する場合もサーバー・リストが返されるため同じ考慮点があります。
クライアントがサーバー・リストに含まれるホスト名を解決できない場合、該当の GetAddrInfo failed が記録されます。
たとえば、DNS 環境でサーバーの短縮名が送られてきた場合、クライアントで名前解決ができる保障はありません。
C:\>ping hogehoge
Ping request could not find host hogehoge. Please check the name and try again.
サーバーがサーバー・リストを送っているかどうかは db2trc で確認できます。
(トレースはサーバーまたはクライアントどちらで取得しても構いません)
Windows クライアントで採取する例
  1. Windows クライアントに管理者としてログオンします。
  2. 「DB2 コマンド ウィンドウ - 管理者」を開き、以下のコマンドを実行します。ここでデータベース名は SAMPLE と仮定します。
    C:\>db2trc on -f trc.dmp -t
    C:\>db2 connect to sample user <user_name> using <password>
    C:\>db2trc off
    C:\>db2trc fmt -c trc.dmp trc.fmtc
    C:\>more trc.fmtc
      NM: ACCRDBRM - Access to RDB Completed
          NM: SRVLST - Server List
            LL: 74    CP: 244E   
            NM: SRVLCNT - Server List Count
              LL: 6    CP: 244C   
              DECIMAL:     2        // リストには 2 つのホストエントリーが含まれます。
              HEXADECIMAL: 0002
            NM: SRVLSRV - Server List Entry
              LL: 4    CP: 244D   
            NM: SRVPRTY - Server Priority
              LL: 6    CP: 244F   
              DECIMAL:     1
              HEXADECIMAL: 0001
            NM: TCPPORTHOST - TCPIP Port Number and Domain-Qualified Host Name
        // 一つ目のエントリーは、ホスト名 hoghoge.example.com、ポート番号  50000 です。
              LL: 14    CP: 1912   
              TCPPORT = 50000
              TCPHOST = 
                ASCII: ........
                EBCDIC: hogehoge.example.com
            NM: SRVPRTY - Server Priority
              LL: 6    CP: 244F   
              DECIMAL:     0
              HEXADECIMAL: 0000
            NM: TCPPORTHOST - TCPIP Port Number and Domain-Qualified Host Name
        // 二つ目のエントリーは、ホスト名 alternate1.example.com ポート番号 50010 です。
              LL: 34    CP: 1912   
              TCPPORT = 50010
              TCPHOST = 
                ASCII: .....K........K.....K...K...
                EBCDIC: alternate1.example.com
    2 つめのホスト名はサーバーのデータベース・ディレクトリーからそのまま転記されます。
    1 つめのホスト名は設定値から取得できないため、以下のようなコードでホスト正規名を取得したものがセットされています。
    canonname.c
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    int main(int argc,char *argv[]){
       int rc = 0;
       struct addrinfo aiHints;
       struct addrinfo *aiList = NULL;
       memset(&aiHints, '\0', sizeof(aiHints));
       aiHints.ai_family   = AF_UNSPEC;
       aiHints.ai_socktype = SOCK_STREAM;
       aiHints.ai_protocol = IPPROTO_TCP;
       aiHints.ai_flags    = AI_CANONNAME;
       rc = getaddrinfo(argv[1], NULL, &aiHints, &aiList);
       printf("getaddrinfo(%s) = %s\n", argv[1], aiList->ai_canonname);
    }
    
    実行例
    $ make canonname
    $ ./canonname `hostname`
    getaddrinfo(hogehoge) = hogehoge.example.com

Environment

代替サーバーの設定方法と、設定されていることの確認は以下の通りです。
pureScale メンバーはサーバー・リストを返すために特別な設定は不要です。クラスター上のすべてのメンバーのホスト名が返されます。
  1. データベース・サーバーにインスタンス・オーナーとしてログインします。
  2. update alternate server コマンドで代替サーバーを設定します。
    $ db2 update alternate server for database sample using hostname alternate1.example.com port 50010      
  3. list db directory コマンドで設定した代替サーバーを確認します。
    $ db2 list db directory
     System Database Directory
     Number of entries in the directory = 1
    Database 1 entry:
     Database alias                       = SAMPLE
     Database name                        = SAMPLE
     Local database directory             = /home/db2inst1
     Database release level               = c.00
     Comment                              =
     Directory entry type                 = Indirect
     Catalog database partition number    = 0
     Alternate server hostname            = alternate1.example.com
     Alternate server port number         = 50010

Diagnosing The Problem

SRVLST に含まれるホスト名をクライアントで名前解決できるように、以下のいずれかの手法を検討してください。
  • すべてのクライアントの hosts ファイルに SRVLST に含まれるサーバーのホスト名を追加する。またはクライアントが参照する DNS サーバーでサーバー・リストに含まれるホスト名を解決できるように構成する
  • サーバーの正規名が、クライアントで解決できるようにサーバー側の設定を変更する。
    たとえば、クライアントが FQDN を解決できず、短縮名のみ解決できる場合、かつサーバーが  AIX サーバーの場合
    (1) netsvc.conf で bind を先に参照するように設定する、
    (2) hosts から自ホストのエントリーを削除する などの手段が考えられます。たとえば、以下の設定では hosts を先に参照し、かつ hosts に自ホストのエントリーがあるため、正規名は hogehoge になります。
    $ grep `hostname` /etc/hosts
    10.188.123.159   hogehoge
    $ grep ^hosts /etc/netsvc.conf
    hosts = local,bind
    $ ./canonname `hostname`
    getaddrinfo(hogehoge) = hogehoge
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

Document Location

Worldwide

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PkdAAE","label":"Connectivity"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
26 June 2024

UID

ibm16539800