一、问题描述
近期客户进行业务系统信创适配测试,并选择达梦数据库进行测试。开发人员进行某个业务功能测试时发现达梦数据库连不上,重启数据库后,问题依旧会重现。接到客户反馈的问题,DBA查看达梦数据库的后台日志,使用gdb和dmrdc命令分析core文件定位到具体SQL语句。最后通过调整数据库参数后,问题得到解决。

二、环境说明
数据库:达梦数据库管理系统DM8
[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA:5236服务器[LOCALHOST:5236]:处于普通打开状态登录使用时间 : 19.707(ms)disql V8SQL> select * from v$version;行号 BANNER---------- ---------------------------------1 DM Database Server 64 V82 DB Version: 0x7000c3 03134284172-20241111-249111-200934 Msg Version: 05 Gsu level(3-4) cnt: 36 Gsu level(5) cnt: 0
服务器:鲲鹏920处理器、统信1050e操作系统
三、步骤说明
1、开发人员进行某个业务功能测试时发现达梦数据库连不上,重启数据库后,问题依旧会重现。
2、接到客户反馈的问题,DBA登录服务器看到实例已故障,检查数据库进程 dmserver 出现异常(ps -ef|grep dmserver)。排查数据库日志和操作系统日志,数据库存在STUTDOWN ADORT,但无core详细日志与OOM记录。
3、通过“FATAL”/"ERROR"关键字查阅并分析达梦数据库的运行日志(dm_DMSERVER_202501.log),看到数据库只有“sigterm_handler receive signal 11”这个有效信息。如果发现日志中日志级别为 [ERROR] 或 [FATAL] 标签,则需要具体分析数据库异常停止的原因。

4、实例异常终止或崩溃,需要查看core文件的堆栈来确认发生异常时相关线程的函数调用顺序。
在/etc/sysctl.conf文件中配置kernel.core_pattern参数,执行sysctl -p命令使其生效,执行sysctl kernel.core_pattern命令查看参数是否生效。通过 kill -11 pid手动生成core文件。kernel.core_pattern = /dmdata/coredump/core.%e.%p
相关知识详见(五、Core 文件分析):
https://eco.dameng.com/document/dm/zh-cn/ops/troubleshooting-database.html
5、开发人员对异常功能进行测试,重现问题,并捕获到core dump文件(core.dm_sql_thd.3259348)。根据core名称可以知道dm_sql_thd 线程崩溃。使用gdb和dmrdc命令分析core dump文件,过程如下:
gdb home/dmdba/dmdbms/bin/dmserver core.dm_sql_thd.3259348#使用 GDB 命令解析 core 文件bt#执行bt显示对应的线程堆栈信息info threads#执行info threads显示异常进程号

cd /home/dmdba/dmdbms/bindmrdc sfile=/dmdata/coredump/core.dm_sql_thd.3259348dfile=/home/dmdba/dmdbms/log/core.3259348.txt#根据进程号查找对应SQL语句

6、通过达梦客户端工具登录数据库,执行这条SQL语句,发现数据库真的会崩溃。
SELECT sur.role_id FROM sys_user_role surLEFT JOIN sys_role sr ON sur.role_id = sr.idWHERE sur.user_id = ? and (sr.tenant_id =?or sr.tenant_id is null) and sr.is_enable = ?and sr.del_flag = 0 ;
查看数据库运行日志,报错信息也是一样,因此可以明确就是这个语句导致的。


7、根据core dump日志以及SQL语句的写法,初步判断数据库优化器处理OR写法的SQL遇到BUG问题(pha_nbexp_or_set_opt_flag_if_necessary)。

8、根据pha_nbexp_or_set_opt_flag_if_necessary关键字以及厂家建议(默认29,减去16,结果值13),通过hint优化干预优化器做判断,可以查到查询结果,数据库正常。
相关知识详见(3.1 INI 参数配置说明):
https://eco.dameng.com/document/dm/zh-cn/ops/performance-optimization

select * from v$dm_iniwhere para_name='OPTIMIZER_OR_NBEXP';

SELECT /*+ OPTIMIZER_OR_NBEXP(13) */ sur.role_idFROM sys_user_role surLEFT JOIN sys_role sr ON sur.role_id = sr.idWHERE sur.user_id = ? and (sr.tenant_id =?or sr.tenant_id is null)and sr.is_enable = ? and sr.del_flag = 0
#添加OPTIMIZER_OR_NBEXP(13)参数,验证SQL语句能正常运行。
9、通过调整OPTIMIZER_OR_NBEXP参数值,不需要业务系统调整SQL语句。
修改OPTIMIZER_OR_NBEXP参数,规避SQL优化器BUG问题。
sp_set_para_value(1,'OPTIMIZER_OR_NBEXP',13);select * from v$dm_iniwhere para_name='OPTIMIZER_OR_NBEXP';





