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

性能监控:

  • 主线程状态
  • 行操作统计(绝对值+每秒速率)
  • 突然的速率变化可能预示问题
相关推荐
数据库生产实战3 小时前
ORACLE 19C ADG环境 如何快速删除1.8TB的分区表?有哪些注意事项?
数据库·oracle
hweiyu003 小时前
Linux运维实战:云原生设计与实施Docker&K8S(视频教程)
linux·运维·云原生
blackorbird4 小时前
使用 Overpass Turbo 查找监控摄像头
运维·服务器·数据库·windows
IT永勇4 小时前
SQLite数据库基本操作
数据库·sqlite·嵌入式开发·增删改查·关系型数据库
洋不写bug4 小时前
数据库的创建,查看,修改,删除,字符集编码和校验操作
android·数据库·adb
想ai抽4 小时前
吃透大数据算法-算法地图(备用)
大数据·数据库·spark
weixin_307779134 小时前
Clickhouse导出库的表、视图、用户和角色定义的SQL语句
开发语言·数据库·算法·clickhouse·自动化
小白不想白a4 小时前
【shell】每日shell练习(系统用户安全审计/系统日志错误分析)
linux·运维·云原生
流星白龙4 小时前
【Qt】7.信号和槽_connect函数用法(1)
开发语言·数据库·qt