【Java场景题】MySQL死锁排查

news2025/2/21 14:32:06

大家好,今天XiXi给大家分享一个MySQL死锁排查的实验,文章主要有:

  • 通过show engine innodb status,查看最近一次死锁信息
  • 开启innodb_print_all_deadlocks,在错误日志中能够记录所有死锁信息
  • 通过解析binlog日志定位死锁事务全部SQL信息
  • 由于binlog中不会记录查询语句,无法排查因select for update导致的死锁SQL信息,经过研究后,采用通过开启general_log的方式解决

表结构创建

CREATE DATABASE deadlock;
use deadlock;
CREATE TABLE `test_deadlock` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `num` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `test_deadlock` VALUES (1, 1), (2, 2);

死锁场景构建

事务1事务2
use deadlock;use deadlock;
start transaction;
start transaction;
select * from test_deadlock where id = 1 for update;(持有记录1的锁)
select * from test_deadlock where id = 2 for update;(持有记录2的锁)
select * from test_deadlock where id = 2 for update;(请求并等待记录1的锁)
select * from test_deadlock where id = 1 for update;(死锁产生,自动取消事务)
commit;

事务1命令执行

事务2命令执行

查看最近一次死锁信息

show engine innodb status;

局限性:仅可以查看最近一次死锁的信息

我们可以借助AI分析一下上面日志:

  • 事务2070:正在等待id=2的X锁(排他锁)
  • 事务2071:已持有id=2的X锁,同时等待id=1的X锁
  • 最终导致两个事务互相等待对方的锁资源,形成循环等待的死锁

记录所有死锁信息

通过show engine innodb status,我们可以查到最近一次死锁信息,但是我们想得到所有死锁的信息。于是可以开启innodb_print_all_deadlocks,所有的死锁信息会记录到错误日志。

-- 查看错误日志路径
show variables like 'log_error';
-- 开启死锁日志打印
set global innodb_print_all_deadlocks=ON;
-- 执行死锁案例后,查看错误日志
tail -n35 /var/log/mysqld.log

通过binlog查看死锁相关SQL

我们现在已经可以知道数据库的一些死锁信息,但是死锁信息不是很直观,我们想知道死锁的相关事务到底执行了哪些SQL,于是我们可以开启binlog,通过binlog去分析。

开启binlog日志

  • 配置/etc/my.cnf
  • 重启MySQL服务

MySQL8的binlog是默认开启的,且格式是:ROW

[mysqld]
log_bin=binlog       # 启用binlog,且文件名为binlog,默认路径为MySQL数据目录
binlog_format = ROW       # 设置格式为ROW
server-id = 1             # 主从复制需唯一(MySQL 5.7以下必须配置)
expire_logs_days = 7      # 日志保留7天
max_binlog_size = 500M    # 单个日志文件最大500MB

解析binlog日志

mysqlbinlog /var/lib/mysql/binlog.000002 -u root -p --base64-output=decode-rows -v

实验做到这里发现问题:binlog会记录update、insert语句,但是对于查询语句(select for update)不会记录在binlog中的。因此我实验中死锁事务的SQL并没有在binlog中。

死锁事务完整SQL查看方式

对于select for update语句binlog是不记录的,所以想要看到死锁事务的全部SQL,这里XiXi想到用如下方式

开启general_log

set global general_log = 'ON';
show variables like '%general_log%';

执行死锁案例

见死锁场景构建案例

查看死锁信息

  • 事务1:线程id=54
  • 事务2:线程id=9

在general_log中寻找

awk '$2 == 54 || $2 == 9' xixi.log

总结

好的,MySQL死锁的排查实验就分享到这里。欢迎批评指正。

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

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

相关文章

LabVIEW心音信号采集与分析系统

基于LabVIEW软件的心音信号采集与分析系统能够实现心音的采集、去噪和分析。系统利用LabVIEW的强大功能和灵活性,通过模块化设计,实现了心音信号的高效处理和分析,具备深度学习和身份识别的实验能力,适用于医学和生物工程领域的研…

【Scrapy】Scrapy教程7——存储数据

上一节我们对爬虫程序的默认回调函数parse做了改写,提取的数据可以在Scrapy的日志中打印出来了,光打印肯定是不行的,还需要把数据存储,数据可以存到文件,也可以存到数据库,我们一一来看。 存储数据到文件 首先我们看看如何将数据存储到文件,在讲[[【Scrapy】Scrapy教程…

基础入门-算法解密散列对称非对称字典碰撞前后端逆向MD5AESDESRSA

知识点: 0、算法类型-单向散列&对称性&非对称性 1、算法识别加解密-MD5&AES&DES&RSA 2、解密条件寻找-逻辑特征&源码中&JS分析 应用场景: 1、发送数据的时候自动将数据加密发送(只需加密即可) 安全…

在UBUNTU下搭建Deepseek

在UBUNTU下搭建Deepseek 一、安装UBUNTU 这个就不多说了,无外乎下载UBUNTU的iso,然后用UltraIso制作U盘,然后重启设置启动盘,安装… 二、安装Ollama curl -sSfL https://ollama.com/install.sh | sh这里可能需要你先安装curl工…

O1 Embedder:让检索器思考后再行动

25年2月来自中科大和北京智源研究院的论文“O1 Embedder: Let Retrievers Think Before Action”。 大语言模型 (LLM) 的功能日益强大,彻底改变人们获取和利用信息的方式。值得注意的是,LLM 擅长执行细粒度数据表示,这有助于精确检索信息。它…

Ubuntu系统3分钟本地部署DeepSeek-R1蒸馏模型,支持联网

本文提供Ubuntu ollama Page Assist,3步快速安装DeepSeek-R1蒸馏模型,支持联网,支持API。 目录 DeepSeek-R1安装分3步: Step 1, 安装ollama(已安装可忽略) Step 2, 下载DeepSeek-R1模型 Step 3, 从…

谷粒商城—分布式高级②.md

认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…

C语言-----操作符的分类

1. 操作符的分类 •算术操作符&#xff1a; 、- 、 * 、/、% 移位操作符:<< >> 位操作符: & | ^ 赋值操作符: / 、 % 、 、- 、 *、/、 %、 <<、 >>、&、| 、 ^ 单⽬操作符&#xff1a;&#xff01;、 、- 、 & 、 * 、 、 …

PWM(脉宽调制)技术详解:从基础到应用实践示例

PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例 目录 PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例学前思考&#xff1a;一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…

AI智能成长系统 | 应用探讨研究

研究背景 在现代家庭中&#xff0c;三岁宝宝的成长环境日益复杂。由于宝宝每天接触的人群多样&#xff0c;包括家庭成员、同龄小朋友以及可能的陌生人&#xff0c;其语言环境也相应地变得复杂多变。这种环境下&#xff0c;宝宝很容易接触到一些不适宜的语言&#xff0c;即俗称…

java 网络安全感知 网络安全学java

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 实验五 java网络编程及安全 实验内容 1&#xff0e;掌握Socket程序的编写&#xff1b;2&#xff0e;掌握密码技术的使用&#xff1b;3&#xff0e;设计安全传输…

VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验

最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午. 发现4.4支持python脚本,好开心. 首先安装VM4.4 注意一定要是4.4 打开后拖了一个模块. 但是发现import numpy imp…

python-leetcode 40.二叉树的层序遍历

题目&#xff1a; 给定二叉树的根节点root,返回其节点值得层序遍历&#xff08;即逐层从左到右访问所有节点&#xff09; 方法&#xff1a;广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…

蓝桥杯学习大纲

&#xff08;致酷德与热爱算法、编程的小伙伴们&#xff09; 在查阅了相当多的资料后&#xff0c;发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以&#xff0c;干脆自己整理一篇&#xff0c;欢迎大家补充&#xff01; 一、蓝桥必备高频考点 我们以此为重点学习…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统&#xff0c;不需要降级 v1.0.91 &#xff08;2025&#xff09; 本文内容需要你有一定的 Linux 操作基础&#xff0c;最好是程序员那种&#xff0c;英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL8检测报告标准讲解:

水基试剂&#xff0c;湿式化学&#xff0c;清水&#xff0c;干式化学&#xff0c;干粉&#xff0c;卤烃清洁剂&#xff0c;二氧化碳灭火器UL检测报告标准讲解&#xff1a; 本政策涵盖的灭火器 水基试剂灭火器 水基试剂灭火器使用水基试剂带走燃烧三要素中的热量要素&#xf…

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车&#xff0c;搭载5.0 L发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;接通空调开关后&#xff0c;有时出风忽大忽小&#xff0c;有时不出风&#xff0c;有时要等2 min左右才出风&#xff1b;有时两三天出现一次&#xff0c;…

Mac arm架构使用 Yarn 全局安装 Vue CLI

dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI&#xff0c;你可以执行以下命令&#xff1a; yarn global add vue/cli这个命令会全局安装 Vue CLI&#xff0c;让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…

成员函数定义后面加const是什么功能:C++中const成员函数的作用

成员函数定义后面加const是什么功能&#xff1a;C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中&#xff0c;有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…

DeepSeek智能测试助手:分类+推理+导出一站式工具

前言 测试开发工程师在日常工作中需要处理大量测试文档&#xff0c;并且这些文档需要被高效分类、清洗和管理&#xff0c;同时结合强大的 AI 推理能力&#xff08;如 DeepSeek 模型&#xff09;进行智能化处理和分析。为此&#xff0c;我们开发了一款基于 PyQt5 的 GUI 工具&a…