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 命令来强制结束该事务,以释放资源。

相关推荐
黑桃小柒712 分钟前
Django模型关系:从一对多到多对多全解析
数据库·django·sqlite
上海安当技术23 分钟前
统一身份认证平台怎么落地?11 个异构业务系统接入 ASP 的完整实施路径
数据库·servlet·架构·kubernetes·jenkins
全栈派森37 分钟前
告别大表膨胀!MySQL 冷热分离落地全过程(含 CDC 与单行锁抢占实战)
大数据·mysql
篮框坏了1 小时前
大事务 DELETE 锁表排查:删 3344 万行,一个清理任务变成周期炸弹
mysql
在水一缸1 小时前
PGSimCity:当数据库内核变成一座可以漫步的城市
数据库·postgresql·可视化·开源项目·数据库内核·pgsimcity·技术科普
jnrjian1 小时前
psql 执行多个 sql 文件
数据库·sql
LinuxGeek10242 小时前
Kylin-Server-V11、openEuler-22.03和openEuler-24.03适配原生rpm的MySQL 8.4.11版本正式发布
大数据·mysql·kylin
@insist1234 小时前
信息系统管理工程师-运维人员管理与核心运维过程(上篇)
数据库·软考·软件水平考试·信息系统管理工程师·软考信管
muddjsv4 小时前
SQLite 零基础 CRUD 实战详解:增删改查标准语法与高危避坑
数据库·sqlite
Lucifer三思而后行4 小时前
TDSQL MySQL 版 DBA 实用 100 条命令
mysql·tdsql