一、大纲

#### 20191219 10:10:10,234 | com.alibaba.druid.filter.logging.Log4jFilter.statementLogError(Log4jFilter.java:152) | ERROR |  {conn-10593, pstmt-38675}executeerror.updatexxxsetxxx = ? , xxx = ?whereRowGuid = ?

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 未测试。

createdatabase`innodb_monitor`;

create database `innodb_monitor`;

2.2 创建存储过程

use innodb_monitor;

delimiter ;;

CREATEPROCEDUREpro_innodb_lock_wait_check()

BEGIN

declarewait_rowsint;

setgroup_concat_max_len = 1024000;

CREATETABLEIFNOTEXISTS `innodb_lock_wait_log` (

`report_time` datetime DEFAULTNULL,

`waiting_id` int(11)DEFAULTNULL,

`blocking_id` int(11)DEFAULTNULL,

`duration` varchar(50)DEFAULTNULL,

`state` varchar(50)DEFAULTNULL,

`waiting_query` longtext DEFAULTNULL,

`blocking_current_query` longtext DEFAULTNULL,

`blocking_thd_last_query` longtext,

`thread_id` int(11)DEFAULTNULL

);

selectcount(*)intowait_rowsfrominformation_schema.innodb_lock_waits ;

if wait_rows > 0 THEN

insertinto`innodb_lock_wait_log`SELECTnow(),r.trx_mysql_thread_id waiting_id,b.trx_mysql_thread_id blocking_id,concat(timestampdiff(SECOND,r.trx_wait_started,CURRENT_TIMESTAMP()),'s')ASduration,

t.processlist_command state,r.trx_query waiting_query,b.trx_query blocking_current_query,group_concat(left(h.sql_text,10000)orderbyh.TIMER_STARTDESCSEPARATOR'; ')Asblocking_thd_query_history,thread_id

FROMinformation_schema.innodb_lock_waits wJOINinformation_schema.innodb_trx bONb.trx_id = w.blocking_trx_idJOINinformation_schema.innodb_trx rONr.trx_id = w.requesting_trx_id

LEFTJOINperformance_schema.threads tont.processlist_id = b.trx_mysql_thread_idLEFTJOINperformance_schema.events_statements_history h USING(thread_id)groupbythread_id,r.trx_idorderbyr.trx_wait_started;

endif;

END

;;

2.3 创建事件

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

use innodb_monitor;

delimiter ;;

CREATEEVENT `event_innodb_lock_wait_check`

ONSCHEDULE EVERY 5SECOND

STARTS CURRENT_TIMESTAMP

ENDS CURRENT_TIMESTAMP+ INTERVAL 7DAY

ONCOMPLETIONNOTPRESERVE

ENABLE

DO

call pro_innodb_lock_wait_check();

;;

2.4 事件启停

--1为全局开启事件,0为全局关闭

mysql > SETGLOBALevent_scheduler = 1;

--临时关闭事件

mysql > ALTEREVENT event_innodb_lock_wait_check DISABLE;

--关闭开启事件

mysql > ALTEREVENT event_innodb_lock_wait_check  ENABLE;

三、日志表

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

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

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

mysql left join超时,MySQL 行锁超时排查方法优化相关推荐

  1. mysql 行锁 超时_技术分享 | MySQL 行锁超时排查方法优化

    作者:xuty 本文来源:原创投稿 * 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.大纲 #### 20191219 10:10:10,234 | com.ali ...

  2. mysql二级封锁协议_MySQL 行锁、两阶段锁协议、死锁以及死锁检测

    行锁 MySQL的行锁都是在引擎层实现的,但是 MyISAM 不支持行锁,意味着并发控制只能使用表锁,同一张表任何时刻只能被一个更新在执行,影响到业务并发度.InnoDB 是支持行锁的,这也是 MyI ...

  3. mysql的join算法,Mysql Join 连接算法

    Join 语句的两种算法,分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL). 直接使用join mysql 优化器自动选择 驱 ...

  4. mysql的join+in,MySQL和性能:使用’IN’或’JOIN’?

    我有一些代码,它们通过ID查找数据库中的几张CD.这是使用'IN'条件完成的: (1) SELECT * FROM album WHERE id IN (?,?,?,?,?) 下一步是获取与这些相册相 ...

  5. mysql select乱码_MySQL命令行查询乱码解决方法:

    MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...

  6. apache axis 1.4的invoke方法设置超时_Kubernetes 网络故障常见排查方法

    网络可以说是 Kubernetes 部署和使用过程中最容易出问题的了,最主要的是对网络技术非常熟悉的人员相对较少,和 Kubernetes 结合后能搞透彻网络这块的就更加稀少了,导致我们在部署使用过程 ...

  7. mysql innodb 全表锁,Mysql InnoDB行锁及表锁分享

    一. 背景知识 二. 步入正题:表锁和行锁 1.1. 表锁 vs 行锁 在 MySQL 中锁的种类有很多,但是最基本的还是表锁和行锁:表锁指的是对一整张表加锁,一般是 DDL 处理时使用,也可以自己在 ...

  8. 5.MySQL行锁、表锁、间隙锁详解

    一.表锁 表锁不依赖于储存引擎(不管你是MySQL的什么存储引擎,对于表锁的策略都是一样的),开销小(因为力度大).表锁不会产生死锁问题,但是表锁会影响并发率.  表锁不依赖索引,当索引失效的时候,行 ...

  9. mysql某个表被行锁了_MySQL 行锁和表锁的含义及区别详解

    一.前言 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答. MySQL常用引擎有MyISAM和Inno ...

最新文章

  1. 伪激光雷达:无人驾驶的立体视觉
  2. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性
  3. MySQL IFNULL()函数用法MySQL
  4. c语言让数组地址对齐,C语言实现比特位数组在目标空间左右居中对齐三种方式...
  5. 电脑机器人_视频|电话积分换平板电脑和扫地机器人?女子拿回家后……-
  6. 【软测试】(两)计算机组成原理-cpu
  7. win11提示无法在此配置怎么办 Windows11提示无法在此配置的解决方法
  8. 基于梯度的权重更新优化迭代算法
  9. 阿里云服务器新手选型指南
  10. NVMe驱动学习记录-2
  11. sqlplus基本使用
  12. 数据结构:线性表的顺序存储结构,实现集合的交差并补
  13. pm2部署node项目
  14. 问题记录:node.js连接数据库出现两个问题getaddrinfo ENOTFOUND locahost;Client does not support authentication protoco
  15. matlab中tdma源程序,40MF-TDMA系统中多用户多业务的无线接入控制和时隙分配算法MATLAB源代码...
  16. Python Web开发:Django+BootStrap实现简单的博客项目
  17. 小程序跳转页面弹出公众号引导用户关注
  18. c语言中循环体表达式,C语言的循环语句
  19. LAS语音识别框架发展简述
  20. F28335的储存器及其地址分配

热门文章

  1. bzoj 4025 二分图——线段树分治+LCT
  2. mac下用Dosbox搭建dos下的汇编环境
  3. Maven 学习Tips
  4. 如何创建.gitignore文件,忽略git不必要提交的文件
  5. 【文章】本站收集与转载文章目录
  6. 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
  7. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
  8. ExecutorService与Executors例子的简单剖析(转)
  9. 华为AR28-11路由器配置
  10. C# Winform 启动和停止进程