MySQL如何查看当前数据库锁请求
小编给大家分享一下MySQL如何查看当前数据库锁请求,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
MySQL版本:5.6.21
MySQL提供了查看当前数据库锁请求的三种方法:
1. show full processlist命令
观察state和info列
2. show engine innodb status\G 命令
查看 TRANSACTIONS 部分和 LATEST DETECTED DEADLOCK 两个部分
3. information_shcema下的三张表(通过这三张表可以更新监控当前事物并且分析存在的锁问题)
—— innodb_trx (
打印innodb内核中的当前活跃(ACTIVE)事务)
—— innodb_locks
( 打印当前状态产生的innodb锁 仅在有锁等待时打印)
—— innodb_lock_waits
(打印当前状态产生的innodb锁等待 仅在有锁等待时打印)
1) innodb_trx表结构说明 (摘取最能说明问题的8个字段)
当前事物状态(running和lock wait两种状态)trx_started
事物的开始时间trx_requested_lock_id等待事物的锁ID,如trx_state的状态为Lock wait,那么该值带表当前事物等待之前事物占用资源的ID,若trx_state不是Lock wait 则该值为NULLtrx_wait_started事物等待的开始时间trx_weight事物的权重,在innodb存储引擎中,当发生死锁需要回滚的时,innodb存储引擎会选择该值最小的进行回滚trx_mysql_thread_idmysql中的线程id, 即show processlist显示的结果trx_query事物运行的SQL语句
2)innodb_locks表结构说明
锁的IDlock_trx_id
事物的IDlock_mode
锁的模式(S锁与X锁两种模式)lock_type
锁的类型 表锁还是行锁(RECORD)lock_table
要加锁的表lock_index
锁住的索引lock_space
锁住对象的space idlock_page
事物锁定页的数量,若是表锁则该值为NULLlock_rec
事物锁定行的数量,若是表锁则该值为NULLlock_data
事物锁定记录主键值,若是表锁则该值为NULL(此选项不可信)
3)innodb_lock_waits表结构说明
字段名说明requesting_trx_id
申请锁资源的事物IDrequested_lock_id
申请的锁的IDblocking_trx_id
阻塞其他事物的事物IDblocking_lock_id
阻塞其他锁的锁ID
可以根据这三张表进行联合查询,得到更直观更清晰的结果,可以参考如下SQL(可根据自己的分析习惯适进行调整)
selectr.trx_isolation_level,r.trx_idwaiting_trx_id,r.trx_mysql_thread_idwaiting_trx_thread,r.trx_statewaiting_trx_state,lr.lock_modewaiting_trx_lock_mode,lr.lock_typewaiting_trx_lock_type,lr.lock_tablewaiting_trx_lock_table,lr.lock_indexwaiting_trx_lock_index,r.trx_querywaiting_trx_query,b.trx_idblocking_trx_id,b.trx_mysql_thread_idblocking_trx_thread,b.trx_stateblocking_trx_state,lb.lock_modeblocking_trx_lock_mode,lb.lock_typeblocking_trx_lock_type,lb.lock_tableblocking_trx_lock_table,lb.lock_indexblocking_trx_lock_index,b.trx_queryblocking_queryfrominformation_schema.innodb_lock_waitswinnerjoininformation_schema.innodb_trxbonb.trx_id=w.blocking_trx_idinnerjoininformation_schema.innodb_trxronr.trx_id=w.requesting_trx_idinnerjoininformation_schema.innodb_lockslbonlb.lock_trx_id=w.blocking_trx_idinnerjoininformation_schema.innodb_lockslronlr.lock_trx_id=w.requesting_trx_id\G;***************************1.row***************************trx_isolation_level:REPEATABLEREADwaiting_trx_id:2900247waiting_trx_thread:1070waiting_trx_state:LOCKWAITwaiting_trx_lock_mode:Swaiting_trx_lock_type:RECORDwaiting_trx_lock_table:`jiang_test`.`test`waiting_trx_lock_index:PRIMARYwaiting_trx_query:select*fromtestwhereid=3lockinsharemodeblocking_trx_id:2900241blocking_trx_thread:1137blocking_trx_state:RUNNINGblocking_trx_lock_mode:Xblocking_trx_lock_type:RECORDblocking_trx_lock_table:`jiang_test`.`test`blocking_trx_lock_index:PRIMARYblocking_query:NULL1rowinset(0.01sec)
以上是“MySQL如何查看当前数据库锁请求”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。