IBM 的 iSeries ODBC 驅動程序在通過 isql 或其他方式呼叫時不發送任何流量,獲取08年代0108小號0108S01unixODBC在n一世X這D乙CunixODBC和一世小號QL一世小號問大號ISQL錯誤:無法 SQLC…
注意:我已經用範例替換了 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 Mapper
和Sign-On Verification
埠。旁注,這是文章的另一個重要段落:
可以配置這些埠號(伺服器映射器除外),雖然上面列出了預設值,但係統上的實際值可能會有所不同。從服務表中檢索埠。在相關係統上使用 WRKSRVTBLE 命令確定這些埠,以確定埠是否已從預設值修改。