mysql crash定位分析_MySQL实例crash的案例详细分析

【问题描述】

我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21),不定期的会crash,但error log中只记录了重启信息,未记录crash时的堆栈:

mysqld_safe Number of processes running now: 0mysqld_safe mysqld restarted

接下来首先排查系统日志/var/log/message文件,crash时没有其他异常信息,也不是OOM导致的。

【排查思路】

由于日志中未记录有价值的信息。为定位crash的原因,首先开启mysql core dump的功能。

下面是开启core dump的步骤:

1、 在my.cnf文件中增加2个配置项

[mysqld]core_file[mysqld_safe]core-file-size=unlimited

2、修改系统参数,配置suid_dumpable

echo 1 >/proc/sys/fs/suid_dumpable

3、重启mysql服务,配置生效

【问题分析】

开启core dump后,服务器再次crash时生成了core file。

用gdb分析生成的core file,可以看到crash时的堆栈信息如下:

f4c0946cc3d6c0b424280632a64c8b27.png

从函数table_esms_by_digest::delete_all_rows可以看出触发crash的是truncate table events_statements_summary_by_digest操作。

我们内部有个DML的分析工具,用来统计数据库每分钟增删改查的访问量。该工具的数据源是events_statements_summary_by_digest表,采集程序会每一分钟采集一次这张表的数据,采集完成后执行truncate操作。

暂停这组集群上DML采集程序后MySQL没有再发生crash。

进一步分析多个core file,发现最终函数的调用都发生在_lf_pinbox_real_free函数上。

结合现场环境,有两处地方值得分析:

1、 内存的不正常值。当打印该变量时,此处变量的地址偏低,不太正常:

(gdb) p pins->pinbox$2 = (LF_PINBOX *) 0x1367208

2、红字部分为pfs逐条释放digest记录的操作,正在释放某行数据时出现错误:

void reset_esms_by_digest(){uint index;if (statements_digest_stat_array == NULL)return;PFS_thread *thread= PFS_thread::get_current_thread();if (unlikely(thread == NULL))return;for (index= 0; index < digest_max; index++){statements_digest_stat_array[index].reset_index(thread);statements_digest_stat_array[index].reset_data();}digest_index= 1;}

猜测有两种可能导致错误:

1、高并发下,对内存访问出现冲突;

2、某个特殊SQL导致,在处理hash时。

在网上搜索类似的问题,有了进一步的进展,基本确定了这个问题是bug导致

如下Mysql的bug report中讲述了类似问题

https://bugs.mysql.com/bug.php?id=73979

更详细的环境描述如下连接中

https://bugs.launchpad.net/percona-server/+bug/1351148

查到5.6.35上的bug fix的修复内容,和我们碰到的情况非常类似。

对比_lf_pinbox_real_free的修改,该部分确实进行很大的调整。

下面是MySQL 5.6.35函数_lf_pinbox_real_free的代码片段:

static void _lf_pinbox_real_free(LF_PINS pins){LF_PINBOX pinbox= pins->pinbox;struct st_match_and_save_arg arg = {pins, pinbox, pins->purgatory};pins->purgatory= NULL;pins->purgatory_count= 0;lf_dynarray_iterate(&pinbox->pinarray,(lf_dynarray_func)match_and_save, &arg);if (arg.old_purgatory){void *last= arg.old_purgatory;while (pnext_node(pinbox, last))last= pnext_node(pinbox, last);pinbox->free_func(arg.old_purgatory, last, pinbox->free_func_arg);}}

下面是MySQL 5.6.21函数的_lf_pinbox_real_free的代码片段

static void _lf_pinbox_real_free(LF_PINS pins){int npins;void list;void **addr= NULL;void first= NULL, last= NULL;LF_PINBOX pinbox= pins->pinbox;npins= pinbox->pins_in_array+1;if (pins->stack_ends_here != NULL){int alloca_size= sizeof(void )LF_PINBOX_PINSnpins;if (available_stack_size(&pinbox, *pins->stack_ends_here) > alloca_size){struct st_harvester hv;addr= (void **) alloca(alloca_size);hv.granary= addr;hv.npins= npins;_lf_dynarray_iterate(&pinbox->pinarray,(lf_dynarray_func)harvest_pins, &hv);npins= hv.granary-addr;if (npins)qsort(addr, npins, sizeof(void *), (qsort_cmp)ptr_cmp);}}

同时观察到出问题的集群有指标异常,QPS不到6000,Threads_connected将近8000。(对比其他高并发的集群,QPS在20000以上,Threads_connected也只有300左右)。

排查应用端的连接方式,了解到其中一个应用有近百台应用服务器,可能同时发起请求,却没有合理的复用连接,维持大量的连接线程增大了bug触发的概率。

Bugs Fixed的描述如下:Miscalculation of memory requirements for qsort operations could result in stack overflow errors in situations with a large number of concurrent server connections. (Bug #73979, Bug #19678930, Bug #23224078)

【解决思路】

我们通过分析crash时的core file文件,找到crash时的触发条件,暂停DML采集程序(truncate table events_statements_summary_by_digest操作)后恢复。

后面了解到这是MySQL的一个bug,在MySQL 5.6.35版本后已修复。这个bug在应用端与数据库建立大量的连接时,更容易触发。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

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

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

相关文章

matlab 读取照片imread,利用matlab读取图像

怎样用matlab读取20张图片并依次展示出来指定路径下 单个文件夹data中所有图像 P .\data\;% 图像文件夹路径 img_path_list dir(strcat(P,*.jpg));%获取该文件夹中所有jpg格式的图像 N length(img_path_list);%获取图像总数量 for j 1:N%逐一读取图像 image_name img_path…

python元素定位input button_python+selenium 定位到元素,无法点击的解决方法

报错selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (234.75, 22). Other element would receive the click: 需要点击的按钮页面显示不了&#xff0c;需要下拉滚动条&#xff0c;能看到按钮了才能点1、尝试下拉一段滚动条&#…

python模拟浏览器请求的库_基于Python模拟浏览器发送http请求

1.使用 urllib2 实现#! /usr/bin/env python# -*- codingutf-8 -*-import urllib2url"https://www.baidu.com"req_header {"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11&…

owncloud8 php,owncloud-8.2.3

安装依赖Red Hat Enterprise Linux and CentOS 6 still ship with PHP 5.3. ownCloud requires PHP 5.4 or better. There areseveral third-party repositories that supply PHP 5.4, but you must use the Software Collections (SCL) repository to bein compliance with yo…

php7 提示500错误解决,升级php7出现500错误怎么办

升级php7出现500错误怎么办发布时间&#xff1a;2020-08-24 10:40:45来源&#xff1a;亿速云阅读&#xff1a;69作者&#xff1a;小新小编给大家分享一下升级php7出现500错误怎么办&#xff0c;希望大家阅读完这篇文章后大所收获&#xff0c;下面让我们一起去探讨吧&#xff01…

oracle 怎么 制造崩溃,oracle数据库崩溃

通过幸存oracle文件修复oracle9i数据问&#xff1a;我没有备分oralce,也没有导出数据库&#xff0c;现在操作系统崩溃了&#xff0c;但是oracle目录下的文件很完整&#xff0c;请问如何修复我的表&#xff1f;答:建一个相同的数据库(磁盘目录相同&#xff0c;否则要改init文件&…

php 500 yii,yii2.0出现500错误怎么办

1、首先开启web/index.php defined(YII_DEBUG) or define(YII_DEBUG, true); 将此改为true&#xff1b;看下报错的问题&#xff1a;Exception (Invalid Configuration) yii\base\InvalidConfigException with message The directory is notwritable by the Web process: /home/…

受迫阻尼 matlab 仿真,MATLAB系统仿真报告——有阻尼受迫振动系统

一、 问题描述有阻尼受迫振动的结构及基本原理图一 有阻尼的受迫振动系统图1为有阻尼的受迫振动系统&#xff0c;质量为M&#xff0c;摩擦系数为B&#xff0c; 弹簧倔强系数为K。拉力、摩擦力和弹簧力三都影响质量为M的物体的加速度。如果系统的能量守恒&#xff0c;且振动一旦…

php 数组 定义 遍历,php针对数组的定义、遍历及删除

本篇文章主要介绍php针对数组的定义、遍历及删除&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。本文实例讲述了php实现搜索一维数组元素并删除二维数组对应元素的方法&#xff0c;具体如下&#xff1a;定义一个一维数组一个二维数组如下$fruitarray(apple,or…

Linux怎么对文件内容trim,Linux平台下SSD的TRIM指令的最佳使用方式(不区别对待NVMe)...

SSD写数据会出现什么问题SSD读写的单位不是位&#xff0c;而是一个块。如果要改变这个块中的一位&#xff0c;首先要将整个块擦写成1&#xff0c;然后再写入更新的数据。为了解决擦写块的低效&#xff0c;SSD的策略是将需要改写的块&#xff0c;读取出来&#xff0c;进行数据修…

linux命令行如何上翻,Linux学习教程-获取可用命令行参数 or 文件上下翻转和左右翻转...

导读前面使用的&#xff0c;有几个用到了参数如ls -l, head -n 6等&#xff0c;需要注意的是跟参数之间要有空格。获取可用命令行参数终端运行man ls可以查看ls所有可用的参数&#xff0c;上下箭头翻页&#xff0c;按q退出查看。(man: manual, 手册)ctehbio:~/data$ man lsNAME…

用微PE安装KALI LINUX到U盘,【U盘安装kali】U盘 kali pe三合一教程!装机,存储

最近发现U盘可以做出pekali正常u盘的结合教程&#xff0c;并且可以正常当做U盘使用&#xff0c;但是在网上各种教程下我出现了各种问题&#xff0c;整整三天捣鼓&#xff0c;终于实现了这个操作&#xff0c;并且解决了persistence存储问题&#xff01;现在将来以最详细的图文来…

linux dns中文域名,Linux 搭建中文域名的DNS服务器

配置之前先来解释一下中文域名是如何工作的&#xff1a;当我们在浏览器上输入 朝阳.北京.中国 这个域名的时候 浏览器会把中文域名翻译成Punycode编码然后再传送给DNS服务器解析&#xff0c;例如 朝阳.北京.中国 翻译成Punycode编码以后就是xn--tpv116h.xn--1lq90i.xn--fiqs8s朝…

linux内核全局变量同名,Linux系统下DSO同名全局变量浅析

最近重温了一下《程序员修养》&#xff0c;又搞懂了一些叽里旮旯的问题&#xff0c;现将DSO同名全局变量问题进行简单小结&#xff0c;具体的讲解请看《程序员修养》一书。程序员的自我修养—链接、装载与库.pdf版下载在Linux公社的1号FTP服务器里&#xff0c;下载地址&#xf…

linux切换到字符界面stemctl,CentOS7两种模式

1.13 救援模式忘记root用户密码修改密码&#xff1a; 单用户模式(但只能物理机操作不能远程操作&#xff0c;gaub没加密或者知道gaub才能修改)忘记root用户密码修改密码&#xff1a; 单用户模式(但只能物理机操作不能远程操作&#xff0c;gaub没加密或者知道gaub才能修改)关机 …

山东科技大学c语言完全题库,“山东科技大学十大未解之谜”之完全解答

“山东科技大学十大未解之谜”之完全解答(2012-04-24 13:53:36)标签&#xff1a;娱乐当我还是一枚小正太刚刚进入山科大的时候&#xff0c;我就看到过这些未解之谜&#xff0c;现在每每看到童鞋们转发这篇经久不衰的文章并且表达自己的疑问&#xff0c;我作为一名资深理科技术宅…

android广播注册源码,android 广播源码简要分析-注册

android broadcast1&#xff0c;广播注册静态注册&#xff1a;在系统服务启动时会添加PackageManagerService&#xff0c;在该类的构造方法中就会对各个应用安装目录的apk文件进行扫描解析详细步骤1&#xff0c;PackageManagerService初始化的时候&#xff0c;扫描系统目录下的…

android盒子改造,【当贝市场】废旧手机改造成电视盒子详细教程

3.直接即可输出视频了&#xff0c;然后在手机上安装暴风影音等视频软件的tv版&#xff0c;即可开始观看。有人会说&#xff0c;旧手机电池不行&#xff0c;看一会儿就得没电&#xff0c;怎么办&#xff1f;首先&#xff0c;在你输出到电视时&#xff0c;你就可以给手机锁屏&…

android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解

PX(pixel):即传统计算机语言中描述的像素&#xff0c;在Android则代表绝对像素。之所以Android中不推荐使用这种单位&#xff0c;正是因为不同生产厂商&#xff0c;不同品牌&#xff0c;不同屏幕的设备&#xff0c;其分辨率亦不一。举例来说&#xff0c;我们现在将某个Button的…

android 播放器 反交错,反交错- 视频横纹处理

以下名词解释摘自维基百科反交错”(deinterlacing)是将交错式(即隔行扫描)(interlace)影像讯号转换为渐进式(逐行扫描)(progressive)影像讯号的一种方法。因为装置处理速度以及带宽的限制下&#xff0c;广播电视系统&#xff0c;例如NTSC或是PAL&#xff0c;都是使用交错式讯号…