mysql锁表定位

锁表的话可以从innodb_lock_waits表查看到目前存在哪些锁等待,要获取的锁被innodb_trx哪个事务trx_id持有,以及发起事务的mysql内部线程id标示trx_mysql_thread_id,再从进程表PERFORMANCE_SCHEMA.threads中根据(PROCESSLIST_ID)找到thread_id再PERFORMANCE_SCHEMA.events_statements_current中根据thread_id找到sql语句SQL_TEXT,即导致阻塞的sql。

查询sql如下:

select s.*,hw.* from (
select curtime() curtime, h.trx_mysql_thread_id holder, timestampdiff(second, h.trx_started, now()) elap_sec,           
       rpad(ifnull(h.trx_query, 'null'), 50, ' ') sqltext,             
       group_concat(w.trx_mysql_thread_id) waiter,  max(timestampdiff(second, w.trx_wait_started, now())) wait_sec  
from information_schema.innodb_lock_waits l,                         
       information_schema.innodb_trx        h,                         
       information_schema.innodb_trx        w                          
where l.blocking_trx_id = h.trx_id and l.requesting_trx_id = w.trx_id                                  
   and l.blocking_trx_id not in (select distinct requesting_trx_id  from information_schema.innodb_lock_waits)                   
group by h.trx_mysql_thread_id
) hw
LEFT JOIN (
SELECT
    a.SQL_TEXT,
    c.id,
    d.trx_started
FROM PERFORMANCE_SCHEMA.events_statements_current a
JOIN PERFORMANCE_SCHEMA.threads b ON a.THREAD_ID = b.THREAD_ID
JOIN information_schema.PROCESSLIST c ON b.PROCESSLIST_ID = c.id
JOIN information_schema.innodb_trx d ON c.id = d.trx_mysql_thread_id
ORDER BY     d.trx_started
) s on hw.holder=s.id
;

字段说明

  • processlist
  • innodb_trx
    • trx_id:事务ID。
    • trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。
    • trx_started:事务开始时间。
    • trx_requested_lock_id:事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。
    • trx_wait_started:事务开始等待的时间。
    • trx_weight:事务的权重。
      • 涉及行的多少
    • trx_mysql_thread_id:事务线程 ID,可以和 PROCESSLIST 表 JOIN。
    • trx_query:事务正在执行的 SQL 语句。
    • trx_operation_state:事务当前操作状态。
    • trx_tables_in_use:当前事务执行的 SQL 中使用的表的个数。
    • trx_tables_locked:当前执行 SQL 的行锁数量。
    • trx_lock_structs:事务保留的锁数量。
    • trx_lock_memory_bytes:事务锁住的内存大小,单位为 BYTES。
    • trx_rows_locked:事务锁住的记录数。包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行。
    • trx_rows_modified:事务更改的行数。
    • trx_concurrency_tickets:事务并发票数。
    • trx_isolation_level:当前事务的隔离级别。
    • trx_unique_checks:是否打开唯一性检查的标识。
    • trx_foreign_key_checks:是否打开外键检查的标识。
    • trx_last_foreign_key_error:最后一次的外键错误信息。
    • trx_adaptive_hash_latched:自适应散列索引是否被当前事务锁住的标识。
    • trx_adaptive_hash_timeout:是否立刻放弃为自适应散列索引搜索 LATCH 的标识。
  • innodb_locks
    • lock_id:锁 ID。

      lock_trx_id:拥有锁的事务 ID。可以和 INNODB_TRX 表 JOIN 得到事务的详细信息。

      lock_mode:锁的模式。有如下锁类型:行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。

      lock_type:锁的类型。RECORD 代表行级锁,TABLE 代表表级锁。

      lock_table:被锁定的或者包含锁定记录的表的名称。

      lock_index:当 LOCK_TYPE=’RECORD’ 时,表示索引的名称;否则为 NULL。

      lock_space:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的表空间 ID;否则为 NULL。

      lock_page:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的页号;否则为 NULL。

      lock_rec:当 LOCK_TYPE=’RECORD’ 时,表示一堆页面中锁定行的数量,亦即被锁定的记录号;否则为 NULL。

      lock_data:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的主键;否则为NULL。

  • innodb_lock_waits
    • requesting_trx_id:请求事务的 ID。
    • requested_lock_id:事务所等待的锁定的 ID。可以和 INNODB_LOCKS 表 JOIN。
    • blocking_trx_id:阻塞事务的 ID。
    • blocking_lock_id:某一事务的锁的 ID,该事务阻塞了另一事务的运行。可以和 INNODB_LOCKS 表 JOIN。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值