long transaction

背景

大家有没有遇到这样的情况

  1. 某个SQL执行特别慢,导致整个transaction一直处于running阶段
  2. 某个Session的SQL已经执行完了,但是迟迟没有commit,一直处于sleep阶段
  3. 某个Session处于lock wait阶段,迟迟没有结束

以上,大部分原因都是大事务导致的,接下来我们好好聊聊相关话题

关键字

  • 环境
1. MySQL5.7.22低版本MySQL这边不再考虑,就像还有使用SAS盘的公司一样,费时费力,MySQL5.7+ 标配2. InnoDB存储引擎3. CentOS 6
  • 大事务的相关特征
1. transaction开启到结束的时间非常长,我们这边举例为10s
2. 正在执行的事务
3. 未提交的事务

实战

  • 如何监控那些正在执行的事务
1. select * from sys.processlist
2. show processlist
3. select * from information_schema.processlist
4. select * from sys.session
5. select * from information_schema.innodb_trx;
6. select * from performance_schema.events_statements_current
  • 如何监控那些未提交的事务
select * from information_schema.innodb_trx
  • 如何两者结合
select trx_id,INNODB_TRX.trx_state,INNODB_TRX.trx_started,se.conn_id as processlist_id,trx_lock_memory_bytes,se.user,se.command,se.state,se.current_statement,se.last_statement from information_schema.INNODB_TRX,sys.session as se where trx_mysql_thread_id=conn_id;+---------+-----------+---------------------+----------------+-----------------------+------+---------+----------+-----------------------------------+-----------------------------------+
| trx_id  | trx_state | trx_started         | processlist_id | trx_lock_memory_bytes | user | command | state    | current_statement                 | last_statement                    |
+---------+-----------+---------------------+----------------+-----------------------+------+---------+----------+-----------------------------------+-----------------------------------+
| 1592104 | LOCK WAIT | 2018-06-26 11:51:17 |              3 |                  1136 | NULL | Query   | updating | update lc_1 set id=4 where id = 1 | NULL                              |
| 1592100 | RUNNING   | 2018-06-26 11:49:08 |              2 |                  1136 | NULL | Sleep   | NULL     | NULL                              | update lc_1 set id=3 where id = 1 |
+---------+-----------+---------------------+----------------+-----------------------+------+---------+----------+-----------------------------------+-----------------------------------+

大家可以看到,通过这个可以立马发现事务语句处于running阶段 , 哪些事务处于lock wait阶段 , 如果遇到这种情况,我们应该如何处理呢?
聪明的你,一定会去根据trx_started去寻找蛛丝马迹,可是如果再生产环境中,这是一件非常复杂和繁忙的事情
不过没关系,我们还有神器可以使用

  • 如何快速解决锁等待问题
dba:sys> select * from sys.innodb_lock_waits\G
*************************** 1. row ***************************wait_started: 2018-06-26 11:49:58wait_age: 00:00:03wait_age_secs: 3locked_table: `lc`.`lc_1`locked_index: GEN_CLUST_INDEXlocked_type: RECORDwaiting_trx_id: 1592102waiting_trx_started: 2018-06-26 11:49:58waiting_trx_age: 00:00:03waiting_trx_rows_locked: 2waiting_trx_rows_modified: 0waiting_pid: 3waiting_query: update lc_1 set id=4 where id = 1waiting_lock_id: 1592102:32:3:4waiting_lock_mode: Xblocking_trx_id: 1592100blocking_pid: 2blocking_query: NULLblocking_lock_id: 1592100:32:3:4blocking_lock_mode: Xblocking_trx_started: 2018-06-26 11:49:08blocking_trx_age: 00:00:53blocking_trx_rows_locked: 1blocking_trx_rows_modified: 1sql_kill_blocking_query: KILL QUERY 2
sql_kill_blocking_connection: KILL 2

MySQL最终非常贴心都连kill SQL 语句都生产了,你只需要复制、粘贴即可

细心的你会发现,通过innodb_lock_waits你只能看到被lock的语句,但是看不到是哪个query语句拥有的锁,这又是为什么呢?

不卖关子,因为拥有锁的事务中可能拥有多条query语句,也可能已经执行完,但是没有commit,所以无法给出所有query语句。

那怎么办呢?哈哈,如果幸运的话,你可以根据我上述的案例 current_statement,last_statement 得到答案。

再换句话说,即便没有找到那条query,也不妨碍你解决当前的问题哈

总结

  1. MySQL5.7 默默的提供了非常多的实用工具和新特性,需要DBA们去挖掘和探索。将看似平淡无奇的特性挖掘成黑武器,你才能成为那闪着光芒的Top5 MySQLer
  2. 工欲善其事必先利其器

MySQL运维系列 之 如何监控大事务相关推荐

  1. saltstack 管理mysql_saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入...

    saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入 salt的返回值写入mysql数据库: 可参考: https://docs.saltstack.com/en/ ...

  2. SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)...

    原文:SQL Server自动化运维系列--监控磁盘剩余空间及SQL Server错误日志(Power Shell) 需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的 ...

  3. Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统

    Linux运维系列总结-Linux系统启动过程.WEB工作原理.DHCP工作原理.DNS解析原理.NFS网络文件系统.FTP文件传输协议.PXE+KICKSTART自动安装系统 1.Linux系统的启 ...

  4. saltstack自动化运维系列②之saltstack的数据系统

    saltstack自动化运维系列②之saltstack的数据系统 grains:搜集minion启动时的系统信息,只有在minion启动时才会搜集,grains更适合做一些静态的属性值的采集,例如设备 ...

  5. 老男孩mysql运维dba实战21部完整版_老男孩Mysql DBA高级运维系列课程(16部)

    × 新功能提醒 网站新接入了第三方搜索服务,赞助会员免费使用,非赞助会员每次消耗30 积分 第三方服务链接由专人维护检查,资源更全,质量更好,保证有效,欢迎使用 |- 16-第十六部-老男孩MySQL ...

  6. 智能运维监管系统终端_智能运维系列(十三)| 面向智能化运维的CMDB系统构建...

    经过两年多的努力,在 2020 年微众银行智能化运维建设终于取得了明显成效,在智能监控领域的异常识别及根因定位方面发挥了巨大作用,甚至可以做到了秒级异常发现与定位.CMDB 系统(配置管理平台 Con ...

  7. ensp大型网络环境设计与实现_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现三...

    1. 说明 在之前的<<Mongodb网络传输处理源码实现及性能调优-体验内核性能极致设计>>和<<mongodb内核源码设计实现.性能优化.最佳运维系列-tran ...

  8. linux内核设计与实现 epub_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现四...

    1. 说明 本文分析网络传输层模块中的最后一个子模块:service_executor服务运行子模块,即线程模型子模块.在阅读该文章前,请提前阅读下<<Mongodb网络传输处理源码实现及 ...

  9. KingbaseES V8R6 集群运维系列 -- 命令行部署repmgr管理集群+switchover测试

    本次部署未使用securecmd/kbha工具,无需普通用户到root用户的互信. 一.环境准备 1.创建OS用户 建立系统数据库安装用户组及用户,在所有的节点执行. root用户登陆服务器,创建用户 ...

最新文章

  1. ROS学习笔记_创建工作空间(一)
  2. 数据库mysql驱动在8.0以上解决时区问题
  3. 记录 之 最近阅读的动作识别(action recognition)工作
  4. 流氓百度乱发短信的经历
  5. assertion failed:concurrent update to the log .mutiple streaming jobs delete 4
  6. Python框架篇之Django(Models的多表操作)
  7. Jersey学习笔记
  8. WIn10桌面美化(一)Rainmeter的使用
  9. wordpress炫酷主题Salient最新版13.0.5 汉化版免费下载
  10. 面试题-C++软件/客户端开发
  11. java jshell_java9系列(一)安装及jshell使用
  12. 分布式任务调度平台XXL-JOB
  13. 我的刻骨铭心的2018——致未来的自己和现在的你
  14. 语言大数据起航,大数据量级加码
  15. linux下关于笔记本的显卡驱动安装archlinux
  16. java时间管理_IT 人,如何构建自己的时间管理系统?
  17. 电通东派:联想Filez让业务流程上云端
  18. python 黑魔法_Python “黑魔法” 之 Meta Classes
  19. 优朋普乐酝酿上市前融资 百度腾讯欲投互联网TV
  20. 饥荒服务器修改mod没反应,为什么饥荒中服务器mod不能用 | 手游网游页游攻略大全...

热门文章

  1. 计算机二维全息图原理,三维信息加密如何使用计算全息进行
  2. sql server查询历史进程_学习笔记 | SequoiaDB SQL查询语句执行过程
  3. java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合
  4. vue解决v-for报错 [vue/valid-v-for]Custom elements in iteration require ‘v-bind:key‘ directives
  5. Java-Jdbc,JDBC连接Oracle11g实例:
  6. C++ Byte转十六进制字符串输出
  7. C++primer 第 3 章 字符串、向量和数组 3 . 5 数组
  8. C++ 使用move来删除用户指定的文件
  9. 2014年英语一作文partB漫画作文
  10. idea debugger console 不见了--还原 console 图标