视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Mysql高负载排查思路
2020-11-09 07:41:12 责编:小采
文档


发现问题 top命令 查看服务器负载,发现 mysql竟然 百分之两百的cpu ,引起Mysql 负载这么高的原因,估计是 索引问题和某些变态SQL语句. 排查思路 1. 确定高负载的类型,top命令看 负载高是CPU还是IO 。 2. mysql 下执行 查看当前的连接数与执行的sql 语句 。 3.

发现问题
top命令 查看服务器负载,发现 mysql竟然百分之两百的cpu,引起Mysql 负载这么高的原因,估计是索引问题和某些变态SQL语句.

排查思路
1. 确定高负载的类型,top命令看负载高是CPU还是IO。
2. mysql 下执行查看当前的连接数与执行的sql 语句。
3. 检查慢查询日志,可能是慢查询引起负载高。
4. 检查硬件问题,是否磁盘故障问题造成的。
5. 检查监控平台,对比此机器不同时间的负载。

确定负载类型(top)

  1. top - 10:14:18 up 23 days, 11:01, 1 user, load average: 124.17, 55.88, 24.70
  2. Tasks: 138 total, 1 running, 137 sleeping, 0 stopped, 0 zombie
  3. Cpu(s): 2.4%us, 1.0%sy, 0.0%ni, 95.2%id, 2.0%wa, 0.1%hi, 0.2%si, 0.0%st
  4. Mem: 3090528k total, 2965772k used, 124756k free, 93332k buffers
  5. Swap: 4192956k total, 2425132k used, 1767824k free, 756524k cached
  6. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  7. 30833 mysql 15 0 6250m 2.5g 4076 S 257.1 49.9 529:34.45 mysqld


查看当前的连接数与执行的sql 语句

  1. show processlist;
  2. Id User Host db Command Time State Info
  3. 192 slave 8.8.8.142:39820 NULL Binlog Dump 582 Has sent all binlog to slave; waiting for binlog to be updated NULL
  4. 194 slave 8.8.8.120:41075 NULL Binlog Dump 582 Has sent all binlog to slave; waiting for binlog to be updated NULL
  5. 4241 biotherm 8.8.8.46:57861 biotherm Query 493 Sending data SELECT * FROM xxx_list WHERE tid = '1112' AND del = 0 ORDER BY id
  6. DESC LIMIT 0, 4
  7. 424917 biotherm 8.8.8.49:50984 biotherm Query 488 Sending data SELECT * FROM xxx_list WHERE tid = '1112' AND del = 0 ORDER BY id
  8. DESC LIMIT 0, 4
  9. ..............................................
  10. 430330 biotherm 8.8.8.42:35982 biotherm Query 487 Sending data SELECT * FROM xxx_list WHERE tid = '1112' AND del = 0


记录慢查询
编辑Mysql 配置文件(my.cnf),在[mysqld]字段添加以下几行:

  1. log_slow_queries = /usr/local/mysql/var/slow_queries.log #慢查询日志路径
  2. long_query_time = 10 #记录SQL查询超过10s的语句
  3. log-queries-not-using-indexes = 1 #记录没有使用索引的sql


查看慢查询日志

  1. tail /usr/local/mysql/var/slow_queries.log
  2. # Time: 130305 9:48:13
  3. # User@Host: biotherm[biotherm] @ [8.8.8.45]
  4. # Query_time: 1294.881407 Lock_time: 0.000179 Rows_sent: 4 Rows_examined: 1318033
  5. SET timestamp=13639163;
  6. SELECT * FROM xxx_list WHERE tid = '11xx' AND del = 0 ORDER BY id DESC LIMIT 0, 4;

4个参数
Query_time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 54
分别意思为:查询时间 锁定时间 查询结果行数 扫描行数,主要看扫描行数多的语句,然后去数据库加上对应的索引,再优化下变态的sql 语句。

极端情况kill sql进程

  1. 找出占用cpu时间过长的sql,在mysql 下执行如下命令:
  2. show processlist;
  3. 确定后一条sql处于Query状态,且Time时间过长,锁定它的ID,执行如下命令:
  4. kill QUERY 2698157;

注意:杀死 sql进程,可能导致数据丢失,所以执行前要衡量数据的重要性。

下载本文
显示全文
专题