1、查询是否锁表 show OPEN TABLES where In_use > 0;
2、查询进程
show processlist 查询到相对应的进程===然后 kill id
补充:
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
问题:update语句出现
RROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction报错
1,查看数据库的隔离级别:
mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec)
2,去查看先当前库的线程情况:
mysql> show full processlist;
没有看到正在执行的慢SQL记录线程,再去查看innodb的事务表INNODB_TRX,看下里面是否有正在锁定的事务线程,看看ID是否在show full processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。
mysql> SELECT * FROM information_schema.INNODB_TRX\G;
然后再去查询INNODB_TRX表,就没有阻塞的事务sleep线程存在了,如下所示:
mysql> SELECT * FROM INNODB_TRX\G;
Empty set (0.00 sec)
1、mysql是一个多存储引擎的数据库,在mysql中你可以理解分为两层,server层和存储引擎层 2、show full processlist看到的是server层面线程运行的状态 3、innodb_trx看到的是innodb中事务的执行情况 4、综合2和3来说,innodb是一种存储引擎,可能会出现在2和3中看到的情况不同,因为线程在处于不同状态的时候,会在不同层中工作 例如你在innodb中看到是running,但是你在server中看不到任何状态
5、我之所以加引号说阻塞,是因为你在innodb_trx中看到的状态running,表示的是有一个事务正在执行,只是事务没有提交
像你这种情况,在server层和innodb层都看不到执行的语句,说明sql语句已经执行完了,但是没有commit事务
同时需要补充的是,mysql有一个autocommit参数,在打开时,每一个dml语句都会默认为一个事务,自动帮你提价,如果关闭了,则需要手动显示提交事务
注意,ddl语句是隐式提交的
6、如果你要查看进程是什么原因阻塞的,可以查看show full processlist中的state,比较常见的是metadata lock,说明在等待元数据锁
在innodb_trx会看到lock_wait,一般是在等待行锁或者表锁
,information_schema 库中增加了三个关于锁的表(MEMORY引擎): innodb_trx ## 当前运行的所有事务 innodb_locks ## 当前出现的锁 innodb_lock_waits ## 锁等待的对应关系