IBM的iSeries ODBC驱动程序在通过isql或其他方式调用时不会发送任何stream量,从而导致 和错误:无法SQLConnect

注意:我已经用示例replace了IP地址,数据库名称和服务器用户。 这不应该影响任何东西。


安装程序

我已经安装了unixODBC( yum install unixODBC )和IBM的官方iSeries ODBC驱动程序( yum install ibm-iaccess-1.1.0.5-1.0.x86_64.rpm ,从IBMlogin区域下载的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 ,大概一分钟左右就会得到这个输出:

 [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使用TraceTraceFile启用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,试图做一些错误(不知道是什么?),然后释放句柄。

我最后的手段是直接检查networkingstream量。 以下是使用telnet的初始testing:

 [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数据包,其中一个包含foobar ,正如我们所期望的那样。

现在,这是对isql的testing:

 [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 

没有交通!


老实说,我有点卡在这里。 不知道接下来要尝试什么。 有什么想法可能会出错,或如何解决这种困难的情况?

请注意,服务器设置本身很好。 使用适用于Windows的IBM iSeries ODBC驱动程序,我可以在没有问题的情况下进行连接。

好的,终于搞清楚了。 多么愚蠢。

首先,帮个忙,抓住一个IBM的旧iSeries驱动程序,而不是新的iAccess驱动程序。 login时,请转至IBM Software > Downloads > No-charge products, tools, and toolkits ,然后searchodbc 。 您应该看到像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 

太好了! 至less现在我们可以绝对肯定地说,这个问题有一定的阻碍。

但是什么是封锁? 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 (“数据库访问”),瞧! 一切开始工作!

更新3/8/2016:出于某种原因,Windows需要比Linux打开更多的端口。 为了在Windows上正常工作,我们还需要Server MapperSign-On Verification端口。


注意,这里是文章的另一个重要段落:

可以configuration这些端口号(Server Mapper除外),而上面列出了默认值时,系统上的实际值可能会有所不同。 端口从服务表中检索。 使用相关系统上的WRKSRVTBLE命令确定这些端口是否已经从默认值修改了端口。