作者:xuty

本文来源:原创投稿

* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

一、大纲

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

2.1 创建库

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 种场景:

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

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

mysql 行锁 超时_技术分享 | MySQL 行锁超时排查方法优化相关推荐

  1. mysql内连接简写_技术分享 | MySQL 的 join_buffer_size 在内连接上的应用

    本文详细介绍了 MySQL 参数 join_buffer_size 在 INNER JOIN 场景的使用,OUTER JOIN 不包含.在讨论这个 BUFFER 之前,我们先了解下 MySQL 的 I ...

  2. mysql优化说出九条_技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢?

    原标题:技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢? 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 ...

  3. 多少行数_技术分享 | MySQL:查询字段数量多少对查询效率的影响

    作者:高鹏 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 这个问题是最近一个朋友问我的.刚好就好好看了一下,留下 ...

  4. date转timestamp格式_技术分享 | MySQL:timestamp 时区转换导致 CPU %sy 高的问题

    作者:高鹏文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识.本文为学习记录,可能有误请谅解. 本文建议PC端观看,效果 ...

  5. mysql 做回归模型_技术分享 | 我对 MySQL 隔离级别的剖析

    隔离级别的产生 在串型执行的条件下,数据修改的顺序是固定的.可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据修改在并发执行的情况下得到一个固定.可预期的结果,由此产生 ...

  6. date转timestamp格式_技术分享 | MySQL:timestamp 时区转换导致 CPU %sys 高的问题

    作者:高鹏 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 本文为学习记录,可能有误请谅解. 本文建议PC端观看, ...

  7. mysql 创建索引 终止_技术分享 | 常见索引问题处理

    作者:EneTakane 数据库技术爱好者,爱可生 DBA 团队成员,负责 MySQL 日常问题处理以及数据库运维平台的问题排查,擅长 MySQL 主从复制及优化,喜欢钻研技术问题,还有不得不提的 w ...

  8. left join 索引失效无条件_技术分享 | MySQL 优化:JOIN 优化实践

    近期刚好学习了丁奇老师的<MySQL 实战 45 讲>中的 join 优化相关知识,又刚刚好碰上了一个非常切合的 join 查询需要优化,分析过程有些曲折,记录下来留作笔记.问题 SQL ...

  9. mysql 走索引 很慢_技术分享 | MySQL优化:为什么SQL走索引还那么慢?

    作者:胡呈清 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 core 分析过程 接手这个问题时现场已经不在了,信息有限 ...

最新文章

  1. GE刚刚换帅,就向艾默生出售智能平台业务?刚刚换帅,GE又向艾默生出售智能平台业务,未来究竟何去何从?...
  2. hicoder - 1068 【RMQ or 线段树】
  3. 论网站更新与seo优化的关系
  4. 非标准配置linux,剖析非标准波特率的设置和使用于Linux操作系统中
  5. JVM实用参数(八)GC日志
  6. 应用性能问题解决实际案例
  7. 【TypeScript系列教程03】基础语法
  8. Android_Kotlin 代码学习
  9. plsql打开sql窗口快捷键_巧用Navicat for MySQL的快捷键
  10. 判断应用程序是否是当前激活程序(获得焦点的程序)
  11. densenet网络结构_DenseNet轻量型网络
  12. mtk android工具包,MTK Android software Tools工具的说明
  13. 十三、Swing绘图技术
  14. 沙利文:2019Q4中国公有云市场份额:阿里云、腾讯云、华为云位列前三
  15. 致00后大学新生:从今天起,为转离这些专业而努力
  16. HTML的标签元素分类的区别
  17. Voxengo Peakbuster for mac(音频谐波增强插件)
  18. mvc表单Form提交 --实体
  19. AllWinner board 笔记
  20. 一文带你理解URI 和 URL 有什么区别?

热门文章

  1. ASP.NET 开发小技巧 (持续更新)
  2. Web前端开发代码规范(基础)
  3. WinDocks发布Windows版本的Docker引擎
  4. 树的方向,风决定;人的方向,自己决定
  5. 输入http://localhost/,apache出现You don't have permission to access/on this server.的提示,如何解决?...
  6. 笔记本打字不知道按了什么键,打字老出现数字?
  7. 网站DDOS***防护实战老男孩经验心得分享
  8. Unity进阶技巧 - RectTransform详解
  9. 【Vue.js 牛刀小试】:第九章 - 组件基础再探(data、props)
  10. 在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)