步骤
1.查询进程(show full processlist;)
show processlist;
id #ID标识,要kill一个语句的时候很有用
use #当前连接用户
host #显示这个连接从哪个ip的哪个端口上发出
db #数据库名
command #连接状态,一般是休眠(sleep),查询(query),连接(connect)
time #连接持续时间,单位是秒
state #显示当前sql语句的状态
info #显示这个sql语句
2.查询到相对应的进程,然后 kill id
3.查询是否锁表
show OPEN TABLES where In_use > 0;
4.查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
5.查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
select * from information_schema.innodb_trx;
select * from innodb_trx;
6.查看锁阻塞线程信息
show processlist;
show engine innodb status;
7.查看表锁的情况:
show status like 'table%';
8.查看InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:
show status like 'InnoDB_row_lock%';
9.开启innodb_lock_monitor后,再使用show engine innodb status查看,能够找到锁阻塞的根因。
结论
-- 在分析innodb中锁阻塞时,几种方法的对比情况:
-- (1)使用show processlist查看不靠谱;
-- (2)直接使用show engine innodb status查看,无法判断到问题的根因;
-- (3)使用mysqladmin debug查看,能看到所有产生锁的线程,但无法判断哪个才是根因;
-- (4)开启innodb_lock_monitor后,再使用show engine innodb status查看,能够找到锁阻塞的根因。
SHOW VARIABLES LIKE 'lock_wait_timeout';