MySQL运维系列 之 如何监控大事务

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

某个SQL执行特别慢,导致整个transaction一直处于running阶段
某个Session的SQL已经执行完了,但是迟迟没有commit,一直处于sleep阶段
某个Session处于lock wait阶段,迟迟没有结束
以上,大部分原因都是大事务导致的,接下来我们好好聊聊相关话题

关键字
环境

  1. MySQL5.7.22
    低版本MySQL这边不再考虑,就像还有使用SAS盘的公司一样,费时费力,MySQL5.7+ 标配
  2. InnoDB存储引擎
  3. CentOS 6
    大事务的相关特征
  4. transaction开启到结束的时间非常长,我们这边举例为10s
  5. 正在执行的事务
  6. 未提交的事务
    实战
    如何监控那些正在执行的事务
  7. select * from sys.processlist
  8. show processlist
  9. select * from information_schema.processlist
  10. select * from sys.session
  11. select * from information_schema.innodb_trx;
  12. select from performance_schema.events_statements_current
    如何监控那些未提交的事务
    1
    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:58
wait_age: 00:00:03
wait_age_secs: 3
locked_table: lc.lc_1
locked_index: GEN_CLUST_INDEX
locked_type: RECORD
waiting_trx_id: 1592102
waiting_trx_started: 2018-06-26 11:49:58
waiting_trx_age: 00:00:03
waiting_trx_rows_locked: 2
waiting_trx_rows_modified: 0
waiting_pid: 3
waiting_query: update lc_1 set id=4 where id = 1
waiting_lock_id: 1592102:32:3:4
waiting_lock_mode: X
blocking_trx_id: 1592100
blocking_pid: 2
blocking_query: NULL
blocking_lock_id: 1592100:32:3:4
blocking_lock_mode: X
blocking_trx_started: 2018-06-26 11:49:08
blocking_trx_age: 00:00:53
blocking_trx_rows_locked: 1
blocking_trx_rows_modified: 1
sql_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,也不妨碍你解决当前的问题哈

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

原文地址:http://blog.51cto.com/13792737/2133936

时间: 2024-10-03 14:38:46

MySQL运维系列 之 如何监控大事务的相关文章

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

原文:SQL Server自动化运维系列--监控磁盘剩余空间及SQL Server错误日志(Power Shell) 需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测.作为一个高效的DBA不可能每天都要上生产机上查看磁盘剩余或者直到磁盘无剩余空间报错后才采取扩容措施. 当然,作为微软的服务器有着自己的监控软件:SCCM(System Center

SQL Server自动化运维系列——监控跑批Job运行状态(Power Shell)

需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在上一篇文章中已经分析了SQL SERVER中关于邮件的基础配置,本篇将利用此功能对多台Server的跑批Job进行监控. 本篇实现 1.每天检查服务器中的SQL Server跑批Job的运行状态,如果跑批失败,则发邮件告诉管理员失败的明细 2.解决多台服务器同时检查 监控脚本 首先我们来解决第二个问题,关于多台服务器的问题: <1>一般监控我们需

【直播预告】马哥linux运维系列免费公开课报名&gt;&gt;

[直播预告]马哥linux运维系列免费公开课报名>> 51CTO学院签约名师马哥携手业内知名技术大牛联合推出的"linux运维"系列,免费公开课再次重磅来袭!由三位神级技术工程狮联合打造,24k纯干货技术分享,从linux小白到实战运维各种实战经验嗨翻你的大脑! 小伙伴们,报名加入上课QQ群:123347555 :让我们一起进入开源世界,共同见证Linux的辉煌. 上课方式: 每周三晚上8:00-9:30   QQ群内直播   点击加群>> 资深技术工程狮: 马

SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利)

需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 邮件作为一种非常便利的预警实现方式,在及时性和易用性方面也有着不可替代的优点. 所以,在本篇中将详细的分析下在SQL Server中的邮件通知功能及使用方式等. 本篇实现 1.通过SQL Server自带的邮件功能实现运维的预警及检测 2.利用数据库邮件组件代替传统的C#发送邮件的弊端 3.实现Job任务运行状态的检测 4.利用PowerShell实

SQL Server自动化运维系列——监控性能指标脚本(Power Shell)

需求描述 一般在生产环境中,有时候需要自动的检测指标值状态,如果发生异常,需要提前预警的,比如发邮件告知,本篇就介绍如果通过Power shell实现状态值监控 监控值范围 根据经验,作为DBA一般需要监控如下系统能行指标 cpu: \Processor(_Total)\% Processor Time \Processor(_Total)\% Privileged Time \SQLServer:SQL Statistics\Batch Requests/sec \SQLServer:SQL

SQL Server自动化运维系列——关于数据收集(多服务器数据收集和性能监控)

需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多方案. 几种方案各有利弊,其中从SQL Server2012版本开始,微软的开始各种整合这些采集方案,力推扩展事件. 对于上述的数据采集只是一种实现手段,对于采集完数据的存储没有统一的规范,并且对于多服务器的数据采集及汇总没形成统一的规范. 本篇实现 1.通过SQL Server自带的数据采集器实现

SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)

需求描述 一般在生产环境中,在投产的情况下,需要批量的来执行SQL脚本文件,来完成整个投产,如果投产文件比较多的情况下,无疑这是一个比较痛苦的过程,所以本篇通过PowerShell脚本来批量完成. 监控脚本 <#批量执行SQL脚本文件#> <#===========================================#> $serverInstance="WUXUEL1" $Database="111" #$userName=&q

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

grains:搜集minion启动时的系统信息,只有在minion启动时才会搜集,grains更适合做一些静态的属性值的采集,例如设备的角色(role),磁盘个数(disk_num)等诸如此类非常固定的属性,另一个作用可以用来匹配minion 列出所有的grains选项 # salt '*' grains.ls 列出所有grains和内容 # salt 'mini1' grains.items 显示单个grains内容,get方法直接显示值,item方法会把条目名也显示出来获取单独的变量值fqd

Exchange Server 2013 运维系列——故障恢复

如果公司的邮箱服务器挂了,我们又没有做高可用,这个时候我们需要尽快地恢复邮箱数据库,并且保证邮箱正常收发邮件.现在我们需要用到邮箱数据库的备份了,一般情况下,我们会把数据库备份在共享存储中,或者至少是备份在另一台服务器上.我们采用的方法是将存储里面的数据库文件复制出来,在新的服务器上部署Exchange并创建新的数据库,然后将源数据库文件覆盖到新数据库文件中,最后把源数据库中的所有用户移植至新的数据库. 下面进入具体步骤: 一.查看源服务器的情况: 1.源服务器名称,如下图: 2.源服务器的数据