近期遇到很多個應用系統連接達夢數據庫報“服務器模式不匹配”的問題,省流直接說文章結論通常兩種場景
- 初次連接達夢數據庫時報服務器模式不匹配,可能是配置文件中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: 超過了最大連接限制