一,背景及表现
用户普遍反馈业务功能,无法加载出数据,服务挂了
二,数据库指标
三,排查方反馈
排查方反馈:查全量数据导致的,就是没查出来但是一直在查
四,分析
1.应用服务器问题,内存溢出了,因为查询了大量数据
2.数据库问题(内存占满,连接数占满)
过一会会好,如果服务器出现问题,应该需要重启,无需要重启就好了,说明应该服务器正常,压根数据没有加载到服务器。
同时看数据库内存占用已经100%了,说明问题出现在数据库
具体原因呢,是因为量吗,还是因为慢
从慢的角度,sql执行了48s,慢是肯定慢,但是数据量已经查出来了?
从量的角度,因为数据库内存占满了,很好解释了,在执行查询时将大量数据加载到内存中,数据库内存占满了。
且:从数据库内存占用与cpu占用来看,内存占用满了,cpu占用没有满,说明问题还是在内存
量与内存有关,慢与cpu有关
现在查询量是10w,那一般多少数据量比较合适?
数据库服务配置:CPU:8核 内存:16384MB(16G) 磁盘:200GB
五,疑问
1.一次查询数据量不操过多少相对合适?比如在数据库服务CPU:8核 内存:16384MB(16G)
单机 MySQL 数据库可以支撑多大数据量? - 知乎
2.如果把sql优化量,加了索引,快了,还是同样查询10万数据,会不会同样数据库内存打满
@量与内存有关,慢与cpu有关。现在必须降量,快了也不行
3.数据库内存占满以后,具体是如何恢复的,怎么降下去的
@数据库的架构是一主一备,从数据库主备信息看,备不可用了
为什么是备不可用?备不提供查询,不应该是主不可用,发生主备切换吗
数据库内存占满后,数据库是挂吗,挂了是需要人工重启吗,还是会自动降内存,自动回复?
六,其他排查方案
1.查看数据库连接是否占满
show status like 'Threads_connected';
show variables like '%max_connection%';
2.分析内存占用高的原因
可以使用以下代码查询InnoDB引擎的状态信息:
SHOW ENGINE InnoDB STATUS;
返回的结果中包含了大量的信息,我们关注的是其中的"BUFFER POOL AND MEMORY"部分。这一部分详细描述了缓冲池的使用情况,包括缓冲池的大小、已用内存、脏页数量等。通过分析这些信息,我们可以获得更准确的内存占用高的原因。