MySQL慢查询问题排查方式

 更新时间:2025年02月28日 09:02:28   作者:山林竹笋  
文章介绍了MySQL慢查询排查的步骤,包括查看当前正在运行的事务状态、查看线程状态、杀死线程、辅助判断命令、开启慢查询日志和开启通用查询日志

MySQL慢查询排查

第一步:查看当前正在运行的事务状态

select trx_state,trx_started,trx_mysql_thread_id,trx_query from information_schema.innodb_trx;

其中:

  • Trx_state:事务状态
  • Trx_started:事务启动时间
  • Trx_mysql_thread_id:事务的线程id
  • Trx_query:事务当前执行的查询sql

Trx_state的值为:“LOCK_WAIT”时,说明发生了锁等待。等待时间过长可能导致程序返回失败。

示例:

第二步:查看线程状态

show processlist;
  • 返回结果包括:id,host,db,Command,Time,State等。
  • 找到id等于第一步中的trx_mysql_thread_id对应的记录,如果Command是“Sleep”。
  • 说明这个线程的事务一直没有提交或者卡住了。我们需要手动kill掉。

第三步:杀死线程

Kill id
  • 在mysql客户端执行上面的命令杀死线程。
  • 一般使用以上的命令足以判断是否是因为事务等待问题发生错误。

第四步:辅助判断命令

此外,以下命令也可以辅助判断:

1. 查询行锁状态:

show status like 'InnoDB_row_lock%';

返回中,Innodb_row_lock_current_waits显示正在等待行锁的数量。

2. 查询当前使用的锁

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

Mysql8中对应为:

select * from performance_schema.data_locks;

3. 查询锁等待的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

Mysql8中对应为:

select * from performance_schema.data_lock_waits;

4. 查询当前被锁的表

show OPEN TABLES where In_use > 0;

5. 查询最近一次的死锁记录日志

show engine innodb status

可以导出到本地查看:

mysql -u root -p --execute="show engine innodb status \G" > /root/test.log

根据以上命令,找到结果中存在等待异常的trx_id即事务id,再回到第一步,从当前事务列表中找到对应事务,然后杀死对应线程。

第五步:开启慢查询日志

通过慢查询日志,记录执行时间超时的sql语句。超时默认是10秒。

1. 查看慢查询日志是否开启,并开启日志

show variables like '%query%';

返回中,slow_query_log为“OFF”,表示关闭。开启日志:

set global slow_query_log='ON';

第六步:开启通用查询日志

1. 查看通用查询日志是否开启

show variables like '%general%';

返回中,general_log为“OFF”,表示关闭。开启日志:

set global general_log='ON'

注意:

通用日志会记录所有的sql执行语句,会导致日志文件过大,以及执行速度变慢,应在查询后及时关闭。

总结

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

相关文章

  • MySQL8.0升级的踩坑历险记

    MySQL8.0升级的踩坑历险记

    听说mysql8的性能提升了很多,对于我这种喜欢把所有软件升级到最新版的人来说,二话不说直接升级,这篇文章主要给大家介绍了关于MySQL8.0升级踩坑的相关资料,需要的朋友可以参考下
    2021-10-10
  • MySQL datetime类型与时间、日期格式字符串大小比较的方法

    MySQL datetime类型与时间、日期格式字符串大小比较的方法

    这篇文章主要介绍了MySQL datetime类型与时间、日期格式字符串大小比较,本文使用的是mysql8.0.27版本,其他版本自测一下,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • MySQL Json类型字段IN查询分组优化

    MySQL Json类型字段IN查询分组优化

    这篇文章主要为大家介绍了MySQL Json类型字段IN查询分组优化,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • MYSQL数据库GTID实现主从复制实现(超级方便)

    MYSQL数据库GTID实现主从复制实现(超级方便)

    这篇文章主要介绍了MYSQL数据库GTID实现主从复制实现(超级方便),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 麒麟系统上安装 MySQL 8.0.24的详细步骤(避坑指南)

    麒麟系统上安装 MySQL 8.0.24的详细步骤(避坑指南)

    这篇文章主要介绍了麒麟系统上安装MySQL8.0.24的详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Mysql数据库聚簇索引与非聚簇索引举例详解

    Mysql数据库聚簇索引与非聚簇索引举例详解

    在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,这篇文章主要介绍了Mysql数据库聚簇索引与非聚簇索引的相关资料,需要的朋友可以参考下
    2025-11-11
  • MySQL 8.0.35数据库下载安装以及环境变量的配置方法

    MySQL 8.0.35数据库下载安装以及环境变量的配置方法

    很多朋友刚开始接触mysql数据库服务器,这篇文章主要给大家介绍了关于MySQL 8.0.35数据库下载安装以及环境变量的配置方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 浅谈MySql 视图、触发器以及存储过程

    浅谈MySql 视图、触发器以及存储过程

    这篇文章主要介绍了MySql 视图、触发器以及存储过程的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • MySQL中的交叉连接、自然连接和内连接查询详解

    MySQL中的交叉连接、自然连接和内连接查询详解

    这篇文章主要介绍了MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 关于MySQL中explain工具的使用

    关于MySQL中explain工具的使用

    这篇文章主要介绍了关于MySQL中explain工具的使用,在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL,需要的朋友可以参考下
    2023-05-05

最新评论