MySQL运维常用SQL

最近因排查MySQL中一个SQL查询缓慢问题,用到了一些排查问题的SQL,在这里进行下总结及延申

一、查看所有数据库连接线程状态

sql 复制代码
SHOW PROCESSLIST;

关键列解析:

Command类型:

常用相关查询

sql 复制代码
-- 查找慢查询(按执行时间倒序排序)
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE COMMAND = 'Query' 
ORDER BY TIME DESC;

-- 清理空闲连接(查找空闲超过10分钟的连接)
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE COMMAND = 'Sleep' AND TIME > 600;

-- 找出被阻塞的事务
SELECT * 
FROM INFORMATION_SCHEMA.INNODB_TRX trx
JOIN INFORMATION_SCHEMA.PROCESSLIST pl 
  ON trx.trx_mysql_thread_id = pl.ID
WHERE trx.trx_state = 'LOCK WAIT';

二、查询正在执行的事务

sql 复制代码
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX ORDER BY trx_started DESC;

列解析:

三、查看当前死锁信息

复制代码
SHOW ENGINE INNODB STATUS

核心部分深度解析

1. BACKGROUND THREAD

显示 InnoDB 主线程状态:

text 复制代码
srv_master_thread loops: 1000 srv_active, 10 srv_shutdown, 100 srv_idle
srv_master_thread log flush and writes: 1100
  • srv_active:活动循环次数
  • srv_idle:空闲循环次数
  • log flush:日志刷新次数

2. SEMAPHORES (信号量/锁等待)

text 复制代码
OS WAIT ARRAY INFO: reservation count 100, signal count 99
Mutex spin waits 200, rounds 3000, OS waits 50
RW-shared spins 150, OS waits 30; RW-excl spins 80, OS waits 20

关键指标:

  • OS waits:操作系统级等待次数(值高表示严重锁竞争)
  • spin waits:自旋锁等待次数
  • 高值警告:OS waits > 0.5% of spin waits 需优化

3. TRANSACTIONS (事务状态)

最重要的诊断部分:

text 复制代码
---TRANSACTION 123456789, ACTIVE 10 sec
2 lock struct(s), heap size 360, 1 row lock(s), undo log entries 1
MySQL thread id 42, OS thread handle 0x7f8d12345678, query id 999 localhost root
UPDATE users SET status=1 WHERE id=100
------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 333 page no 3 n bits 72 index `PRIMARY` of table `test`.`users`
 trx id 123456789 lock_mode X waiting

关键信息:

  • 事务ID和持续时间
  • 持有/等待的锁(lock_mode X 表示排他锁)
  • 阻塞的SQL语句
  • 线程关联信息

4. LATEST DETECTED DEADLOCK (最新死锁)

text 复制代码
*** (1) TRANSACTION:
TRANSACTION 111111, ACTIVE 5 sec starting index read
mysql tables in use 1, locked 1
UPDATE t1 SET col=1 WHERE id=10

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 100 page no 5 ...

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 200 page no 8 ...

*** (2) TRANSACTION:
TRANSACTION 222222, ACTIVE 3 sec starting index read
UPDATE t2 SET col=1 WHERE id=20

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 200 page no 8 ...

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 100 page no 5 ...

死锁分析要素:

  • 冲突的事务和SQL语句
  • 各自持有的锁
  • 相互等待的资源
  • 最终牺牲的事务(WE ROLL BACK TRANSACTION (2))

5. FILE I/O (I/O 线程)

text 复制代码
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: doing file i/o (read thread)
Pending normal aio reads: 0, aio writes: 0
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0

监控点:

  • I/O线程状态(waiting/doing i/o)
  • 挂起的异步I/O操作数量

6. BUFFER POOL AND MEMORY (缓冲池)

text 复制代码
Buffer pool size   32768
Free buffers       1024
Database pages     30000
Modified db pages  500  # 脏页数量
Reads 100000, creates 2000, writes 3000
Buffer pool hit rate 999 / 1000  # 命中率99.9%

关键指标:

  • Modified db pages:需刷盘的脏页(突然增加可能致性能下降)
  • Hit rate:缓冲池命中率(应 > 95%)
  • Reads:磁盘读取次数(高则需扩大缓冲池)

7. ROW OPERATIONS (行操作)

text 复制代码
Main thread process no. 1000, id 888888, state: sleeping
Number of rows inserted 10000, updated 5000, deleted 200, read 999999
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 10.00 reads/s

性能监控:

  • 主线程状态
  • 行操作统计(绝对值+每秒速率)
  • 突然的速率变化可能预示问题
相关推荐
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
小白男神4 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶4 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G4 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备4 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远4 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
AI职业加油站4 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
漂着的圆木4 天前
Agent 功能参与度:Copilot 怎么算
sql·数据分析·agent·githubcopilot·度量
此冬歌咏4 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
kybs19914 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net