我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 行锁超如何排查

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 行锁超如何排查

MySQL 行锁超如何排查,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

 一、大纲

#### 20191219 10:10:10,234 | com.alibaba.druid.filter.logging.Log4jFilter.statementLogError(Log4jFilter.java:152) | ERROR |  {conn-10593, pstmt-38675} execute error. update xxx set xxx = ? , xxx = ?  where RowGuid = ? com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

之前在 [如何有效排查解决 MySQL 行锁等待超时问题] 文章中介绍了如何监控解决行锁超时报错,当时介绍的监控方案主要是以 shell 脚本 +  general_log 来捕获行锁等待信息,后来感觉比较麻烦,因此优化后改成用 Event + Procedure 的方法定时在 MySQl  内执行,将行锁等待信息记录到日志表中,并且加入了 pfs 表中的事务上下文信息,这样可以省去登陆服务器执行脚本与分析 general_log  的过程,更加便捷。

因为用到了 Event 和 performance_schema 下的系统表,所以需要打开两者的配置,pfs 使用默认监控项就可以,这里主要使用到的是  events_statements_history 表,默认会保留会话 10 条 SQL。

performance_schema = on event_scheduler = 1

二、步骤

目前该方法仅在 MySQL 5.7 版本使用过,MySQL 8.0 未测试。

create database `innodb_monitor`;

create database `innodb_monitor`;

2.2 创建存储过程

use innodb_monitor; delimiter ;; CREATE PROCEDURE pro_innodb_lock_wait_check() BEGIN  declare wait_rows int;   set group_concat_max_len = 1024000;  CREATE TABLE IF NOT EXISTS `innodb_lock_wait_log` (   `report_time` datetime DEFAULT NULL,   `waiting_id` int(11) DEFAULT NULL,   `blocking_id` int(11) DEFAULT NULL,   `duration` varchar(50) DEFAULT NULL,     `state` varchar(50) DEFAULT NULL,   `waiting_query` longtext DEFAULT NULL,   `blocking_current_query` longtext DEFAULT NULL,   `blocking_thd_last_query` longtext,   `thread_id` int(11) DEFAULT NULL );   select count(*) into wait_rows from information_schema.innodb_lock_waits ;   if wait_rows > 0 THEN     insert into `innodb_lock_wait_log`  SELECT now(),r.trx_mysql_thread_id waiting_id,b.trx_mysql_thread_id blocking_id,concat(timestampdiff(SECOND,r.trx_wait_started,CURRENT_TIMESTAMP()),'s') AS duration,      t.processlist_command state,r.trx_query waiting_query,b.trx_query blocking_current_query,group_concat(left(h.sql_text,10000) order by h.TIMER_START DESC SEPARATOR ';\n') As blocking_thd_query_history,thread_id     FROM information_schema.innodb_lock_waits w JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id      LEFT JOIN performance_schema.threads t on t.processlist_id = b.trx_mysql_thread_id LEFT JOIN performance_schema.events_statements_history h USING(thread_id) group by thread_id,r.trx_id order by r.trx_wait_started;    end if; END ;;

2.3 创建事件

事件 每隔 5 秒 (通常等于 innodb_lock_wait_timeout 的值)执行一次,持续监控 7  天,结束后会自动删除事件,也可以自定义保留时长。

use innodb_monitor; delimiter ;; CREATE EVENT `event_innodb_lock_wait_check` ON SCHEDULE EVERY 5 SECOND   STARTS CURRENT_TIMESTAMP   ENDS CURRENT_TIMESTAMP + INTERVAL 7 DAY ON COMPLETION NOT PRESERVE ENABLE DO call pro_innodb_lock_wait_check(); ;;

2.4 事件启停

--1为全局开启事件,0为全局关闭 mysql > SET GLOBAL event_scheduler = 1;  --临时关闭事件 mysql > ALTER EVENT event_innodb_lock_wait_check DISABLE;  --关闭开启事件 mysql > ALTER EVENT event_innodb_lock_wait_check  ENABLE;

三、日志表

再根据应用日志报错时间点及 SQL 分析 innodb_lock_wait_log 表。其中主要有 2 种场景:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. blocking_current_query 不为空,说明阻塞事务处于运行状态,这时候需要分析当前运行 SQL 是否存在性能问题。

  3. blocking_current_query 为空,state 为 Sleep,此时阻塞事务处于挂起状态,即不再运行 SQL,此时需要通过分析  blocking_thd_last_query 分析事务上下文,注意该列中的 SQL 为时间降序,即从下往上执行。

MySQL 行锁超如何排查

关于MySQL 行锁超如何排查问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 行锁超如何排查

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 行锁超时排查方法优化

之前在 [如何有效排查解决 MySQL 行锁等待超时问题] 文章中介绍了如何监控解决行锁超时报错,当时介绍的监控方案主要是以 shell 脚本 + general_log 来捕获行锁等待信息,后来感觉比较麻烦,因此优化后改成用 Event
MySQLSQL行锁2024-12-03

【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?

文章目录 前言哪些场景会造成行锁升表锁?如何避免?如何分析排查?查看`InnoDB_row_lock%`相关变量查看 `INFORMATION_SCHEMA`系统库 总结最后 前言 在上文我们曾小小的提到过,在索引失效的情
2023-08-18

面试官:如何排查死锁?

我们创建两个锁和两个线程,让线程 1 先拥有锁 A,然后在 1s 后尝试获取锁 B,同时我们启动线程 2,让它先拥有锁 B,然后在 1s 之后尝试获取锁 A,这时就会出现相互等待对方释放锁的情况,从而造成死锁的问题,
死锁线程2024-11-30

如何排查Java应用的死锁

如何构造一个死锁呢?很简单,只要让线程1占有对象a的锁后,再去请求对象b的锁。与此同时,对象2已经占有了对象b的锁,再请求对象a的锁。线程1与线程2互相等待,形成了死锁。(在面试中,也会被经常地要求手写死锁)

MySQL的表级锁,行级锁,排它锁和共享锁

目录前言一、表级锁&行级锁二、排它锁&共享锁1. 测试不同事务之间排它锁和共享锁的兼容性2. 测试行锁加在索引项上三、串行化隔离级别测试前言如果我们和面试官聊到事务的问题,怎么回答呢?先说下事务是什么,因为我们业务是比较复杂的,不可能一
2022-07-14

MySQL表锁、行锁、排它锁及共享锁怎么使用

这篇文章主要介绍“MySQL表锁、行锁、排它锁及共享锁怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL表锁、行锁、排它锁及共享锁怎么使用”文章能帮助大家解决问题。一、事务隔离机制的选
2023-06-29

mysql死锁怎么排查及解决

MySQL死锁是指两个或多个事务互相持有对方需要的资源,同时又等待对方释放资源,导致系统无法继续进行下去的情况。解决MySQL死锁问题需要进行以下步骤:1. 确认死锁:可以通过查看MySQL错误日志来确认是否发生死锁。错误日志中会记录死锁的
2023-09-21

如何优化mysql行锁

如何优化mysql行锁?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、优化方法尽可能让所有数据检索都通过索引来完成,避免无索引行或索引失效导致行锁升级为表锁。尽可能避免间
2023-06-15

mysql行锁如何释放

mysql 行锁的释放MySQL 中的行锁在事务提交或回滚时自动释放。这意味着当一个事务完成时,由该事务持有的所有行锁都会立即解除。手动释放行锁在某些情况下,开发人员可能希望手动释放行锁。这可以通过以下方式实现:COMMIT 或 RO
mysql行锁如何释放
2024-06-14

编程热搜

目录