2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了。
硬件配置:256G 内存,48 core
接手这个问题时现场已经不在了,信息有限,所以我们先从监控系统中查看一下当时的状态。从 PMM 监控来看,这个 MySQL 实例每天上午九点 CPU 都会升高到 10%-20%,只有 1 月 2 号 和 1 月 11 号 CPU 达到 100%,也就是今天的故障。怀疑是业务在九点会有压力下发,排查方向是慢查询。
1. 按执行次数统计 slow log 发现次数最多的一条 sql:
mysqldumpslow -s c slow.log>/tmp/slow_report.txt
Count: 3276 Time=21.75s (71261s) Lock=0.00s (1s) Rows=0.9 (2785), xxxSELECT T.TASK_ID,T.xx,T.xx,...FROM T_xx_TASK TWHERE N=NAND T.STATUS IN (N,N,N)AND IFNULL(T.MAX_OPEN_TIMES,N) > IFNULL(T.OPEN_TIMES,N)AND (T.CLOSE_DATE IS NULL OR T.CLOSE_DATE >= SUBDATE(NOW(),INTERVAL 'S' MINUTE))AND T.REL_DEVTYPE = NAND T.REL_DEVID = NAND T.TASK_DATE >= 'S'AND T.TASK_DATE <= 'S'ORDER BY TASK_ID DESCLIMIT N,N
2. 在 slow log 中找到这条查询记录扫描行数:“Rows_examined: 1161559”,看起来是全表扫描,CPU 升高通常原因就是同时执行大量慢 sql,所以接下来分析这个 sql
3. 因为 T_xxx_TASK 表在现场应急时清理过数据(从 110 万删至 4 万行),所以需要用备份恢复该表到故障前。恢复备份后,查看执行计划与执行时间:
explain SELECT T.TASK_ID,T.xx,...FROM T_xxx_TASK TWHERE 1=1AND T.STATUS IN (1,2,3)AND IFNULL(T.MAX_OPEN_TIMES,0) > IFNULL(T.OPEN_TIMES,0)AND (T.CLOSE_DATE IS NULL OR T.CLOSE_DATE >= SUBDATE(NOW(),INTERVAL '10' MINUTE))AND T.REL_DEVTYPE = 1AND T.REL_DEVID = 000000025xxxAND T.TASK_DATE >= '2019-01-11'AND T.TASK_DATE <= '2019-01-11'ORDER BY TASK_ID DESCLIMIT 0,20;
在业务高速发展的时候后端的压力慢慢变大服务器扩容在所难免。今天就聊聊扩容相...
python实现基于八方向判断的断裂连接 讲解 略 代码 八方向连接算法 import numpy...
函数 FunctionRegImg(TheStr)DimRegExSetRegEx=NewRegExp'建立正则表达对象。Reg...
Lamda表达式 λ 希腊字母表中排序第十一位字母英语名称为Lambda 避免匿名内部类...
从今年 9 月开始,微软 Edge 的更新速度将加快。跟随 Google Chrome 浏览器的脚...
ajax beforeSend: 先说说这个 beforeSend, 在请求发送前执行 比如 可以判断用户...
1.我这一生都在关我身后的门!当你关门时,也将过去的一切留在后面,不管是美好...
作为初始设置(也称为开箱即用体验(OOBE))的一部分,Windows 10不再允许用户指定...
复制代码 代码如下: Function NumberSplit(num) Dim i,length length=Len(num) F...
长草 题目描述 小明有一块空地他将这块空地划分为 n 行 m 列的小块每行和每列的...