通常在MySQL的管理和监控中,Active Session(活动会话)是监控指标中的一个很重要的指标,通过活动会话监控,可以很清楚的了解到数据库当前是否有SQL堆积,是否处于非常繁忙的状态。那么除了活动会话之外,还有哪些指标是非常重要的呢,本文就来给大家介绍下MySQL里面另外几个重要指标,事务和锁信息,锁等待的监控。

我们知道事务和锁是数据库中最最核心的内容,有了事务和锁,才保证了数据的ACID特性,上面说到的活动会话监控,可以反映出数据库的一个健康状态,但是如果监控到事务和锁,那么会对数据库的运行状态有更加全面的认识,在数据库出现异常时也可以很快定位到一些问题。比如业务设计开发同学开启了事务但是忘了提交,或者事务提交时间过长,都会导致一些数据库的问题产生,严重时会数据库故障。下面就如何查看和监控事务、锁信息做个简单介绍。

大多数时候我们通过执行show engine innodb status来查看和监控数据库的锁信息,其实还有更简单的方式,MySQL将事务和锁信息记录在了information_schema数据库中,我们只需要查询即可。

涉及的表主要有三个表:

INNODB_TRX

记录INNODB未提交事务信息

INNODB_LOCKS

记录INNODB锁信息,当出现锁等待时才有数据

INNODB_LOCK_WAITS

记录锁等待信息,关联INNODB_LOCKS查询。

我们通过实例分析来说明如何监控事务和锁,首先开启事务T1,执行update:

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> update t1 set name=’xxxx’ where id=10;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1 Warnings: 0

然后查询INNODB_TRX表,可以看到如下信息,表示有1条事务当然没有提交,这个事务就是上面T1没有提交的事务。

mysql> use information_schema

mysql>SELECT * FROM  INNODB_TRX\G

***************************1. row ***************************

trx_id: 36076063  (事务ID)

trx_state: RUNNING (事务正在运行)

trx_started: 2018-09-08 22:35:32(事务开始时间)

trx_requested_lock_id: NULL

trx_wait_started: NULL

trx_weight: 3

trx_mysql_thread_id: 882965 (MySQL线程ID)

trx_query: NULL (执行的SQL语句)

trx_operation_state: NULL

trx_tables_in_use: 0

trx_tables_locked: 0

trx_lock_structs: 2

trx_lock_memory_bytes: 360

trx_rows_locked: 1 (锁定了1行索引记录)

trx_rows_modified: 1

trx_concurrency_tickets: 0

trx_isolation_level: READ COMMITTED (当前事务隔离级别)

trx_unique_checks: 1 (唯一性检测,因为是UK锁)

trx_foreign_key_checks: 1 (外键检测)

trx_last_foreign_key_error:NULL

trx_adaptive_hash_latched: 0

trx_adaptive_hash_timeout: 10000

trx_is_read_only: 0

trx_autocommit_non_locking:0

1 row inset (0.00 sec)

然后我们开启事务T2:

mysql>begin;

QueryOK, 0 rows affected (0.00 sec)

mysql>  select * from t1 where id<=4 lock in share mode;

ERROR1205 (HY000): Lock wait timeout exceeded; try restarting transaction

在事务T2执行过程中我们来监控锁信息,首先来查询INNODB_LOCK_WAITS数据表,可以看到上面T1,T2两个事务已经产生了锁等待。

mysql>SELECT * FROM  INNODB_LOCK_WAITS\G

***************************1. row ***************************

requesting_trx_id:36076064 (T2请求的事务ID)

requested_lock_id:36076064:69:3:5 (T2请求的锁ID)

blocking_trx_id: 36076063 (T1阻塞的事务ID)

blocking_lock_id: 36076063:69:3:5 (T1阻塞的锁ID)

1 row inset (0.00 sec)

上面我们已经知道了事务T2在执行过程中被事务T1的锁阻塞住了,然后我们就可以通过查询INNODB_LOCKS查询看到的锁详细信息,具体如下所示,可以看到上面的事务T1(36076063)对t1表加了X模式的PK锁,锁类型为Record Lock,锁定了1行数据,锁定的位置为69表空间的第3个页面的第5行记录,锁定记录为10,因为是PK更新,所以这里的lock_data: 10就是id=10的这行记录的PK被加锁了。再来看事务T2(36076064),在请求id=10这个锁的时候无法获取到锁,导致了锁等待。

mysql>SELECT * FROM  INNODB_LOCKS\G

***************************1. row ***************************

lock_id: 36076064:69:3:5 (锁ID)

lock_trx_id:36076064 (事务ID)

lock_mode: S (锁模式)

lock_type: RECORD (锁类型)

lock_table: `test`.`t1` (锁了哪个表)

lock_index: PRIMARY (锁定的索引类型)

lock_space: 69 (表空间位置)

lock_page: 3 (页位置)

lock_rec: 5 (记录位置)

lock_data: 10 (哪个数据被锁了,如果是PK,这个值就是PK值)

***************************2. row ***************************

lock_id: 36076063:69:3:5

lock_trx_id:36076063

lock_mode: X

lock_type: RECORD

lock_table: `test`.`t1`

lock_index: PRIMARY

lock_space: 69

lock_page: 3

lock_rec: 5

lock_data: 10

2 rowsin set (0.00 sec)

现在我们知道了如何定位和查询没有提交的事务,以及锁等待信息,只需要将上面的SQL定时采集告警即可很容易的实现事务和锁的监控了。最近我自己也写了一个demo,通过上面三个SQL监控了事务和锁的信息。

可以看到上面监控里面有大于0的数值,说明有锁等待现象,然后点击小圆点,即可以定位到相关锁信息,是不是更方便了。

最后给大家留个问题,上面可以看到T1阻塞了T2,为啥T2会等待id=10这条数据持有的PK锁?请大家想一想,欢迎留言。

持续原创进行中,欢迎关注。

mysql分析表锁,MySQL锁分析和监控相关推荐

  1. mysql某个表被行锁了_MySQL中的锁(表锁、行锁)

    锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...

  2. mysql某个表被行锁了_一文搞懂MySQL行锁、表锁、间隙锁详解

    准备工作 创建表 tb_innodb_lock drop table if exists test_innodb_lock; CREATE TABLE test_innodb_lock ( a INT ...

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

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

  4. mysql 列出表_[MySQL优化1]centos中MySQL列出所有表

    步骤1 - 连接到MySQL数据库服务器: [root@host]# mysql -u root -p Enter password:****** 提示登陆成功 Welcome to the MySQ ...

  5. MySQL删除表数据 MySQL清空表命令 3种方法

    一.MySQL清空表数据命令:truncate SQL语法: truncate table 表名 注意: 不能与where一起使用. truncate删除数据后是不可以rollback的. trunc ...

  6. MySQL删除表数据 MySQL清空表数据命令 3种方法

    一.MySQL清空表数据命令:truncate SQL语法: truncate table 表名; 注意: 不能与where一起使用. truncate删除数据后是不可以rollback的. trun ...

  7. mysql 创建表 1067,Mysql 错误 1067

    Mysql 错误 1067 启动Mysql 错误 1067 进程意外终止的一种解决方法 mysqld-nt --defaults-file=my.ini --standalone --console ...

  8. MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...

    Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化 项目介绍 基于SpringBoot+Mybatis搭建的秒杀系统,并且针对高并发场景进行了优化,保证线 ...

  9. Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: [sql] view plaincopy print? S ...

  10. mysql 多表 查询慢_详解Mysql多表联合查询效率分析及优化

    1. 多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOI ...

最新文章

  1. ceph bluestore源码分析:非对齐写逻辑
  2. 迁移博客到香港虚拟空间
  3. Adaboost from Baidu
  4. 复习笔记(五)——C++多态和虚函数
  5. 云炬随笔20180419
  6. python创建一个字典、其中值为1_从2个列表创建一个字典,其中一个作为键,另一个作为python中的值...
  7. scala教程(二) 函数
  8. 计算机桌面音量键在哪,电脑音量调节快捷键_电脑音量快捷键设置
  9. 雅虎终于死了:从1000亿到破产贱卖,最后连名字都没
  10. js获取本周日期和上周日期 --- 随手记录备忘
  11. Excel分列小技巧
  12. ​秋招上岸,机械转码经历和面经​
  13. linux smit工具,Linux安全基础 SMIT入门
  14. linux服务器磁盘满了怎么办
  15. Linux系统设置用户密码规则(复杂密码策略)方法
  16. CAD 随机卵石混凝土 混凝土细观 卵石混凝土模型
  17. 自然语言处理4——TF-IDF及特征提取
  18. java ftp上传文件相关代码梳理
  19. 用户使用报告_2020年抖音用户画像报告[附下载] | 行业数据报告研读
  20. 新晋总监生存指南开篇之总监二三事

热门文章

  1. android n AES加密,AndroidP AES 加密适配
  2. php nfs,NFS(网络文件系统)服务器简单解析
  3. ubuntu下修改键位
  4. usb_get_device_descriptor()
  5. 【arduino】RFID门禁刷卡模块RFID-RC522
  6. 头插法和尾插法分别建立链表(复制即可应用)
  7. 计算机网络·“存储-转发”式分组交换网
  8. 华为与各国政府签订无间谍无后门协议
  9. nodejs实现webservice问题总结
  10. 【对讲机的那点事】节日出游对讲机选择你了解多少?