Sybase ASE 16.0数据库无法连接报错There is a protocol packet error. An illegal length was received
1、问题现象:
使用isql无法连接Sybase ASE 16.0数据库服务器,报错:
CT-LIBRARY error:
ct_connect(): network packet layer: external error: There is a protocol packet error. An illegal length was received
查看Sybase ASE 16.0的错误日志文件,发现除了Cannot send, host process disconnected: XXXXXX-PC 29464 suid: 1外无任何错误信息。
数据库服务器版本:Adaptive Server Enterprise/16.0/EBF 22383 SMP/P/x86_64/Enterprise Linux/asecepheus/3530/64-bit/FBO/Sun Feb 16 06:09:40 2014
2、问题分析:
当前Sybase ASE 16.0服务器上已有连接919个。
在Sybase ASE 16.0数据库服务器所在操作系统平台上使用tcpdump抓包:
tcpdump -i ens33 port 5000 -s0 -X -vvvv
再次使用isql尝试登录ASE 16.0数据库服务器,依然无法登录报错There is a protocol packet error. An illegal length was received。
tcpdump抓包显示,从Sybase ASE服务器返回给客户端的数据包中包含错误信息:
There is in sufficient heap memory to allocate 3064 bytes . Please increase configuration parameter 'heap memory per user' or try again when there is less activity on the system.
Invalid role string '' entered
查看ASE 16.0的参数文件发现heap memory per user为默认值4096。
参数heap memory per user配置每个用户的堆内存量。堆内存池是启动时创建的内部内存,任务根据需要用它来动态分配内存。
如果运行使用宽列的任务,它需要使用堆栈中的大量内存,此时内存池就显得非常重要。堆内存分配临时缓冲区,以使这些宽列任务顺利完成。任务结束后,任务所用的堆内存返回堆内存池中。内存池的大小取决于用户的连接数。SAP 建议将 heap memory per user 设置为逻辑页大小的三倍。
3、问题处理:
当前使用isql无法连接Sybase ASE 16.0数据库服务器无法在线增加参数heap memory per user的值。
等待一段时间,其它数据库连接退出了释放了heap memory per user;
或者在Sybase ASE 16.0数据库服务器所在操作系统平台上终止客户端进程(如果有):
netstat -anp | grep 5000 | grep -v '/dataserver'
如果使用isql能够连接Sybase ASE 16.0数据库服务器,在线修改参数:heap memory per user
sp_configure "heap memory per user", 32768
如果仍然无法连接Sybase ASE 16.0数据库服务器,那么修改参数文件:
heap memory per user = 32768
然后重启Sybase ASE 16.0数据库服务器。
4、CR 815501:
CR 815501
Insufficient heap memory message generated without a 712 error reported in the ASE error log. User with sa_role is then unable to log in to ASE to configure an increase in heap memory, attempting to do so gets unhelpful error message "network packet layer: external error: There is a protocol packet error. An illegal length was received.
This CR reserves some heap memory for the emergency login reserved for users with sa_role.
CR 815501 截止2020-08暂时没有补丁修复。只能通过增加参数heap memory per user来防止该问题。