注:IPアドレス、データベース名、サーバーユーザーを例に置き換えました。それは何にも影響を与えないはずです。
UnixODBC(yum install unixODBC
)とIBMの公式iSeries ODBCドライバー(yum install ibm-iaccess-1.1.0.5-1.0.x86_64.rpm
、IBMのログイン領域からダウンロードされたRPM)をインストールしました)。インストールにより、ドライバーが正常に追加されました。 to /etc/odbcinst.ini
:
[IBM i Access ODBC Driver]
Description = IBM i Access for Linux ODBC Driver
Driver = /opt/ibm/iaccess/lib/libcwbodbc.so
Setup = /opt/ibm/iaccess/lib/libcwbodbcs.so
Driver64 = /opt/ibm/iaccess/lib64/libcwbodbc.so
Setup64 = /opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 1
[IBM i Access ODBC Driver 64-bit]
Description = IBM i Access for Linux 64-bit ODBC Driver
Driver = /opt/ibm/iaccess/lib64/libcwbodbc.so
Setup = /opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 1
参照されているライブラリファイルは存在し、正しくリンクされています(ldd
でチェックされ、リンクが欠落していません)。
私の~/.odbc.ini
ファイルは次のようになります。
[Foo]
Driver = IBM i Access ODBC Driver
DATABASE = FooDB
SYSTEM = 123.45.67.8
HOSTNAME = 123.45.67.8
PORT = 446
PROTOCOL = TCPIP
isql Foo USER PASSWORD -v
を実行すると、約1分後に次の出力が得られます。
[email protected] [~]# isql FooDB USER PASSWORD -v
[08S01][unixODBC]
[ISQL]ERROR: Could not SQLConnect
タイムアウトしているようですね。
ping 123.45.67.8
は以下を返します:
[email protected] [~]# ping 123.45.67.8
PING 123.45.67.8 (123.45.67.8) 56(84) bytes of data.
64 bytes from 123.45.67.8: icmp_seq=1 ttl=63 time=29.8 ms
64 bytes from 123.45.67.8: icmp_seq=2 ttl=63 time=29.8 ms
64 bytes from 123.45.67.8: icmp_seq=3 ttl=63 time=29.8 ms
64 bytes from 123.45.67.8: icmp_seq=4 ttl=63 time=31.0 ms
64 bytes from 123.45.67.8: icmp_seq=5 ttl=63 time=29.9 ms
telnet 123.45.67.8 446
は以下を返します:
[email protected] [~]# telnet 123.45.67.8 446
Trying 123.45.67.8...
Connected to 123.45.67.8.
Escape character is '^]'.
foobar
^]
telnet> quit
Connection closed.
/etc/odbcinst.ini
でTrace
およびTraceFile
を使用してODBCログを有効にすると、次のような出力が生成されます。
[ODBC][22093][1454628360.104274][__handles.c][450]
Exit:[SQL_SUCCESS]
Environment = 0x13a4750
[ODBC][22093][1454628360.104316][SQLAllocHandle.c][364]
Entry:
Handle Type = 2
Input Handle = 0x13a4750
[ODBC][22093][1454628360.104339][SQLAllocHandle.c][482]
Exit:[SQL_SUCCESS]
Output Handle = 0x13a5080
[ODBC][22093][1454628360.104363][SQLConnect.c][3614]
Entry:
Connection = 0x13a5080
Server Name = [FooDB][length = 4 (SQL_NTS)]
User Name = [USER][length = 7 (SQL_NTS)]
Authentication = [*******][length = 7 (SQL_NTS)]
UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE 'UCS-2LE'
DIAG [08S01]
[ODBC][22093][1454628423.118602][SQLConnect.c][3982]
Exit:[SQL_ERROR]
[ODBC][22093][1454628423.118628][SQLError.c][430]
Entry:
Connection = 0x13a5080
SQLState = 0x7fff9a5bd7b0
Native = 0x7fff9a5bd5a8
Message Text = 0x7fff9a5bd5b0
Buffer Length = 500
Text Len Ptr = 0x7fff9a5bd5ae
[ODBC][22093][1454628423.118656][SQLError.c][467]
Exit:[SQL_SUCCESS]
SQLState = 08S01
Native = 0x7fff9a5bd5a8 -> 10060
Message Text = [[unixODBC]]
[ODBC][22093][1454628423.118685][SQLError.c][430]
Entry:
Connection = 0x13a5080
SQLState = 0x7fff9a5bd7b0
Native = 0x7fff9a5bd5a8
Message Text = 0x7fff9a5bd5b0
Buffer Length = 500
Text Len Ptr = 0x7fff9a5bd5ae
[ODBC][22093][1454628423.118704][SQLError.c][467]
Exit:[SQL_NO_DATA]
[ODBC][22093][1454628423.118722][SQLError.c][510]
Entry:
Environment = 0x13a4750
SQLState = 0x7fff9a5bd7b0
Native = 0x7fff9a5bd5a8
Message Text = 0x7fff9a5bd5b0
Buffer Length = 500
Text Len Ptr = 0x7fff9a5bd5ae
[ODBC][22093][1454628423.118739][SQLError.c][547]
Exit:[SQL_NO_DATA]
[ODBC][22093][1454628423.118765][SQLFreeHandle.c][279]
Entry:
Handle Type = 2
Input Handle = 0x13a5080
[ODBC][22093][1454628423.118784][SQLFreeHandle.c][330]
Exit:[SQL_SUCCESS]
[ODBC][22093][1454628423.118827][SQLFreeHandle.c][212]
Entry:
Handle Type = 1
Input Handle = 0x13a4750
ハンドルの割り当てに成功した後、データベースへの接続を試み、汎用SQL_ERRORで失敗し、エラーで何かを実行しようとし(何がわからないのですか?)、ハンドルの割り当てを解除します。
私の最後の手段は、ネットワークトラフィックを直接チェックすることでした。 telnet
を使用した最初のテストは次のとおりです。
[root@Host /opt/ibm/iaccess]# tshark -i tun0 -x
Running as user "root" and group "root". This could be dangerous.
Capturing on tun0
0.000000000 10.10.1.10 -> 123.45.67.8 TCP 60 42054 > ddm-rdb [SYN] Seq=0 Win=13660 Len=0 MSS=1366 SACK_PERM=1 TSval=1992917110 TSecr=0 WS=128
...PACKETS...
2.316931937 10.10.1.10 -> 123.45.67.8 TCP 60 42054 > ddm-rdb [PSH, ACK] Seq=1 Ack=1 Win=13696 Len=8 TSval=1992919427 TSecr=4147650000
0000 45 10 00 3c f1 b3 40 00 40 06 73 d2 0a 0a 01 0a E..<..@[email protected].....
0010 ac 10 1e 02 a4 46 01 be e0 f5 71 c8 1d a8 3b 71 .....F....q...;q
0020 80 18 00 6b f5 9b 00 00 01 01 08 0a 76 c9 89 83 ...k........v...
0030 f7 38 1d d0 66 6f 6f 62 61 72 0d 0a .8..foobar..
...PACKETS...
予想どおり、いくつかのTCPパケットがあり、そのうちの1つにはfoobar
が含まれています。
さて、これがisql
でのテストです。
[root@Host /opt/ibm/iaccess]# tshark -i tun0 -x
Running as user "root" and group "root". This could be dangerous.
Capturing on tun0
^C0 packets captured
渋滞なし!?
正直なところ、私はここで少し立ち往生しています。次に何を試すべきかわからない。何がうまくいかないのか、またはこの困難な状況をトラブルシューティングする方法について何か考えはありますか?
サーバーのセットアップ自体は問題ないことに注意してください。 IBMのiSeries ODBC Windows用ドライバーを使用して、問題なく接続できます。
さて、ついにそれを理解しました。なんてばかげている。
まず第一に、新しいiAccessドライバーではなく、IBMの古いiSeriesドライバーの1つを手に入れてください。ログインしたら、_IBM Software > Downloads > No-charge products, tools, and toolkits
_に移動し、odbc
を検索します。 IBM i Access for Linux (V7R1)
のようなドライバーが表示されるはずです。それらの1つをつかみます。
これらの古いドライバーを使用すると、適切なエラーメッセージが表示されます。
_[08S01][unixODBC][IBM][System i Access ODBC Driver]Communication link failure. comm rc=10060 - CWBCO1048 - A firewall blockage or time-out occurred trying to connect to the IBM i
_
いいね!少なくとも今では、問題が何らかの閉塞であると120%確実に確信できます。
しかし、何IS閉塞?IBMの驚くほどよく整理されたドキュメントの索引が救助に: http://www-01.ibm.com/support/docview.wss?uid = nas8N1012436
ここに再現された記事の表:
_PC Function Port (non-SSL) SSL Port
Server Mapper 449 449
License Management (see Note) 8470 9470
RPC/DPC (Remote Command) 8475 9475
Sign-On Verification 8476 9476
Database Access 8471 9471
_
ポート_8471
_( "データベースアクセス")のブロックを解除しました。すべてが機能し始めました!
2016年3月8日更新:何らかの理由で、WindowsはLinuxよりも多くのポートを開く必要があります。これをWindowsで機能させるには、_Server Mapper
_ポートと_Sign-On Verification
_ポートも必要でした。
ちなみに、この記事のもう1つの重要な段落は次のとおりです。
これらのポート番号(サーバーマッパー以外)は構成可能であり、デフォルトは上記にリストされていますが、システムの実際の値は異なる場合があります。ポートはサービステーブルから取得されます。問題のシステムでWRKSRVTBLEコマンドを使用してこれらのポートを判別し、ポートがデフォルト値から変更されているかどうかを判別してください。