Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql查看锁表及杀进程

mysql查看锁表及杀进程问题

作者:a2589293499

这篇文章主要介绍了mysql查看锁表及杀进程问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql查看锁表及杀进程

查看进程

登录mysqlmysql -uroot -ppassword查看进程mysql> show processlist;

各字段的含义

state列的含义

当state列为waiting for lock_type lock时,表示某个SQL正在query导致别的SQL等待锁,需要根据id杀进程。

杀进程

1.杀单个进程

mysql> kill 127402;

2.杀多个进程,组装kill语句

select concat('kill ',id,';') from information_schema.processlist where user='root' and state='waiting for lock_type lock';执行组装后的kill语句

其他有用命令

查看被锁的表

mysql> show open tables where in_use > 0;

查看当前的事务

mysql> select * from information_schema.innodb_trx;

查看被锁的事务

mysql> select * from information_schema.innodb_locks;

查看等锁的事务

mysql> select * from information_schema.innodb_lock_waits;

mysql锁表原因及解决

问题如图

在这里插入图片描述

锁表发生原因

锁表发生在 insert、update、delete中;

锁表的原理是数据库使用独占式锁机制,当执行上面的语句时,对表进行锁住,直到发生commit或者rollback或者退出数据库用户;

锁表的原因:

mysql锁表解决

-- 找到超时的表,查询超时的SQL
SELECT * FROM information_schema.innodb_trx ;
-- 查看当前被使用的表,查询是否有锁表
-- SHOW OPEN TABLES:列举在表缓存中当前被打开的非TEMPORARY表。
-- In_use:表当前被查询使用的次数。如果该数为零,则表是打开的,但是当前没有被使用。
show OPEN TABLES where In_use > 0;
-- 查询全局等待事务锁超时时间
SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
-- 设置全局等待事务锁超时时间
SET  GLOBAL innodb_lock_wait_timeout=100;
-- 查询当前会话等待事务锁超时时间
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
-- 查看进程id,然后用kill id杀掉进程
show processlist;
SELECT * FROM information_schema.PROCESSLIST;
-- 查询正在执行的进程
SELECT * FROM information_schema.PROCESSLIST where length(info) >0 ;
-- 查看被锁住的
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-- 等待锁定
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-- innodb_locks表在8.0.13版本中由performance_schema.data_locks表所代替,innodb_lock_waits表则由performance_schema.data_lock_waits表代替
-- 杀掉锁表进程
kill 5601

事务嵌套引起的死锁

这时候就不能简单的kill掉进程了,需要review代码,找出问题代码

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文