暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一条SQL语句搞崩达梦数据库的处理过程

1434

一、问题描述

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


二、环境说明

数据库:达梦数据库管理系统DM8

    [dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA:5236
    服务器[LOCALHOST:5236]:处于普通打开状态
    登录使用时间 : 19.707(ms)
    disql V8
    SQL> select * from v$version;
    行号     BANNER                           
    ---------- ---------------------------------
    1          DM Database Server 64 V8
    2          DB Version: 0x7000c
    3          03134284172-20241111-249111-20093
    4          Msg Version: 0
    5          Gsu level(3-4) cnt: 3
    6          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/bin
          dmrdc sfile=/dmdata/coredump/core.dm_sql_thd.3259348 
          dfile=/home/dmdba/dmdbms/log/core.3259348.txt
          #根据进程号查找对应SQL语句

          6、通过达梦客户端工具登录数据库,执行这条SQL语句,发现数据库真的会崩溃。

            SELECT sur.role_id FROM sys_user_role sur 
            LEFT JOIN sys_role sr ON sur.role_id = sr.id 
            WHERE 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_ini 
              where para_name='OPTIMIZER_OR_NBEXP';
                SELECT /*+ OPTIMIZER_OR_NBEXP(13) */ sur.role_id 
                FROM sys_user_role sur 
                LEFT JOIN sys_role sr ON sur.role_id = sr.id 
                WHERE 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_ini 
                  where para_name='OPTIMIZER_OR_NBEXP';


                  近期热门文章:
                  👉Oracle RAC集群OCR注册信息恢复案例分享
                  👉学习笔记-DM8达梦数据库启动过程
                  👉达梦数据库DM8小版本升级案例分享
                  👉如何利用RMAN Debug命令来诊断问题
                  👉达梦数据守护集群异常脑裂处理案例总结
                  👉Linux运维技能-du命令常见用例总结
                  👉Oracle 10g 备份恢复及容灾部署技术问题总结
                  👉TiDB 7.5 实验测试环境搭建及小插曲处理
                  👉DBA实验手册第3讲 运用bbed工具恢复delete误删除的数据
                  👉DBA实验手册第5讲 运用bbed工具恢复truncate表及反向构造段头块
                  全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

                  文章转载自数据库运维之道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论