mysql数据库磁盘io高的排查是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 最近,数据库会报磁盘IO高的告警,但是cpu不高。故障
● 主机名称: xxxx
● 告警信息: Disk I/O is overloaded on xxxx
● 告警时间: 2020.04.10-13:09:06
● 主机地址: xxxxxx
● 当前状态: 36.14 % 数据库磁盘io高时,执行的sql如下:2527
| xxxx |
172.xxxx
:
35072
| xxxx | Query |
0
| update | insert ignore into `xxxxannotations` (`trace_
|
|
2528
|xxxn |
172.xxxx
:
37270
| xxxx | Query |
0
| update | insert ignore into `xxxxannotations` (`trace_id`, `s
|
2530
| xxxx |
172.xxxx
:
44210
| xxxx | Query |
0
| update | insert into `xxxx_spans` (`trace_id`, `id`, `debug`, `start_ts`, `name
|
2531
|xxxx |
172.xxxx
:
45910
| xxxx | Quer免费主机域名y |
0
| query end | insert ignore into `xxxx_annotations`
4'
,
'
, -
1408108278
,
8031
) |
|
2532
| xxx |
172.xxxx
:
58890
| xxxx | Sleep |
0
| | NULL
也就是数据库会批量的执行insert ignore into 语句。mysql> show engine innodb status G
---TRANSACTION
1557551308
, not started flushing log
---TRANSACTION
1557551309
, not started flushing lo免费主机域名g
---TRANSACTION
1557551310
, not started flushing log
---TRANSACTION
1557551311
, not started flushing log
---TRANSACTION
1557551313
, not started flushing log
---TRANSACTION
1557551304
, not started flushing log
............
可以看到,每个事务都在flushing log中,说明刷redo log比较慢。可能是redo log 比较小。mysql> show variables like
'%innodb_log_file_size%'
;
+----------------------+----------+
| Variable_name | Value |
+----------------------+----------+
| innodb_log_file_size |
50331648
|
+----------------------+----------+
1
row in set (
0.00
sec)
事实证明,innodb_log_file_size确实比较小,才50M,建议增大至2个4G。 继续分析:mysql> show engine innodb status G
--------
FILE I/O
--------
..........
Pending flushes (fsync) log:
1
; buffer pool:
0
1
pending preads,
0
pending pwrites
................
LOG
---
Log sequence number
988322448590
Log flushed up to
988322444468
Pages flushed up to
988311239867
Last checkpoint at
988309561881
1
pending log writes,
0
pending chkp writes
23371463
log i/o
's done,
132.33log i/o's/second
上述看到log thread 挂起的fsync()操作数据为1,说明log thread刷盘有等待。 另外,last checkpoint落后于log flushed up to太多,接近于redo log文件的大小,这时会触发innodb疯狂刷redo,从而导致磁盘io高,对性能影响非常糟糕。 还有,这个数据库的innodb buffer pool也很小,使用的默认值为128M,也需要调大。 优化方法: 设置innodb_log_file_size=4G,设置innodb_buffer_pool_size=4G。 经过观察,数据库磁盘io高、cpu不高的问题消失。看完上述内容,你们掌握mysql数据库磁盘io高的排查是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注云技术行业资讯频道,感谢各位的阅读!
这期内容当中小编将会给大家带来有关怎样使用mysql innodb查看索引高度,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先获取表上的索引情况type:0 是非唯一二级索引。3是聚簇索引。1是automatically …