Centos6

IBM 的 iSeries ODBC 驅動程序在通過 isql 或其他方式呼叫時不發送任何流量,獲取08年代0108小號0108S01unixODBC在n一世X這D乙CunixODBC和一世小號QL一世小號問大號ISQL錯誤:無法 SQLC…

  • March 8, 2016

注意:我已經用範例替換了 IP 地址、數據庫名稱和伺服器使用者。那應該不會影響任何事情。


設置

我已經安裝了 unixODBC ( yum install unixODBC) 和 IBM 的官方 iSeries ODBC 驅動程序 ( yum install ibm-iaccess-1.1.0.5-1.0.x86_64.rpm,從 IBM 的登錄區域下載的 RPM)。安裝成功將驅動程序添加到/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,大約一分鐘左右後我得到這個輸出:

user@example.com [~]# isql FooDB USER PASSWORD -v
[08S01][unixODBC]
[ISQL]ERROR: Could not SQLConnect

故障排除

聽起來像是超時了,對吧?

ping 123.45.67.8返回:

user@example.com [~]# 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返回:

user@example.com [~]# 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.

Trace使用和啟用 ODBC 日誌TraceFile/etc/odbcinst.ini產生如下輸出:

[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..<..@.@.s.....
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...

foobar正如我們預期的那樣,我們看到一些 TCP 數據包,其中一個包含。

現在,這是測試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 的用於 Windows 的 iSeries ODBC 驅動程序毫無問題地進行連接。

好吧,終於想通了。真是太棒了。

首先,幫自己一個忙,使用 IBM 較舊的 iSeries 驅動程序,而不是較新的 iAccess 驅動程序。登錄後,轉至IBM Software > Downloads > No-charge products, tools, and toolkits,然後搜尋odbc。你應該看到像IBM i Access for Linux (V7R1). 抓住其中之一。

現在,使用這些較舊的驅動程序,您會收到正確的錯誤消息:

[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% 確定問題是某種阻塞。

但是阻塞是什麼?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 MapperSign-On Verification埠。


旁注,這是文章的另一個重要段落:

可以配置這些埠號(伺服器映射器除外),雖然上面列出了預設值,但係統上的實際值可能會有所不同。從服務表中檢索埠。在相關係統上使用 WRKSRVTBLE 命令確定這些埠,以確定埠是否已從預設值修改。

引用自:https://serverfault.com/questions/754165