MySQL如何查视当前数据库锁请求
发布时间:2022-01-11 16:21:27 所属栏目:MySql教程 来源:互联网
导读:小编给大家分享一下MySQL如何查看当前数据库锁请求,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! MySQL版本:5.6.21 MySQL提供了查看当前数据库锁请求的三种方法: 1. sh
小编给大家分享一下MySQL如何查看当前数据库锁请求,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! MySQL版本:5.6.21 MySQL提供了查看当前数据库锁请求的三种方法: 1. show full processlist命令 观察state和info列 2. show engine innodb statusG 命令 查看 TRANSACTIONS 部分和 LATEST DETECTED DEADLOCK 两个部分 3. information_shcema下的三张表(通过这三张表可以更新监控当前事物并且分析存在的锁问题) —— innodb_trx ( 打印innodb内核中的当前活跃(ACTIVE)事务) —— innodb_locks ( 打印当前状态产生的innodb锁 仅在有锁等待时打印) —— innodb_lock_waits (打印当前状态产生的innodb锁等待 仅在有锁等待时打印) 1) innodb_trx表结构说明 (摘取最能说明问题的8个字段) 字段名 说明 trx_id innodb存储引擎内部唯一的事物ID trx_state 当前事物状态(running和lock wait两种状态) trx_started 事物的开始时间 trx_requested_lock_id 等待事物的锁ID,如trx_state的状态为Lock wait,那么该值带表当前事物等待之前事物占用资源的ID,若trx_state不是Lock wait 则该值为NULL trx_wait_started 事物等待的开始时间 trx_weight 事物的权重,在innodb存储引擎中,当发生死锁需要回滚的时,innodb存储引擎会选择该值最小的进行回滚 trx_mysql_thread_id mysql中的线程id, 即show processlist显示的结果 trx_query 事物运行的SQL语句 2)innodb_locks表结构说明 字段名 说明 lock_id 锁的ID lock_trx_id 事物的ID lock_mode 锁的模式(S锁与X锁两种模式) lock_type 锁的类型 表锁还是行锁(RECORD) lock_table 要加锁的表 lock_index 锁住的索引 lock_space 锁住对象的space id lock_page 事物锁定页的数量,若是表锁则该值为NULL lock_rec 事物锁定行的数量,若是表锁则该值为NULL lock_data 事物锁定记录主键值,若是表锁则该值为NULL(此选项不可信) 3)innodb_lock_waits表结构说明 字段名 说明 requesting_trx_id 申请锁资源的事物ID requested_lock_id 申请的锁的ID blocking_trx_id 阻塞其他事物的事物ID blocking_lock_id 阻塞其他锁的锁ID 可以根据这三张表进行联合查询,得到更直观更清晰的结果,可以参考如下SQL(可根据自己的分析习惯适进行调整) select r.trx_isolation_level, r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_trx_thread, r.trx_state waiting_trx_state, lr.lock_mode waiting_trx_lock_mode, lr.lock_type waiting_trx_lock_type, lr.lock_table waiting_trx_lock_table, lr.lock_index waiting_trx_lock_index, r.trx_query waiting_trx_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_trx_thread, b.trx_state blocking_trx_state, lb.lock_mode blocking_trx_lock_mode, lb.lock_type blocking_trx_lock_type, lb.lock_table blocking_trx_lock_table, lb.lock_index blocking_trx_lock_index, b.trx_query blocking_query from information_schema.innodb_lock_waits w inner join information_schema.innodb_trx b on b.trx_id=w.blocking_trx_id inner join information_schema.innodb_trx r on r.trx_id=w.requesting_trx_id inner join information_schema.innodb_locks lb on lb.lock_trx_id=w.blocking_trx_id inner join information_schema.innodb_locks lr on lr.lock_trx_id=w.requesting_trx_idG; *************************** 1. row *************************** trx_isolation_level: REPEATABLE READ waiting_trx_id: 2900247 waiting_trx_thread: 1070 waiting_trx_state: LOCK WAIT waiting_trx_lock_mode: S waiting_trx_lock_type: RECORD waiting_trx_lock_table: `jiang_test`.`test` waiting_trx_lock_index: PRIMARY waiting_trx_query: select * from test where id=3 lock in share mode blocking_trx_id: 2900241 blocking_trx_thread: 1137 blocking_trx_state: RUNNING blocking_trx_lock_mode: X blocking_trx_lock_type: RECORD blocking_trx_lock_table: `jiang_test`.`test` blocking_trx_lock_index: PRIMARY blocking_query: NULL 1 row in set (0.01 sec) 以上是“MySQL如何查看当前数据库锁请求”这篇文章的所有内容,感谢各位的阅读! (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |