应用系统连达梦数据库报“服务器模式不匹配”的根源与修复方案
近期遇到很多个应用系统连接达梦数据库报“服务器模式不匹配”的问题,省流直接说文章结论通常两种场景
- 初次连接达梦数据库时报服务器模式不匹配,可能是配置文件中LOGIN_MODE参数配置与数据库状态不一致导致连接失败
- 应用系统正常运行负载大或者偶发报服务器模式不匹配,可能是因会话数已达到数据库实例配置的MAX_SESSIONS参数上限导致的,此时应排查故障时间段的实例日志/dm_svc文件配置/url连接串配置
报错说明
应用反馈连接达梦主备集群时报错:服务器模式不匹配,报错截图如下
问题分析
- 这个报错是应用系统在连接达梦数据库时,在dm_svc.conf文件或者连接串中配置的LOGIN_MODE参数引起的报错。
- 当应用发起连接执行getConnection获取连接时主要会经过参数解析、转换服务名、根据模式状态选择合适连接节点。
- 在进行节点选择时会将服务名中配置的节点构造成一个圆环,根据配置的LOGIN_MODE参数选择合适的节点进行连接
- 当出现报错的时候其实就是会话连接根据配置LOGIN_MODE参数规则没有找到合适的数据库节点。
问题复现
第一种情况:最常见的就是数据库状态与LOGIN_MODE参数配置不符,例如数据库中模式是primary,配置文件中写的是login_mode=2 即只连接备库,这种情况就会导致因没有找到合适的节点程序报服务器模式不匹配
SQL> select MODE$ from v$instance;MODE$
-------
PRIMARY
经测试:jdbc中会报服务器模式不匹配,disql的话会报[-70019]:没有匹配的可登陆服务器。
[dmdba@VM-8-14-centos:/opt/dmdbms/bin]$ cat /etc/dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(CN)
DM=(81.70.105.101:5236,81.70.105.102:5236)
[DM]
LOGIN_MODE=(2)[dmdba@VM-8-14-centos:/opt/dmdbms/bin]$ ./disql SYSDBA/Dameng123.@DM
[-70019]:没有匹配的可登陆服务器.
disql V8
第二种情况:数据库实例的会话已被占满,此时应用发起新的会话连接,因数据库会话已满会导致无法获取当前数据库节点的状态,此时会去服务名列表中继续循环下一个。
当配置的是login_mode=1只连主库,而主库会话数已满,按照列表遍历一遍后未找到primary状态的数据库,那么就会报“服务器模式不匹配”。
当达到数据库最大上限后,实例日志中会有while reach maximum session limitation的日志信息来确认该问题。
在目前的版本中该场景的错误已调整为 dm.jdbc.driver.DMException: 超过了最大连接限制