SQL30081N TCP/IP 通信错误
提供了 SQL30081N TCP/IP 通信协议错误和建议的解决方案。
原因
发生通信协议错误的原因可能因平台而异。 每个协议错误都有它自己的定义和相应的操作计划。
SQL30081N 错误消息具有以下格式:
检测到通信错误。 正在使用的通信协议:协议。 正在使用的通信 API:接口。 检测到错误的位置:位置。 检测到错误的通信功能:功能。 特定于协议的错误代码:rc1、rc2 和 rc3。
示例
SQL30081N A communication error has been detected. Communication protocol
being used: "TCP/IP". Communication API being used: "SOCKETS". Location
where the error was detected: "". Communication function detecting the error: "connect".
Protocol specific error code(s): "111", "*", "*".
当 Db2® 调用从 Db2外部的组件接收错误消息的操作系统套接字 API 时,将返回这些错误消息。 这些套接字错误将传播到 Db2,这会将该错误封装在 SQL30081N 消息中。 根本原因在 Db2外部,它可能位于位于它们之间的客户机/服务器网络堆栈或网络设备中。 让网络管理员从客户端和服务器端收集并分析网络跟踪以确定根本原因。
解决方案
db2cli.ini 关键字,由 CLI/ODBC 应用程序使用。
db2dsdriver.cfg 关键字,由使用 IBM .NET 提供程序的 Windows 应用程序使用。
DB2 注册表变量,位于
Communications
组下。常见问题 JDBC ERRORCODE=-4499 连接,由 Java 应用程序使用
表 1. 与 TCP/IP 相关的错误(按平台排列) Windows AIX Linux 短名称 操作计划 10061 79 111 ECONNREFUSED 连接被拒绝 客户机尝试使用无效的 IP 或端口来建立与服务器的连接。 在服务器端,请检查是否存在以下情况:在客户机端上,检查节点目录条目以及是否存在以下情况:- 设置了 Db2 环境变量 DB2COMM ,例如: DB2COMM=TCPIP
- DBM CFG 的 SVCENAME 设置为实例的端口号或服务名称。 用于更新此参数的命令为
db2 update dbm cfg using svcename <port/service name> - 如果设置了服务名称,请检查“services”文件以确定该名称是否对应于未使用的端口号。
- 确保 Db2 服务器实例已正确启动。
- 服务名称显示与 Db2 服务器的实例端口 (svcename 设置) 对应的正确端口号或服务名称
- 要检查是否打开了服务器的端口:
telnet <hostname> <port> - 如果命令失败,那么不会打开服务器上的端口,并且问题出在 Db2 区域之外。
有关 ECONNREFUSED 的更多信息,请参阅
http://www.ibm.com/support/docview.wss?rs=71&uid=swg2132864410053 72 103 SOCECONNABORTED 软件导致连接结束。 软件已关闭连接。 如果在使用 ODBC/CLI 连接到 Db2 服务器的客户机应用程序上报告了该错误,请完成以下步骤:- 通过将
QUERYTIMEOUTINTERVAL=0添加到客户机端的 db2cli.ini 文件,禁用 Db2 CLI 超时。 - 检查应用程序是否有任何超时,例如,ADO 超时或 VB 超时。
- 如果应用程序连接到 OS390 服务器,请检查 OS390 上的 idlethreadtimeout 参数 (IDTHTOIN)。注: 此参数设置 OS390上的活动线程超时限制。
10054 73 104 ECONNRESET 连接已由合作伙伴重置。 已连接的合作伙伴关闭连接。 检查合作伙伴端的任何超时限制,例如防火墙,应用程序和 Db2 CLI 层。
如果在使用 ODBC/CLI 连接到 Db2 服务器的客户机应用程序上报告了该错误,请完成以下步骤:- 禁用 Db2 CLI 超时。
- 将
QUERYTIMEOUTINTERVAL=0添加到客户端的 db2cli.ini 文件。 - 检查在客户机和服务器之间是否存在防火墙。
- 如果它对打开的连接有任何时间限制,请检查应用程序是否有任何超时(例如,ADO 超时或 VB 超时)。
注: 使用 TCPIP 连接连接到数据库时,可能会发生错误 SQL30081 。 如果数据库连接是本地连接,并且是使用不同于数据库名称的别名编目的,那么可能会发生此错误。 如果您收到 SQL30081 错误,请确保未使用与服务器上的数据库名称不同的别名对数据库进行编目。10060 78 110 ETIMEDOUT 连接超时 连接达到网络超时限制,并被网络断开了连接。 该超时由 TCP/IP 层启动。
TCP/IP 具有超时值。 如果打开的连接停留时间过长,那么 TCP/IP 将强制关闭该连接。
在许多情况中,此断开连接是一个网络问题。
请尝试以下变通方法:1- TCPIP 的 KEEPALIVE 设置。 有关更多信息,请参阅 TCP/IP 保持活动设置和相关 Db2 注册表变量。
- 增加一个或两个 DB2TCP_CLIENT_KEEPALIVE_TIMEOUT 或 DB2TCP_SERVER_KEEPALIVE_TIMEOUT 值。
10048 67 98 EADDRINUSE 指定的地址已在使用中。 在以下情况下通常会看到该错误: - 当两个在同一服务器上启动的实例在同一端口上侦听时。 (此错误通常会在 db2start 上出现)。
- 当客户机应用程序或代理程序通过使用另一个连接正在使用的套接字来连接到数据库时。
- 当客户机应用程序或代理程序正在使用处于等待状态(2MSL 状态)的套接字连接到数据库时。
此错误是 Microsoft 错误。 Winsock 提供已在使用的端口(Winsock 缺陷)或已关闭但仍处于等待状态的端口。
请尝试以下 Windows 变通方法:- 调整套接字在关闭之后处于等待状态的时间长度(缺省值为两分钟)
TcpTimedWaitDelay
- 调整可用端口数(缺省值为 5000)
MaxUserPort
- 调整“连接和断开连接”设置,以便它们不会在程序中快速循环(最佳解决方案)。 10048 最常见的原因是应用程序中的快速连接和断开连接逻辑,这会使太多端口处于 time_wait 状态 (2MSL)。 在应用程序发出多个语句时复用连接句柄是处理此情况的最佳方式(不要在每次语句完成时断开连接,然后重新连接)
- 实现客户机端连接池,以便应用程序逻辑不必在内部进行更改。 请确保该池足够大,可以处理 80% 的连接。 请确保池具有某种形式的重新连接逻辑,以用于处于空闲时断开连接的情况。
10055 74 105 ENOBUFS 无可用的缓冲区空间 当系统耗尽资源以完成 TCP/IP 调用时,会发生此错误。 在 Windows 系统上,导致此问题的原因是桌面堆或系统页表条目不足。 它与 Db2 无关。
要解决此问题,请增大 Windows SystemPages 注册表条目。
32 32 EPIPE(管道中断) 客户机与服务器之间的网络连接问题。
要解决此问题,请在客户机和服务器上运行网络嗅探器跟踪。
10004 (WSAEINTR) 客户机已关闭该连接。 对于 Db2 ,请参阅 技术说明 10065 81 113 WSAEHOSTUNREACH 不存在到主机的路由。
对于尝试连接到 Linux 服务器的 Windows 客户机,请在 Linux 服务器上取消设置防火墙以允许连接通过。
- 症状 1
- SQL30081N 已检测到通信错误。 Communication protocol being used 'TCP/IP'. Communication API being used 'SOCKETS'. Location where error was detected "192.168.1.200'. Communication function detecting the error 'SelectForConnectTimeout'. Protocol specific error code '0','*','*'. SQLSTATE=08001.
- 可能存在的原因
- 192.168.1.200 是一个也分配给其他设备的虚拟 IP。 此分配会导致间歇性 SQL30081N 错误消息。 其他问题可能会生成此错误消息。
- 症状 2
- SQL30081N 已检测到通信错误。 Communication protocol being used: "TCP/IP". Communication API being used: "SOCKETS". 检测到错误的位置:“192.168.1.200”。 检测错误的通信功能:“recv”。特定于协议的错误代码:“*”、“*”、“0”。 SQLSTATE=08001.
- 可能存在的原因
错误代码 *、* 和“0”指示此连接已由对等方关闭。 此同级可以是客户机与 Db2 服务器之间的任何网络设备 (例如防火墙,路由器或工作负载均衡设备) ,也可以是 Db2 服务器本身。
禁用在 Db2 数据库服务器上运行的任何网络安全性和服务器安全性软件可能会解决此问题。 来自不同供应商的多个安全产品可能会产生负面影响,并生成 *、* 和 0 错误代码。
检查 Db2 服务器是否启用了工作负载管理器 (WLM)。 如果启用了 WLM,请检查是否已断开连接耗时超过 xx 分钟的 SQL 查询。 此示例显示 UOWTOTALTIME 设置为 15 分钟。
db2 "select substr(workloadname,1,25) as workloadname,serviceclassname from syscat.workloads with UR" WORKLOADNAME SERVICECLASSNAME ---------------- ------------------ SYSDEFAULTUSERWORKLOAD SYSDEFAULTSUBCLASS SYSDEFAULTADMWORKLOAD SYSDEFAULTSUBCLASS TEST_WL MAIN_SC db2 "select workloadname,ENABLED from syscat.workloads with UR" WORKLOADNAME ENABLED -------------------- ---------- SYSDEFAULTUSERWORKLOAD Y SYSDEFAULTADMWORKLOAD Y TEST_WL Y CREATE THRESHOLD "TEST_UOW_CONC_TH" FOR WORKLOAD TEST_WL ACTIVITIES ENFORCEMENT DATABASE WHEN UOWTOTALTIME > 15 MINUTES COLLECT ACTIVITY DATA ON COORDINATOR DATABASE PARTITION WITH DETAILS FORCE APPLICATION;此外,请检查 Db2 服务器以确定是否设置了任何 通信注册表变量 。 检查 db2diag.log 文件中是否存在具有相同时间戳记的任何消息。
后续操作
如果需要执行进一步操作以处理 TCP/IP 错误,请尝试以下任务。
- 从 Db2 客户机和 Db2 服务器收集 Db2 跟踪结果。注: 此任务不适用于使用 JDBC 驱动程序 (db2jcc.jar 或 db2jcc4.jar) 的 Java 应用程序。 对于 Java 应用程序,请参阅 收集数据: 使用 IBM Data Server Driver for JDBC 和 SQL J 进行跟踪。在客户机端上,完成以下任务:
- 运行
db2trc on -t -f ctrace.dmp -Madd SQLJC -Madd SQLJR -Madd SQLR -Madd SQLCC。 - 请等待报告 SQL30081 错误。
- 运行
db2trc off。 - 格式化跟踪:
db2trc flw -t -wc ctrace.dmp ctrace.flw注: Db2 的旧版本不支持 "-wc" 选项。 在较低版本中除去此参数。db2trc fmt ctrace.dmp ctrace.fmtdb2trc fmt -c ctrace.dmp ctrace_drda.fmt
在服务器端,请完成下列任务:- 运行
db2trc on -t -f strace.dmp -Madd SQLJC -Madd SQLJS -Madd SQLR -Madd SQLCC。 - 请等待报告 SQL30081 错误。
- 运行
db2trc off。 - 格式化跟踪:
db2trc flw -t -wc strace.dmp strace.flwdb2trc flw -t -wc strace.dmp strace.flwdb2trc fmt strace.dmp strace.fmtdb2trc fmt -c strace.dmp strace_drda.fmt
- 运行
- 让网络管理员从客户端和服务器端收集和分析网络嗅探器跟踪 (Linux: tcpdump , Windows: Wireshark)。 如果 Db2 跟踪中的建议没有帮助,那么结果可能有助于确定 SQL30081 错误的根本原因。 调用操作系统提供的套接字 API 后, Db2 诊断无法提供操作系统和网络层的可视性。
- 运行独立 pct 工具以在 Db2外部以客户机和服务器方式测试网络连接。 pctt 工具位于 Linux 和 AIX 系统上的 ~/sqllib/bin 文件夹以及 (Windows) 系统上的 C:\Program
Files\IBM\SQLLIB\bin 文件夹中。 该工具在客户机与服务器之间建立单独的网络连接以进行测试。注: 当处于服务器方式 (例如,
pctt s /b 32767) 时,指定较大的缓冲区大小可能会导致侦听器进行核心转储。 请使用较小的缓冲区大小。 此程序可能不会重现任何间歇性连接问题。 pctt 的用法记录在 IBM Db2 Universal Database 故障诊断指南。 的第 132 页中运行 Db2 随附的 ping 命令,以确定是否存在不一致的等待时间问题。
$ db2 ping dbName request 32767 5 Elapsed time: 692983 microseconds Elapsed time: 419739 microseconds Elapsed time: 419867 microseconds Elapsed time: 210229 microseconds Elapsed time: 210103 microseconds $ db2 ping dbName response 32767 5 Elapsed time: 1241 microseconds Elapsed time: 1217 microseconds Elapsed time: 1236 microseconds Elapsed time: 2575774 microseconds <<<<< 2.5 seconds Elapsed time: 3526 microseconds
Db2 使用 TCP/IP 连接 KEEPALIVE 选项来检测是否发生了连接故障。 此选项定期传输消息以确定合作伙伴是否仍处于活动状态。 如果合作伙伴未能对此消息作出响应,那么认为连接已中断,并且会返回错误。