MySQL 死锁检测

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

  对于死锁,MySQL并没有提供提供直接的变量来表示。对于5.5版本之后的performance_shcema可以提供锁的详细信息(但我们还是5.0呢),对于InnoDB自带的监控器 Innodb_lock_monitor 其输出总是输出到错误日志中,不方便进行对比。

    我监控采用的是zabbix,采用agent 被动方式向zabbix server传送数据。脚本为shell,采用show innodb status 重定向

    核心代码:

    
   检测是否为新的死锁信息:
   New_deadlock() {
    new_line_tile=$(grep -n "LATEST DETECTED DEADLOCK" $1 | cut -d ':' -f 1)
    new_line_time=$(echo "$new_line_tile + 2" | bc) 
    last_dect_time="$(head -n $new_line_time $1 | tail -n 1) ###截取死锁发生的时间戳
    
    [ -e $2 ] || cp $1 $2 #拿这次输出信息,和上次输出信息对比;如果是第一次检测,将这次输出信息cp作为上次输出信息
 
    old_line_tile=$(grep -n "LATEST DETECTED DEADLOCK" $2 | cut -d ':' -f 1)
 
    if [ -z $old_line_tile ];then
      echo 1
      mv $1   $2   ##判断上次输出是否为死锁,不是的话,直接返回1 表明最近一次是新的死锁。并将 此次输出信息重命名
      exit 1
   else      ##否则对比两次的时间戳
      old_line_time=$(echo "$old_line_tile + 2" | bc)   
      old_last_dect_time="$(head -n $old_line_time  $2 | tail -n 1)"
      mv $1   $2 #输出信息为下一次检测做准备
 
      if [ "$last_dect_time" = "$old_last_dect_time" ];then
         echo 0
      else
         cp $1 /tmp/$1_detail #已判定为死锁,需要保留作案信息
         echo 1
      fi
   fi
}

deadlock_check() {
   case $1 in
   1)
    $MYSQL_BIN -u $user -p$password  -S $SOC1 -e "show engine innodb status\G" > /tmp/innodb_status_1_$dthm
    have_dead_lock=$(grep -c  "LATEST DETECTED DEADLOCK" /tmp/innodb_status_1_$dthm)
    #判断这次检测是否包含死锁信息,包含的话 让 New_dead_lock 做死锁对比否则 返回0
    if [ $have_dead_lock -gt 0 ];then
       New_deadlock /tmp/innodb_status_1_$dthm /tmp/innodb_status_1_$dt
    else
       echo 0
    fi;;
  2)
    $MYSQL_BIN -u $user -p$password  -S $SOC2 -e "show engine innodb status\G" > /tmp/innodb_status_2_$dthm
    have_dead_lock=$(grep -c  "LATEST DETECTED DEADLOCK" /tmp/innodb_status_2_$dthm)
    if [ $have_dead_lock -gt 0 ];then
       New_deadlock /tmp/innodb_status_2_$dthm /tmp/innodb_status_2_$dt
    else
       echo 0
    fi;;
  3)
    $MYSQL_BIN -u $user -p$password  -S $SOC3 -e "show engine innodb status\G" > /tmp/innodb_status_3_$dthm
    have_dead_lock=$(grep -c  "LATEST DETECTED DEADLOCK" /tmp/innodb_status_3_$dthm)
    if [ $have_dead_lock -gt 0 ];then
       New_deadlock  /tmp/innodb_status_3_$dthm /tmp/innodb_status_3_$dt
    else
       echo 0
    fi;;
  4)
    $MYSQL_BIN -u $user -p$password  -S $SOC4 -e "show engine innodb status\G" > /tmp/innodb_status_4_$dthm
    have_dead_lock=$(grep -c  "LATEST DETECTED DEADLOCK" /tmp/innodb_status_4_$dthm)
    if [ $have_dead_lock -gt 0 ];then
       New_deadlock /tmp/innodb_status_4_$dthm /tmp/innodb_status_4_$dt
    else
       echo 0
    fi;;
  *)
    echo $ERROR
    exit 1;;
  esac
} 

case  $1中的变量是针对不同机器上多个实例的情况,传送socket参数。






本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1180828,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
SQL 关系型数据库 MySQL
遇到mysql数据库死锁,你会怎么排查?
遇到mysql数据库死锁,你会怎么排查?
30 0
|
15天前
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
15天前
|
SQL JavaScript 关系型数据库
Mysql索引不当引发死锁问题
本文通过真实案例解析了MySQL在高并发环境下出现死锁的问题。数据库表`t_award`包含多个索引,但在执行特定SQL语句时遭遇索引失效,导致更新操作变慢并引发死锁。分析发现,联合索引`(pool_id, identifier, status, is_redeemed)`因`identifier`允许为空值而导致索引部分失效。此外,`pool_id`上的普通索引产生的间隙锁在高并发下加剧了死锁风险。为解决此问题,文中提出了调整索引顺序至`(pool_id, status, is_redeemed, identifier)`等方案来优化索引使用,进而减轻死锁现象。
|
20天前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
|
5天前
|
监控 关系型数据库 MySQL
MySQL死锁是什么
【8月更文挑战第26天】MySQL死锁是指两个或多个事务在执行过程中,因争夺锁资源而造成的相互等待的现象,若无外力干涉,它们都将无法继续执行。这种相互等待的情况会导致整个系统陷入停滞状态,影响数据库的性能和稳定性。
24 0
|
2月前
|
SQL 存储 关系型数据库
细说 MySQL 死锁
【7月更文挑战第26天】MySQL 死锁
28 4
|
2月前
|
SQL 存储 关系型数据库
细说 MySQL 死锁
死锁检查在MySQL 8.0中涉及三个主要步骤:构造锁等待图、初始化事务权重和提升权重。首先,当事务进入锁等待状态时,信息会被记录到内存中的`waiting_threads`,形成快照数组。接着,对这个数组进行排序,构造出锁等待图,表示事务间的等待关系。然后,初始化所有等待事务的权重为1,如果一个事务在其他事务等待后进入等待,其权重会被提升,以避免长时间等待。最后,根据锁等待图,提升那些同时阻塞其他事务的权重,但不包括参与死锁的事务。权重更新后,死锁检查线程将依据这些信息来检测和解决死锁。
59 15
|
2月前
|
SQL 算法 关系型数据库
(十)全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
经过《MySQL锁机制》、《MySQL-MVCC机制》两篇后,咱们已经大致了解MySQL中处理并发事务的手段,不过对于锁机制、MVCC机制都并未与之前说到的《MySQL事务机制》产生关联关系,同时对于MySQL锁机制的实现原理也未曾剖析,因此本篇作为事务、锁、MVCC这三者的汇总篇,会在本章中补全之前空缺的一些细节,同时也会将锁、MVCC机制与事务机制之间的关系彻底理清楚。
|
2月前
|
缓存 监控 关系型数据库
MySQL PXC 集群死锁分析案例
前不久一个系统死锁导致部分业务受到影响,今次补上详细的节点日志分析过程。
44 1
|
3月前
|
SQL 监控 关系型数据库
深入解析MySQL死锁:原因、检测与解决方案
深入解析MySQL死锁:原因、检测与解决方案

热门文章

最新文章

下一篇
云函数