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 にエラーが記録されることを保証するものではありません。
このエラーコードはクライアントのプラットフォームに依存します。また、名前解決ができないときに必ず db2diag.log にエラーが記録されることを保証するものではありません。
Cause
Db2 サーバーのデータベース・ディレクトリーに代替サーバー (alternate server) が設定されている場合、データベース・マネージャーはデータべース初回接続時の ACCRDBRM (データベース接続完了メッセージ) で、クライアントに SRVLST (サーバー・リスト) を通知します。なお、pureScale や Sysplex サーバーに接続する場合もサーバー・リストが返されるため同じ考慮点があります。
クライアントがサーバー・リストに含まれるホスト名を解決できない場合、該当の GetAddrInfo failed が記録されます。
たとえば、DNS 環境でサーバーの短縮名が送られてきた場合、クライアントで名前解決ができる保障はありません。
クライアントがサーバー・リストに含まれるホスト名を解決できない場合、該当の GetAddrInfo failed が記録されます。
たとえば、DNS 環境でサーバーの短縮名が送られてきた場合、クライアントで名前解決ができる保障はありません。
例
C:\>ping hogehoge
Ping request could not find host hogehoge. Please check the name and try again.
サーバーがサーバー・リストを送っているかどうかは db2trc で確認できます。
(トレースはサーバーまたはクライアントどちらで取得しても構いません)
Windows クライアントで採取する例
- Windows クライアントに管理者としてログオンします。
- 「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
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 メンバーはサーバー・リストを返すために特別な設定は不要です。クラスター上のすべてのメンバーのホスト名が返されます。
pureScale メンバーはサーバー・リストを返すために特別な設定は不要です。クラスター上のすべてのメンバーのホスト名が返されます。
- データベース・サーバーにインスタンス・オーナーとしてログインします。
- update alternate server コマンドで代替サーバーを設定します。
$ db2 update alternate server for database sample using hostname alternate1.example.com port 50010
- 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
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"}]
Was this topic helpful?
Document Information
Modified date:
26 June 2024
UID
ibm16539800