Mysql数据库——阻塞语句查询与分析

目录

前言

阻塞语句查询与分析

[Show Processlist------查看每个与数据库连接的session状态](#Show Processlist——查看每个与数据库连接的session状态)

非Sleeping状态进程数

执行时间较长进程号

查看当前运行的所有事务

当前锁

被blocking阻塞的事务数

数据库连接数

查看锁状态

正在被使用的表


前言

MySQL阻塞是指并发访问时,某个事务长时间占用资源不释放,导致其他事务受阻或执行缓慢。这可能导致性能下降甚至死锁,需及时处理。阻塞原因主要有锁冲突、长事务和死锁。排查阻塞语句可通过查看进程列表、使用性能监控工具、启用慢查询日志等方法,进而优化查询和索引,调整隔离级别和锁策略。

阻塞语句查询与分析

Show Processlist------查看每个与 数据库 连接的session状态

sql 复制代码
# 展示前100条线程
show processlist;
# 如果想列出全部线程,请使用
show full processlist;
sql 复制代码
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
| 15 | root | localhost | NULL | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)
字段列 含义
Id ID标识;要kill一个语句的时候用
User 当前连接用户
Host 显示这个连接从哪个ip的哪个端口上发出
db 使用的数据库名
Command 连接状态,一般是休眠(sleep);查询(query);连接(connect);
Time 连接持续时间;单位是秒
State 显示当前sql语句的状态
Info 显示这个sql语句

非Sleeping状态进程数

sql 复制代码
select count(1) from information_schema.processlist where command != 'Sleep'

执行时间较长进程号

sql 复制代码
select id,time from information_schema.processlist order by time desc limit 5;

查看当前运行的所有事务

sql 复制代码
select * from information_schema.innodb_trx;

当前锁

sql 复制代码
# 当前的锁
Mysql8.0 之前使用:select * from information_schema.innodb_locks;
Mysql8.0 使用:select * from performance_schema.data_locks;

# 锁等待的对应关系 
Mysql8.0 之前使用:select * from information_schema.innodb_lock_waits;
Mysql8.0 使用:select * from performance_schema.data_lock_waits;

被blocking阻塞的事务数

sql 复制代码
SELECT COUNT(BLOCKING_ENGINE_TRANSACTION_ID) FROM performance_schema.data_lock_waits;

数据库连接数

sql 复制代码
SHOW STATUS LIKE 'Threads_connected';

查看锁状态

sql 复制代码
show status like 'innodb_row_lock_%';
sql 复制代码
mysql> show status like'innodb_row_lock_%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 0     |
| Innodb_row_lock_time_avg      | 0     |
| Innodb_row_lock_time_max      | 0     |
| Innodb_row_lock_waits         | 0     |
+-------------------------------+-------+
5 rows in set (0.01 sec)
字段列 含义
Innodb_row_lock_current_waits 当前等待锁的数量
Innodb_row_lock_time 系统启动到现在,锁定的总时间长度
Innodb_row_lock_time_avg 每次平均锁定的时间
Innodb_row_lock_time_max 最长一次锁定时间
Innodb_row_lock_waits 系统启动到现在总共锁定的次数

正在被使用的表

sql 复制代码
show OPEN TABLES where In_use > 0;

如果某个事务已经卡住了,可以使用 MySQL的 kill 命令来强制结束该事务,以释放资源。

相关推荐
掉头发的王富贵8 分钟前
ShardingSphere-JDBC入门教程(上篇)
spring boot·后端·mysql
小云数据库服务专线21 分钟前
GaussDB数据库架构师修炼(十六) 如何选择磁盘
数据库·数据库架构·gaussdb
码出财富1 小时前
SQL语法大全指南
数据库·mysql·oracle
异世界贤狼转生码农3 小时前
MongoDB Windows 系统实战手册:从配置到数据处理入门
数据库·mongodb
QuZhengRong3 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
码农阿豪3 小时前
Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
数据库·windows
冷崖8 小时前
MySQL异步连接池的学习(五)
学习·mysql
时序数据说9 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
听雪楼主.12 小时前
Oracle Undo Tablespace 使用率暴涨案例分析
数据库·oracle·架构
我科绝伦(Huanhuan Zhou)12 小时前
KINGBASE集群日常维护管理命令总结
数据库·database