【MySQL运维】ERROR 1205 (HY000): Lock wait timeout exceeded的解决办法
今天使用SQLyog给同事执行一个逻辑较差的SQL时出现长时间没有执行完毕的情况,终止掉该SQL进行优化重新提交,出现“ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction”的错误提示,意思是说锁超时。使用show full processlist 没有看到有异常语句正在执行和被锁,经过查阅资料后通过information_schema和sys库中的几个表成功找出被锁语句:
· information_schema.innodb_trx表:查询当前运行的所有事务
· information_schema.innodb_locks表:查询当前出现的锁
· information_schema.innodb_lock_waits表:查询锁等待的对应关系
· sys.schema_table_lock_waits:查询造成阻塞的线程ID
知道如何查询就好办了,再次执行SQL语句,然后查询表中内容
SELECT * FROM information_schema.innodb_trx \G #查看正在锁的事务
select * from information_schema.innodb_lock_waits; #查看等待锁的事务,可以找到锁的源头
select * from sys.schema_table_lock_waits
果然看到了状态是Locking,而导致锁的原因就是最开始那条被中断的语句没有正常结束,这个时候找到事务的ID号(trx_mysql_thread_id)准备杀掉。
在MySQL命令行中将其kill即可恢复正常,需要注意的是kill的是线程trx_mysql_thread_id而不是trx_id
mysql > kill 386014769
评论