问题描述:
客户反馈应用连接失败,通过服务器端disql 登录数据库,提示登录失败Network communication failure
问题排查:
查看数据库server日志发现报数据库达到最大连接数,查看MAX_SESSIONS的值是1500,
尝试调整MAX_SESSIONS值为3000,重启数据库。
重启数据库发现数据库还是报连接数满了,并且发现数据库还在恢复中,继续重启数据库之前的恢复操作,数据库重启之前恢复了15个page,重启之后继续回滚剩余的203个page,并且持续报reached max session limit。
但是统计数据库的连接数,实际数据库的session并没有达到最大值3000
等待数据库恢复完成,大概三个小时之完成数据库恢复,数据库处于open状态,但是还是持续报reached max session limit。
Jstack转储数据库server进程堆栈信息,发现连接数一直满,没有释放。
从操作系统日志看到,数据库halt时,操作系统会转储数据库进程,发生coredump。
通过分析coredump信息,可以看到每次发生io读超时,会触发数据库halt,数据库挂了之后,守护进程会自动拉起数据库,数据库进入启动进程并恢复数据库一致性状态。
问题解决:
出现这个问题,内部分析可能跟FAST_LOGIN有关,尝试将值设置为1,更改参数后重启数据库,数据库可正常连接。
FAST_LOGIN :是否在登录时记录登录失败历史信息。 0是,同步记录; 1否,不记录; 2是,异步记录,当同一个用户的登录失败记录数超过100,则清理前面过早的登录失败记录,避免登录相关系统表SYSACCHISTORIES膨胀
总结
猜测rollback过程中会报maxsession,因为开启fast_login会去写SYSACCHISTORIES表并更新SYSUSER视图,因此推测rollback过程中路落盘登录信息的时候,tastk队列满,因此误认为max_session满。
达梦技术社区:https://eco.dameng.com