mysql查看锁表及杀进程问题

 更新时间:2023年07月27日 09:37:09   作者:a2589293499  
这篇文章主要介绍了mysql查看锁表及杀进程问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql查看锁表及杀进程

查看进程

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

各字段的含义

  • 1.id 该进程的标识;
  • 2.user 显示当前用户
  • 3.host 显示来源IP和端口
  • 4.db 显示当前连接的数据库
  • 5.command 显示当前连接的执行的命令,休眠 sleep ,查询 query ,连接 connect 
  • 6.time 此这个状态持续的时间,单位是秒
  • 7.state列 显示使用当前连接的sql语句的状态,很重要的列,详见下面state列的含义
  • 8.info 显示sql语句,长sql可能显示不全 

state列的含义

  • 1.analyzing 比如进行analyze table时 
  • 2.checking table 线程正在执行表检查操作 
  • 3.cleaning up 正准备释放内存 
  • 4.closing tables 应该是一个快速的操作,如果不是这样的话,则应该检查硬盘空间是否已满或者磁盘io是否达到瓶颈 
  • 5.copy to tmp table 线程正在处理一个alter table语句 
  • 6.copying to tmp table 线程将数据写入内存中的临时表 
  • 7.copying to tmp table on disk 线程正在将数据写入磁盘中的临时表。与tmp_table_size参数有关系 
  • 8.creating sort index 线程正在使用内部临时表处理一个select操作 
  • 9.fulltext initialization  服务器正准备进行自然语言全文索引 
  • 10.sending data 线程正在读取和处理一条select语句的行,并且将数据发送至客户端,在此期间会执行大量的磁盘访问 
  • 11.sorting index 线程正在对索引页进行排序 
  • 12.updating 线程寻找更新匹配的行进行更新 
  • 13.waiting for lock_type lock 等待各个种类的表锁 

当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或者退出数据库用户;

锁表的原因:

  • A程序执行了对table_1的insert、update、delete,并还未commit时,B程序也对table_1进行insert、update、delete`时会发生资源正忙的异常,也就是锁表;
  • 锁表常发生与并发而不是并行(并行时,一个线程操作数据库时,另一个线程是能操作数据库的,cpu和i/o分配原则)
  • 锁表也发生在事务嵌套,外层事务对table_1进行了insert、update、delete,内层事务(PROPAGATION_REQUIRES_NEW)也对table_1进行了insert、update、delete,内层事务commit的时需要等待外层事务先commit释放资源(但是是不可能的),最终导致死锁(本次问题就是事务嵌套导致)。多查几次SELECT * FROM information_schema.innodb_trx ;如果锁跟着业务结束(connect超时)锁没了,那么基本上可以确定是业务代码导致,需要分析业务代码。

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代码,找出问题代码

总结

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

您可能感兴趣的文章:

相关文章

  • win32 mysql 5.7.27 安装配置方法图文教程

    win32 mysql 5.7.27 安装配置方法图文教程

    这篇文章主要为大家详细介绍了win32 mysql 5.7.27 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 揭秘SQL优化技巧 改善数据库性能

    揭秘SQL优化技巧 改善数据库性能

    这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础,重点讲述如何优化SQL,来提高数据库的性能
    2012-01-01
  • mysql导入导出数据中文乱码解决方法小结

    mysql导入导出数据中文乱码解决方法小结

    本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友
    2012-10-10
  • MySQL锁阻塞的深入分析

    MySQL锁阻塞的深入分析

    这篇文章主要给大家介绍了关于MySQL锁阻塞的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Mysql 错误too many connections解决方案

    Mysql 错误too many connections解决方案

    这篇文章主要介绍了Mysql 错误too many connections解决方案的相关资料,这里提供了如何解决此问题,需要的朋友可以参考下
    2016-11-11
  • 解析sql语句中left_join、inner_join中的on与where的区别

    解析sql语句中left_join、inner_join中的on与where的区别

    以下是对在sql语句中left_join、inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • MySQL之where使用详解

    MySQL之where使用详解

    我们需要获取数据库表数据的特定子集时,可以使用where子句指定搜索条件进行过滤。本文主要介绍了MySQL之where使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • mysql乱码问题分析与解决方法

    mysql乱码问题分析与解决方法

    开发过程中总避免不了遇到恶心的乱码,或者由乱码引发的一系列问题,这里简要介绍一下自己遇到的乱码问题和解决问题的过程中的想法以及大致的操作
    2012-11-11
  • MySQL分区字段列有必要再单独建索引吗?

    MySQL分区字段列有必要再单独建索引吗?

    这篇文章主要给大家介绍了关于MySQL分区字段列是否有必要再单独建索引的相关资料,文中通过示例进行了验证,对大家的理解和学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • innodb_flush_method取值方法(实例讲解)

    innodb_flush_method取值方法(实例讲解)

    下面小编就为大家带来一篇innodb_flush_method取值方法(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论