mysql 登录hang_MySQL客户端连接登入hang住原因分析

2023-10-26

作者:八怪(高鹏) 中亦科技数据库专家

原文:https://www.jianshu.com/p/93b69955344b

一、问题来源

问题来自一位朋友,如下:

e137be045d32bc1a72eec2f6682b3b36.pngmysql客户端无法登陆,查看服务器负载没有发现高负载信息。通过pstack查看线程栈信息,没有发现异常信息。

二、问题诊断和解决

一般来讲出现这种情况,我们会使用pstack看看新建立的线程为在什么函数上卡住了,然后很容易就能找到原因。但是出现这个问题过后,当mysql发起连接后卡住后,使用pstack查看mysqld服务端的进程,发现根本就没有线程与之进行交互,因此mysqld怀疑监听线程是不是出了什么问题,因此对mysql客户端连接进程进行了pstack发现如下:

#0  0x00007f262e7889c0 in __connect_nocancel () from /lib64/libpthread.so.0

#1  0x0000000000435123 in inline_mysql_socket_connect (src_file=0x504490 "../../mysql-8.0.20/vio/viosocket.cc", src_line=1054, len=110, addr=0x7fffb38daa20, mysql_socket=...) at ../../mysql-8.0.20/include/mysql/psi/mysql_socket.h:647

#2  vio_socket_connect (vio=0x110d2c0, addr=addr@entry=0x7fffb38daa20, len=len@entry=110, nonblocking=, timeout=-1, connect_done=connect_done@entry=0x7fffb38da9ef) at ../../mysql-8.0.20/vio/viosocket.cc:1054

#3  0x0000000000422ad6 in csm_begin_connect (ctx=0x7fffb38daad0) at ../../mysql-8.0.20/sql-common/client.cc:250

#4  0x000000000041fe99 in mysql_real_connect (mysql=mysql@entry=0xaf16a0 , host=host@entry=0x0, user=user@entry=0x10defc0 "root", passwd=passwd@entry=0x10deff0 "xsh0923", db=db@entry=0x0, port=, unix_socket=0x10e0860 "/data/mysql3306/tmp/mysql.sock", client_flag=66560) at ../../mysql-8.0.20/sql-common/client.cc:5600

#5  0x000000000040ddb6 in sql_real_connect (silent=0, password=0x10deff0 "xsh0923", user=0x10defc0 "root", database=0x0, host=0x0) at ../../mysql-8.0.20/client/mysql.cc:4515

#6  sql_connect (host=0x0, database=0x0, user=0x10defc0 "root", password=0x10deff0 "xsh0923", silent=) at ../../mysql-8.0.20/client/mysql.cc:4670

#7  0x000000000040968b in main () at ../../mysql-8.0.20/client/mysql.cc:1326

#8  0x00007f262ce3e495 in __libc_start_main () from /lib64/libc.so.6

#9  0x000000000040a4e1 in _start () at ../../mysql-8.0.20/include/my_alloc.h:86

实际上mysql卡住connect函数上面如下:

2f73ed03da6fa50afe2dce4e8b7a26d0.png

因此mysql客户端和mysqld服务端都还没有建立好连接,netstat查看如下:

unix  2      [ ACC ]     STREAM     LISTENING     8584712  29676/mysqld         /tmp/mysqlx.sock

unix  7      [ ACC ]     STREAM     LISTENING     8584713  29676/mysqld         /data/mysql3306/tmp/mysql.sock

unix  2      [ ]         STREAM     CONNECTING    0        -                    /data/mysql3306/tmp/mysql.sock

unix  2      [ ]         STREAM     CONNECTING    0        -                    /data/mysql3306/tmp/mysql.sock

unix  2      [ ]         STREAM     CONNECTING    0        -                    /data/mysql3306/tmp/mysql.sock

大量connectint状态的连接

然后做了strace mysqld的监听线程的操作,得到的结果如下:

9de68520c32e25e871885916ce7f1178.png正常的情况下这里应该是poll和accept然后开启新的(或者从缓存线程中拿一个)线程来处理交互信息了。但是这里我们可以清晰的看到出现了SIGSTOP信号。随即查看正mysqld线程的状态如下:

65a499d99f6a4c792a2f3caf1b7ca52e.png所有的线程都处于T状态下,这个状态正是由于信息SIGSTOP引起的。因此我们发一个SIGCONT信号给mysqld进程就好了如下:

kill -18 29676

三、关于信号

下面是我学习信号的时候一些笔记。

在Linux中信号是一种由内核处理的一种软中断机制,他满足简单、不能携带大量信息、并且要满足一定条件才会发送等特征。信号会经历如下过程:

产生-->阻塞信号集-->未决信号集-->信号递达-->信号处理方式

首先信号的产生可以有多种方式比如我们经常用的kill命令就是发起信号的一种手段如下:

[root@mgr4 8277]# kill -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP

6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1

11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM

16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ

26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR

31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3

38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7

58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

我们经常的按键也可以产生

Ctrl+c 2)SIGINT

Ctrl+\ 3)SIGQUIT

Ctrl+z 4)SIGTSTP

当然还有很多其他触发方式比如硬件异常,raise函数,abort函数,alarm函数等等。其次是阻塞信号集,阻塞信号集能够对想除(9/19号信号以外)的信号进行屏蔽,如果屏蔽后信号自然不会到达 递达 状态,也就谈不上处理了。通过sigprocmask函数进行阻塞信号集的设置,但之前必须要设置sigset_t 集合,通过sigaddset、sigdelset、sigemptyset、sigfillset等函数设置。

未决信号集是不能被操作的,只能被获取通过sigpending函数获取,但是他和阻塞信号集一起可以控制信号的递达。

信号递达后就需要处理信号,默认的行为上面都列举了,但是信号(9/19号信号以外)是可以被捕获改变其处理方式的,我们可以自定义函数作为某个信号的处理方式,这可以通过signal函数和sigaction函数进行捕获和处理,sigaction函数相对复杂需要有一个struct sigaction的结构体变量,其中包含了sa_handler\sa_mask\sa_flags\sa_siaction 成员,这里不做解释可以自行查看Linux man page。

上面是单进程下的信号处理方式,在多线程下,线程之间公用处理方式,但是可以有不同的信号屏蔽集,在多线程下一般采用设置统一的信号屏蔽字和信号处理方式使用pthread_mask函数继承到各个线程,同时使用sigwait/sigwaitinfo等函数设置一个单独的信号处理线程来进行统一处理,MySQL就是这样处理的。MySQL实际上有一个信号处理线程,

|     36 |         1927 | sql/signal_handler              |    NULL | BACKGROUND | NULL   | NULL         |

如果需要了解可以参考如下文章: MySQL中对信号的处理(SIGTERM,SIGQUIT,SIGHUP等), http://blog.itpub.net/7728585/viewspace-2142060/

四、pstack和SIGSTOP

这里简单提一下pstack抓取线程栈的时候会触发一个SIGSTOP信号,因为pstack实际上调用的就是gdb的如下命令:

/usr/bin/gdb --quiet -nx /proc/8277/exe 8277

thread apply all bt

输出所有线程信息

gdb通常会发起SIGSTOP信号来停止进程的运行,因此我们在线上执行pstack命令的时候一定要小心,pstack可能导致你的MySQL停止运行一小会,特别是高压力线程很多负载很高的情况下,可能需要很长的时候,pstack应该作为线上重要数据库最后不得已而为之的诊断方式。

如下我们使用pstack 来获取mysqld的栈,运行一开始就关闭窗口,此时我们的mysqld已经处于停止状态如下:

1a3fcd82aba27eed66ed0dd14237c32a.png

因此使用pstack一定要格外小心。一般来讲从库线程不多压力不大重要性不高可以使用pstack进行信息采集。当然也可以手动发起SIGSTOP信号来达到测试效果。

7f6bdac1468bc90b20f431d5df73ff98.png

五、捕获所有的信号

下面一个小代码可以捕获所有的信号供测试:

#include 

#include 

#include 

#include "unistd.h"

void handler(int sig)

{

printf("get signal %d\n",sig);

}

void test()

{

;

}

int main(void)

{

struct sigaction s;

int* a=NULL;

int  i=0;

a=(int*)calloc(32,sizeof(int));

for(i=0;i<32;i++)

{

*(a+i) = (i+1);

}

s.sa_handler=handler;

for(i=0;i<32;i++)

{

sigaction(*(a+i),&s,NULL);

}

while(1)

{

test();

sleep(1);

}

return 0;

}

全文完。

Enjoy MySQL :)

扫码添加作者微信

986f7c9ef7bc2e9edd7622ea7c84597c.png

叶老师的「MySQL核心优化」大课已升级到MySQL 8.0,扫码开启MySQL 8.0修行之旅吧

4916dcf49a57907305b23864afb4a552.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 登录hang_MySQL客户端连接登入hang住原因分析 的相关文章

  • 声笔码6.00版使用指南

    声笔码6 00版使用指南 声笔码发明人兼设计人 戴石麟 电邮 sbxlm 126 com 一 声笔码简介 1 声笔码6 00版的新特性 与声笔码5 00版相比 声笔码6 00版具有下面一些新的特性 1 对笔画的表示方式进行了调整 原来是用字
  • 解构赋值

    解构赋值是一种表达式 允许您使用数组或对象 将可迭代对象的值或属性分配给变量 解构赋值能让我们用更简短的语法进行多个变量的赋值 大大的减少了代码量 解构表达式有两种 array和object 1 数组 E6之前 我们可以这种形式将数组的内容
  • python点云处理算法汇总(长期更新版)

    目录 测试数据 百度网盘 一 读写显示 二 KD树与八叉树 三 点云特征 四 点云滤波 五 点云配准 六 点云分割拟合 七 mesh操作 八 三维重建 九 可视化 十 RGBD 十一 python 十二 基础操作 测试数据 Open3D算法
  • 【C】cannot convert ‘<brace-enclosed initializer list>‘ to ‘int‘ in assignment

    转载 https blog csdn net modi000 article details 108180978 原因 数组定义与初始化分开时 只能进行单个元素的赋值 而不能进行统一赋值
  • 深度确定性策略梯度(DDPG)

    1 从随机策略到确定性策略 从DDPG这个名字看 它是由D Deep D Deterministic PG Policy Gradient 组成 PG Policy Gradient 我们在强化学习 十三 策略梯度 Policy Gradi
  • Pytorch学习率调整策略

    PyTorch学习率调整策略 学习率可以直接控制模型参数更新的步伐 在整个模型训练过程中学习率并不是一成不变的 而是可以调整变化的 如果想要模型训练到理想的效果 必须在训练后期调整学习率 防止模型训练遇到局部最优就停下来了 PyTorch学
  • 决策树分类和预测算法的原理及实现

    作者 蓝鲸 算法决策树是一种通过对历史数据进行测算实现对新数据进行分类和预测的算法 简单来说决策树算法就是通过对已有明确结果的历史数据进行分析 寻找数据中的特征 并以此为依据对新产生的数据结果进行预测 决策树由3个主要部分组成 分别为决策节
  • Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性

    RelativeLayout中子控件常用属性 子控件默认是从父控件的左上角开始排列的 相对于父控件 android layout alignParentTop true 和父控件的顶部对齐 android layout alignParen
  • 编译原理实验一 词法分析

    编译原理实验一 词法分析 实验目的 1 根据 PL 0 语言的文法规范 编写PL 0语言的词法分析程序 或者调研词法分析程序的自动生成工具LEX或FLEX 设计并实现一个能够输出单词序列的词法分析器 2 通过设计调试词法分析程序 实现从源程
  • 微信小程序头部导航栏返回键,返回到指定页面

    onUnload function wx reLaunch url my my onUnload 参考微信小程序页面路由
  • VTK教程(1):VTK基础知识

    VTK教程 1 VTK基础知识 VTK Visualization Toolkit 是一个功能强大的开源图形和可视化库 用于处理和可视化各种类型的数据 包括几何数据 图像 体数据 矢量场等 以下是VTK的基础知识 数据类型和数据集 VTK支
  • 数据库之MySQL基本操作

    数据库之MySQL 可以把MySQL看成一款支持远程操作文件的软件 库 gt gt gt 文件夹 表 gt gt gt 文件 记录 gt gt gt 文件内一行行的数据叫做一条条的记录 表头 就是表格的第一行数据 字段 字段名 字段类型 本
  • 【VUE3+AntV-G2】数据可视化 封装antv G2 气泡图组件

    一些废话 默默做前端 分享一些自己在项目需求实现中遇到的奇妙问题 主要是网上搜索不到解决办法自己解决后的总结方法和解决办法但不全面 自己整理总结的存档 事发背景 原型绘制了需要同时展示多个指标的数据气泡图 想到可以使用antv的气泡图 刚好
  • 顺序表和单链表基本操作的实现

    1 顺序表的建立 取指定元素 返回指定元素位置 2 顺序表中插入新元素 删除指定元素操作的实现 3 单链表的建立 取指定元素 返回指定元素位置 4 单链表中插入新元素 删除指定元素操作的实现 该主要完成单链表中基本操作的实现 单链表中的元素
  • 【C语言】简易计算器的模拟实现

    前言 最近在复习指针和数组 发现之前没写过利用函数指针数组来实现计算器的博客 所以今天就来写一下 引入 先来复习一下函数指针和函数指针数组的知识 函数指针 语法格式 函数返回类型 pf 函数各个参数的类型 函数名 例子 include
  • 2020-09-20

    一 Bootstrap Jumbotron 超大屏幕 1 1 基本的超大屏幕可以通过在 元素 中添加 jumbotron 类来创建 jumbotron
  • adf盖怎么打开_打印机墨盒怎么更换,看我这篇文章就够了

    有的小伙伴后台私信小编 说想更换打印机墨盒却不知道怎么下手 今天小编就给大家说说 教科书 般的墨盒更换方法 今天以HP deskjet 4729 为例来讲解 步骤一 取出需要更换的墨盒 1 将打印机接通电源并开机 请确保打印机处于正常待机状
  • Repeater没有数据时显示空行

    网上看了很多一般都是重写repeater控件 不过发现一个超简单的方法 直接利用FooterTemplate 在里面加上
  • 大佬给鸿星尔克写了一个 720° 看鞋展厅

    前段时间 在各大互联网平台 鸿星尔克成为了顶流般的存在 鸿星尔克官方账号更是一夜暴涨百万粉丝 直播间产品也被卖到下架 在鸿星尔克捐款的消息出现之后 在短短的几天里 鸿星尔克的销售额就超过了上半年的总销售额 一周前 有一个程序员 蓝色的秋风在

随机推荐

  • 使用Keras中的LSTM完成温度预测问题,并对模型提出不同的改进方法,如:逆向、双向、丢包等

    前言 本例使用的是一个天气时间序列数据集 由德国耶拿的马克思普朗克生物地球化学研究所的气象站记录 这个例子作为初学者必看的例子之一 在这个数据集中 每十分钟记录14个不同的量 比如风向 湿度等 其中包含多年的记录 最原始的数据可以追溯到20
  • 服务器 多个操作系统,多个不同操作系统服务器

    多个不同操作系统服务器 内容精选 换一换 切换操作系统是为您的云服务器重新切换一个系统盘 切换完成后云服务器的系统盘ID会发生改变 并删除原有系统盘 如果云服务器当前使用的操作系统不能满足业务需求 如软件要求的操作系统版本较高 您可以选择切
  • 金字塔思维

    金字塔思维让表达主题明确 人们很难记住7个以上的东西 条理清晰的文章有金字塔结构 搭建金字塔 缺乏思想的句子不是好句子
  • MySQL触发器

    按照 MySQL必知必会 的例子创建触发器 结果报错 因为在触发器中允许调用存储过程 执行INSERT UPDATE DELETE等操作 但却唯独不允许返回任何结果 仔细一查 原来是版本变更导致的问题 创建成功的代码 先定义用户变了 a 或
  • java使用libreOffice预览word,ppt,txt等文档

    首先电脑上需要下载libreOffice 中文官网下载地址 https zh cn libreoffice org download libreoffice 安装过程较为简单 安装完需要重启完成配置 不要安装在中文目录下 验证libreOf
  • 微博存在的伦理道德问题

    开心的事写在微信 生活的事写在qq 伤心的事写在微博 因为微信里有父母 qq里有朋友 微博里有自己 微博作为一种即时媒体 已经成为大家宣泄自己情绪的场所了 它 开放式讨论 的共同优势 是人们在社会热点新闻特别是突发事情发作后讨论事故缘由 考
  • 熵 熵的简单理解和实例

    熵 熵的简单理解和实例 熵是信息量 越大越混乱 越小越确定 1 熵的由来 假设两个相互独立随机变量 x y的概率分布分别为p x p y 那么联合概率分布 P x y p x p y P x y p x p y P x y p x p y
  • 10 个免费学习编程的最佳网站

    来源 https us niemvuilaptrinh com article 11 webiste to practice code online 一旦我们开始学习了编程语言的基础知识 接下来 我们要将这些知识应用到实际项目中 就是要更长
  • [JAVA][2013蓝桥杯预赛 JAVA本科B组][世纪末的星期]

    标题 世纪末的星期 曾有邪教称1999年12月31日是世界末日 当然该谣言已经不攻自破 还有人称今后的某个世纪末的12月31日 如果是星期一则会 有趣的是 任何一个世纪末的年份的12月31日都不可能是星期一 于是 谣言制造商 又修改为星期日
  • 如何使用element-ui进行主题的切换呢

    我们在使用element ui框架的时 有很多时候主题的配色都是我们不喜欢的 那这个时候element ui的组件库就帮助我们推出了一套主题定制 用来帮助我们切换主题 方法也很简单 在项目中改变sass变量 首先在项目中src文件创建一个s
  • Python3.9 解决 ImportError: No system module pywintypes (pywintypes39.dll) 的方法

    今天在使用 pywintypes 库的时候 莫名其妙就出现了 ImportError No system module pywintypes pywintypes39 dll 报错 详细报错信息如下 解决方法如下 项目使用的是虚拟环境 第一
  • 如何解决springboot参数传中文乱码

    前言 本文案例来自业务部门的一个业务场景 他们的业务场景是他们部门研发了一个微服务上下文透传组件 其透传原理也挺简单的 就是通过springboot拦截器把请求参数塞进threadlocal 然后下游通过threadlocal取到值 服务之
  • 时序预测

    时序预测 MATLAB实现AR时间序列预测 目录 时序预测 MATLAB实现AR时间序列预测 基本介绍 程序设计 学习总结 参考资料 基本介绍 如果某个时间序列的任意数值可以表示自回归方程 那么该时间序列服从p阶的自回归过程 可以表示为AR
  • stable diffusion实践操作-常见lora模型介绍

    系列文章目录 本文专门开一节写Lora相关的内容 在看之前 可以同步关注 stable diffusion实践操作 文章目录 系列文章目录 前言 一 什么是lora 1 1 lora 定义 1 2 lora的基本原理 1 2 通过分层控制l
  • 面向对象(带参实例)——加减乘除运算

    实现加减乘除运算 代码如下 public class Daican int num1 int num2 public double cal String opr public double cal String opr int num1 i
  • 《信号与系统学习笔记》—信号与系统的时域和频域特性(二)

    注 本博客是基于奥本海姆 信号与系统 第二版编写 主要是为了自己学习的复习与加深 一 一阶与二阶连续时间系统 一 一阶连续时间系统 1 对于一个一阶系统 其微分方程往往表示成下列形式 区中t是一个系数 相应的一阶系统的频率响应是 其单位冲激
  • 锁的升级过程

    再此之前我们需要先了解一下什么是cas和aba 一 CAS 我们使用多线程来访问一个变量的时候 会出现相应的并发的情况 所以我们需要对这个变量进行加锁操作 但是我们也可以不进行加锁 我们先将查询到了的变量值放到内存中 然后将相应的然后我们要
  • ROS的ros_canopen调试

    Ros canopen是ros支持can通信的package 链接 http wiki ros org ros canopen distro indigo Ros canopen包结构如下 SocketCAN是一组开源的CAN驱动程序和网络
  • Linux内核中网络数据包的接收, 涉及到select/poll/epoll

    转自 https blog csdn net dog250 article details 50528280 与网络数据包的发送不同 网络收包是异步的的 因为你不确定谁会在什么时候突然发一个网络包给你 因此这个网络收包逻辑其实包含两件事 1
  • mysql 登录hang_MySQL客户端连接登入hang住原因分析

    作者 八怪 高鹏 中亦科技数据库专家 原文 https www jianshu com p 93b69955344b 一 问题来源 问题来自一位朋友 如下 mysql客户端无法登陆 查看服务器负载没有发现高负载信息 通过pstack查看线程