达梦core文件分析(学习笔记)

news2024/11/26 0:41:12

目录

1、core 文件生成

1.1 前置条件说明

1.2 关于 core 文件生成路径的说明

  1.3查看 core 文件的前置条件

2、查看 core 文件堆栈信息

2.1 使用gdb

2.2 使用达梦dmrdc

3、core 分析过程

3.1 服务端主动 core

3.2因未知异常原因导致的 core

4、测试案例

4.1测试环境

4.2生成core文件

4.3 core文件分析


1、core 文件生成

1.1 前置条件说明

        数据库作为系统基础软件,在运行过程中有可能会发生 core dump。 当数据库异常终止或崩溃时,将数据库进程此时使用的内存内容拷贝到磁盘文件中进行存储,以方便编程人员调试。

        注意,上述所说的“异常终止或崩溃”表示数据库可能遇到致命错误,无法按照预定程序逻辑继续执行下去,所以在进程彻底终止之前将其使用的内存区域转存到文件中,

        有时候可能需要手动生成 core 文件,记录下进程当前的内存信息,以便后续进行问题排查,此时可以通过 kill -11 pid 或者 kill –sigsegv pid 手动生成 core 文件。

1.2 关于 core 文件生成路径的说明

1)默认:core 文件默认的存储位置与对应的可执行程序在同一目录下

         core 文件默认的存储位置与对应的可执行程序在同一目录下,文件名是 core,达梦数据库相同。例如,达梦数据库程序目录为 /home/dmdba/dmdbms,则 core 文件生成的路径在 /home/dmdba/dmdbms/bin 下,core 文件名生成规则为 core.pid,其中 pid 表示数据库进程 id。

2)配置文件: /proc/sys/kernel/core_pattern

        也可以手动配置 core 文件的生成路径,需要修改配置文件 /proc/sys/kernel/core_pattern,例如修改生成 core 文件到 /tmp 目录,文件名为 core_pid:echo /tmp/core_%p > /proc/sys/kernel/core_pattern

3)使用sysctl配置

  配置到/etc/sysctl.conf或/usr/lib/sysctl.d/目录下

  例如:echo "kernel.core_pattern = /dm8/coredm/core-%e-%p-%s" >> /etc/sysctl.conf

 执行sysctl --system,使配置生效。

  1.3查看 core 文件的前置条件

1)数据库所在操作系统能够正常运行 gdb 工具。

        gdb 主要在 linux 系统下进行程序调试使用的。为了确保数据库发生 core dump 时能够正常进行分析和调试,应该确保数据库所在系统能够正常运行 gdb 工具,可以使用 gdb -version 进行验证,当出现 gdb 版本信息时表示当前系统能够正常使用 gdb 工具。

gdb -version

2)操作系统已打开生成 core 文件的开关。

        通过 ulimit -c 命令可以查看是否打开生成 core 文件的开关,但返回 0 时表示关闭,当返回数值或 unlimited 时表示已打开。需要注意的是,虽然 ulimit -c 设置具体的数值表示已打开生成 core 文件开关,但是强烈建议达梦数据库服务端设置 core size 设置为 unlimited。

打开生成 core 文件开关:在 /etc/security/limits.conf 应该配置如下内容:

*    soft   core    unlimited

*    hard   core    unlimited

2、查看 core 文件堆栈信息

        core 文件名生成规则为 core.pid,其中 pid 表示数据库进程 id。

        大多数情况下数据库发生 core dump 是因为异常 sql 执行导致,应该使用发生 core dump对应的 dmserver 版本进行 core 文件信息查看和分析,步骤如下:

2.1 使用gdb

使用 gdb 命令解析 core 文件。

gdb $DM_HOME/bin/dmserver core.31820

执行 bt 或 where 会显示对应的线程堆栈信息。

执行 thread apply all bt 可以显示所有线程的堆栈信息,获得 Thread 1 对应的线程号,即 LWP (light weight process,轻量级进程,可简单理解为子进程)号,具体方法如下:

set logging file <文件名>   #设置输出的文件名称

set logging on             #开始将调试信息将输出到指定文件

thread apply all bt        #打印所有线程栈信息

set logging off            #关闭到指定文件的输出

quit                       #结束gdb调试

2.2 使用达梦dmrdc

        使用达梦自带的 dmrdc 工具进行 core 文件分析,能够将数据库进程发生 core dump 时刻所有线程正在执行的 sql 语句分析出来。

./dmrdc sfile=$DM_HOME/bin/core.31820  dfile=$DM_HOME/bin/core_31820.txt

        在 core_31820.txt 中搜索记录的 号,对应的 sql 即为导致本次数据库进程发生 core dump 的 sql 语句。需要注意的是,该 sql 不一定为导致发生 core dump 的决定因素,与数据库中具体的数据记录、redo、undo、数据库缓存区等多种影响因素的具体状态有关,需要进一步进行验证。如果需要获取同一 session 和事务中之前 sql 语句的执行信息,可以根据日志中 sess 或 trxid 字段向上进行检索。

        补充:当由于配置不当未生成 core 文件时,或没有 gdb 无法分析 core 文件时,可以通过操作系统层日志去定位具体导致程序崩溃的相应进程号即号,根据此进程号可以在 dmsql 日志中查找相应 thrd: 执行的最后一条 sql 语句。

3、core 分析过程

3.1 服务端主动 core

        这一类 core dump 问题相对来说比较好定位问题,因为服务端主动 core 表示程序因某种资源不够或已知原因而发生的“自杀”行为,

        一般在达梦数据库运行日志或 core 堆栈中会出现 dm_sys_halt 的信息,这种情况下通过堆栈和日志信息便可以确定发生问题的原因。

3.2因未知异常原因导致的 core

        这一类 core dump 相对来说更加隐晦一些,因为这一类是服务端程序被迫发生的,例如内存访问越界、非法指针、堆栈溢出等问题,

        主要表现为达梦数据库运行日志检查点突然中断,没有任何信息,但这一类问题的原因往往是由某个 sql 语句引发的,只需要找到对应的 sql 语句即可。

        例如,对于如下 core 堆栈来说,可以看出,堆栈的当前帧为 dm_sys_halt_low() 表示是数据库服务端主动 core 的,一般对于主动 core 的问题

        在达梦运行日志中可以找到更为详细的提示信息,可以看到日志中打印的信息为“Redo log try flush over space”表示冲破日志环了。

        发生这样的情况,一般是数据库在执行一个大事务,而当前可用的 redo log 装不下这个事务的数据变化导致的,我们需要优先考虑减少 BDTA_SIZE 以及增大 RLOG_RESERVE_SIZE,之后才是增加 redo 日志或扩大 redo 日志来解决。

4、测试案例

4.1测试环境

操作系统版本:CentOS7.6

数据库版本:dm8_20240712

配置CORE文件路径,用root用户执行

echo "kernel.core_pattern = /dm8/coredm/core-%e-%p-%s" >> /etc/sysctl.conf

检查CORE文件开关

[dmdba@localhost ~]$ ulimit -c

unlimited

默认情况,core文件的配置是unlimited,如果需要配置可以修改/etc/security/limits.conf,例如:

dmdba    soft   core    unlimited

dmdba    hard   core    unlimited

4.2生成core文件

1)尝试用SQL生成core文件

SQL> select trunc(dbms_random.string(0,1000000000)) from dual;
select trunc(dbms_random.string(0,1000000000)) from dual;
[-6111]:Fail to cast string.
used time: 1.203(ms). Execute id is 0

查看core文件是否生成

[dmdba@localhost coredm]$ ll /dm8/coredm/
total 0

没有生成core文件,估计是目前的版本修复了。

2)用kill 生成core 文件

查看pid

ps -ef|grep dmdba
kill -11  25265
ll /dm8/coredm/

core文件名:core-dmserver-25265-8

4.3 core文件分析

1)用gdb分析

gdb  /dm8/dmdbms/bin/dmserver  /dm8/coredm/core-dmserver-25265-8

bt命令用于查看当前函数的调用堆栈信息

查看数据库日志

数据库被强制终止

2)使用达梦dmrdc工具

        达梦自带的 dmrdc 工具进行 core 文件分析,能够将数据库进程发生 core dump 时刻所有线程正在执行的 sql 语句分析出来。

/dm8/dmdbms/bin/dmrdc  sfile=/dm8/coredm/core-dmserver-25265-8  dfile=/dm8/coredm/rdc_25265-8.txt

cat /dm8/coredm/rdc_25265-8.txt

需要注意的是,上面的sql 是core dump发生时刻正在执行的sql,但不一定为导致发生 core dump 的决定因素,需要进一步进行验证。

本文结束!

2024.10.3

参考资料:https://eco.dameng.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2187678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(十八)、登陆 k8s 的 kubernetes-dashboard 更多可视化工具

文章目录 1、回顾 k8s 的安装2、确认 k8s 运行状态3、通过 token 登陆3.1、使用现有的用户登陆3.2、新加用户登陆 4、k8s 可视化工具 1、回顾 k8s 的安装 Mac 安装k8s 2、确认 k8s 运行状态 kubectl proxy kubectl cluster-info kubectl get pods -n kubernetes-dashboard3、…

网页前端开发之Javascript入门篇(4/9):循环控制

Javascript循环控制 什么是循环控制&#xff1f; 答&#xff1a;其概念跟 Python教程 介绍的一样&#xff0c;只是语法上有所变化。 参考流程图如下&#xff1a; 其对应语法&#xff1a; var i 0; // 设置起始值 var minutes 15; // 设置结束值&#xff08;15分钟…

Stream流的终结方法(一)

1.Stream流的终结方法 2.forEach 对于forEach方法&#xff0c;用来遍历stream流中的所有数据 package com.njau.d10_my_stream;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util…

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo 安全帽头盔检测数据集介绍 数据集名称 安全帽头盔检测数据集 (Safety Helmet and Person Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型&#xff08;包括YOLOv5、YOLOv6、YOLOv7…

SpringCloud入门(十一)路由过滤器和路由断言工厂

一、路由过滤器 路由过滤器&#xff08; GatewayFilter &#xff09;是网关中提供的一种过滤器&#xff0c;可以对进入网关的请求和微服务返回的响应做处理&#xff1a; 如图&#xff1a;网关路由过滤器&#xff1a; 路由过滤器的作用是&#xff1a; 1.对路由的请求或响应做加…

第二十章(自定义类型,联合和枚举)

1. 联合体类型的声明 2. 联合体的特点 3. 联合体⼤⼩的计算 4. 枚举类型的声明 5. 枚举类型的优点 6. 枚举类型的使⽤ 光阴如骏马加鞭一、联合体 概念&#xff1a;像结构体一样&#xff0c;联合体也是由一个或者多个成员组成的&#xff0c;这些成员也可以是不同的类型。 …

JavaSE篇:文件IO

一 认识文件 在硬盘这种持久化存储的I/O设备或其他存储介质中 &#xff0c;当我们想要进行数据保存时&#xff0c;往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概念。就类似办公桌上的⼀份份真实的⽂件⼀般。…

疾风气象大模型如何预测气象数据,预测数据怎么获得

随着科技的快速发展&#xff0c;人工智能和大数据技术逐渐渗透到各个领域&#xff0c;气象预测也不例外。过去&#xff0c;气象预测主要依赖于物理模型&#xff0c;结合大气、海洋、陆地等系统的观测数据&#xff0c;通过复杂的数值计算来推测未来天气。而如今&#xff0c;大模…

八、跳跃、闪避

一、人物跳跃功能 1、动画 设置一个bool值 条件设置为true 2、逻辑 实现跳跃&#xff0c;一定有IsGround&#xff1b;判断是否为地面&#xff0c;进行跳跃功能 写一个跳跃和一个条约结束方法 跳跃设置为false&#xff0c;结束设置为true 3、代码 public void Jump() {if…

Ray_Tracing_In_One_Weekend下

1Lambertian漫反射材质 一个物体的材质&#xff0c;可以分成两部分来看&#xff0c;因为物体没有绝对光滑和绝对粗糙 漫反射&#xff1a;由于物体粗糙&#xff0c;那么对于微小平面&#xff0c;光线会向四周反射&#xff0c;光源的一部分光线传回人眼 镜面反射&#xff1a;假…

C++ 类和对象的初步介绍

文章目录 1.面向过程和面向对象的初步认识2.类的引入3.类的定义4. 类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化 1.面向过程和面向对象的初步认识 C语言是面向过程的&#xff0c;关注的过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用…

OpenCV Canny()函数

OpenCV Canny()函数被用来检测图像物体的边缘。其算法原理如下&#xff1a; 高斯滤波&#xff1a;使用高斯滤波器平滑图像以减少噪声。高斯滤波器是一种线性滤波器&#xff0c;可以消除图像中的高频噪声&#xff0c;同时保留边缘信息。计算梯度强度和方向&#xff1a;使用Sobe…

教资备考--高中数学(仅为高中数学梳理)

按照高中学习数学梳理的方案进行整理

爬虫——同步与异步加载

一、同步加载 同步模式--阻塞模式&#xff08;就是会阻止你浏览器的一个后续加载&#xff09;停止了后续的解析 因此停止了后续的文件加载&#xff08;图像&#xff09; 比如hifini音乐网站 二、异步加载 异步加载--xhr(重点) 比如腾讯新闻&#xff0c;腾讯招聘等 三、同…

组合框QGroupBox设置checked属性

我们可以给组合框设置checked属性 //获取和设置checked属性是否开启 bool isCheckable() const void setCheckable(bool checkable)//获取和设置选中还是非选中 bool isChecked() const void setChecked(bool checked)效果如下&#xff1a; 如果checked属性使能之后&#xff0…

Open3D实现点云数据的序列化与网络传输

转载自个人博客&#xff1a;Open3D实现点云数据的序列化与网络传输 在处理点云数据的时候&#xff0c;有时候需要实现点云数据的远程传输。当然可以利用传输文件的方法直接把点云数据序列化成数据流进行传输&#xff0c;但Open3D源码在实现RPC功能时就提供了一套序列化及传输的…

用langchain+streamlit应用RAG实现个人知识库助手搭建

RAG原理概述 RAG&#xff08;Retrieval-Augmented Generation&#xff09; 是一种结合了信息检索和生成式人工智能技术的模型架构&#xff0c;旨在让模型生成更有根据和更准确的回答。通俗来讲&#xff0c;它让模型不只是凭借自己的“记忆”&#xff08;预训练数据&#xff09…

Java中的依赖注入(Dependency Injection, DI)详解

Java中的依赖注入&#xff08;Dependency Injection, DI&#xff09;是软件工程中的一种重要设计模式。它有助于提高系统的可测试性、可维护性和灵活性。通过依赖注入&#xff0c;组件不再负责创建它们所需的对象&#xff0c;而是通过外部的设置来提供这些对象。这种方式也与控…

无人机+无人车+机器狗:综合管控系统技术详解

无人机、无人车、机器狗的综合管控系统技术是一个集成了多种先进技术和设备的复杂系统&#xff0c;旨在实现高效、精准、协同的作业与管理。以下是对该系统技术的详细解析&#xff1a; 一、系统概述 综合管控系统通过集成无人机、无人车和机器狗等智能设备&#xff0c;结合物…

OSDU轻量化单机部署

首先更新系统 sudo apt update sudo apt upgrade -y安装docker sudo apt install -y docker.io sudo systemctl start docker sudo systemctl enable docker安装minikube curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 …