我正在将一堆 perl CGI 脚本从较旧的 RHEL5 安装迁移到 RHEL6 服务器。在旧服务器上安装了 DB2 V9.7,新服务器安装了 V10.5。服务器本身没有数据库,只有几个到远程数据库的连接。
我可以毫无问题地访问这些在 AIX 上运行的远程数据库之一,因此安装本身应该没问题。
我可以连接到另一个远程数据库,在旧的 RHEL5 服务器上没有问题。在新服务器上,我可以正常连接,但是一旦我尝试选择某些内容,连接就会中断并出现以下错误:
[IBM][CLI Driver] SQL30081N A communication error has been detected.
Communication protocol being used: "TCP/IP".
Communication API being used: "SOCKETS".
Location where the error was detected: "10.199.252.155".
Communication function detecting the error: "recv".
Protocol specific error code(s): "*", "*", "0". SQLSTATE=08001
请注意,IP 地址 10.199.252.155 是数据库服务器的 IP,不是我的,所以似乎是 DB2 服务器检测到一些错误并向我报告,而不是客户端自己检测到错误。
在我的两台服务器上,对远程数据库进行编目的命令(2 年前在 RHEL5 服务器上发布,几天前在 RHEL6 上发布)是
CATALOG TCPIP NODE TCP0000 REMOTE iaixdb2i SERVER 3910 REMOTE_INSTANCE tdbi30 SYSTEM IAIXDB2I OSTYPE AIX;
CATALOG DATABASE DB2I21 AS DB2I21 AT NODE TCP0000;
LIST NODE DIRECTORY 在两台服务器上的输出显示相同的条目:
Node name = TCP0000
Comment =
Directory entry type = LOCAL
Protocol = TCPIP
Hostname = iaixdb2i
Service name = 3910
和 LIST DATABASE DIRECTORY 几乎相同 - 旧服务器具有:
Database alias = DB2I21
Database name = DB2I21
Node name = TCP0000
Database release level = d.00
Comment =
Directory entry type = Remote
Catalog database partition number = -1
Alternate server hostname =
Alternate server port number =
而新服务器有
Database release level = 10.00
(其余相同)。
在谷歌搜索我的错误代码时,我发现很多站点 a) 连接根本没有成功,或者 b) 连接由于超时原因而中断。这两个错误似乎都不适用于我。此外,这些条目在协议特定部分中有一些相关的错误代码,而不仅仅是像我这样的“ ”、“ ”、“0”。
所以我现在看到的唯一区别是不同的数据库版本级别。这意味着我能想到的唯一问题是,数据库仍在旧版本下运行,并且存在 V10.5 协议问题。这是否意味着我必须将我的客户端降级到 9.7,或者有没有办法通过更改目录中的数据库版本级别来告诉新客户端使用旧协议级别?如果是这样,执行此操作的命令是什么?或者还有什么我应该尝试的吗?
编辑:按照 mustaccio 的要求添加了信息。
当我没有在命令行上传递用户和密码时没有提示我,所以我不得不修改连接命令以包含它们。另外,我在这篇文章中更改了用户名和密码——不过,真正的用户名也以 a 开头#
。
老机器:
$ db2 connect to DB2I21 user '#ABCDEF' using XXXXXXX
Database Connection Information
Database server = DB2 z/OS 10.1.5
SQL authorization ID = #ABCDEF
Local database alias = DB2I21
$ db2 "select * from sysibm.sysdummy1"
IBMREQD
-------
Y
1 record(s) selected.
$
新机:
$ db2 connect to DB2I21 user '#ABCDEF' using XXXXXXXX
Database Connection Information
Database server = DB2 z/OS 10.1.5
SQL authorization ID = #ABCDEF
Local database alias = DB2I21
$ db2 "select * from sysibm.sysdummy1"
SQL0805N Package "DB2I21.NULLID.SQLC2K26.4141414141664164" was not found.
SQLSTATE=51002
$
编辑2:更多信息
绑定db2clipk.bnd
有效,但当我从 sysibm.sysdummy1 中选择时不会更改错误消息。
IBM 为 SQLC2K26 建议的db2clpcs.bnd
Binding导致缺少访问权限;由于这是一个生产数据库,我无法让 DBA 更改任何内容。
好的,所以我尝试了测试数据库,它具有相同的设置,除了 I 更改为 J:
Node name = TCP0001
Comment =
Directory entry type = LOCAL
Protocol = TCPIP
Hostname = iaixdb2j
Service name = 3910
Database alias = DB2J21
Database name = DB2J21
Node name = TCP0001
Database release level = 10.00
Comment =
Directory entry type = Remote
Catalog database partition number = -1
Alternate server hostname =
Alternate server port number =
有相同的连接信息
$ db2 connect to DB2J21 user '#ABCDEF' using XXXXXXXX
Database Connection Information
Database server = DB2 z/OS 10.1.5
SQL authorization ID = #ABCDEF
Local database alias = DB2J21
而且,这真的让我感到惊讶,当我从新机器中选择时不会抛出任何错误!
$ db2 "select * from sysibm.sysdummy1"
IBMREQD
-------
Y
1 record(s) selected.
这可能是对我的 IP 地址的限制吗?如果是这样,为什么它允许我绑定?或者,有没有办法让我找出两个数据库的补丁级别?(如果我有补丁号,并且有明确说明这是阻止我选择的原因的描述,那么让 DBA 安装补丁会容易得多)。
编辑3:它是如何结束的
以防万一有人感兴趣或有类似的问题:
我让 DBA 绑定 V10.5 客户端包。在那之后,
$ db2 "select * from sysibm.sysdummy1"
在生产数据库 (DB2I21) 上运行良好。我的 perl 程序仍然崩溃。
卸载 DB2 Express C 10.5,安装 10.5FP3 DS 驱动程序。仍然是同样的问题,两个数据库都从命令行工作,test 数据库使用 perl,prod 数据库没有。
我在 perl 程序上针对 test 和 prod DB 进行了 Wireshark 跟踪——直到某一点,它们似乎完全相同,除了密码交换。客户端执行查询并开始检索结果值后,服务器只是关闭 TCP 连接,不返回任何内容,甚至不返回空的或错误的 TCP 数据包。
我当时放弃了,安装了 10.1FP3 DS 驱动程序。一切似乎都适用于那个。