MySQL案例-内存使用率无限增长

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 拖了好久了, 抽空补上  _(:з」∠)_ -------------------------------------------------------------------------------------------------正文-------------...
拖了好久了, 抽空补上  _(:з」∠)_
-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------

背景: 收到内存报警的信息以后, 从监控中发现MySQL服务器的内存使用率在不断的增长;
附图:


虽然进行了重启, 但是内存占用率依然会不停的增长, 大约在半个月左右的时间内又把内存消耗完毕;

场景: 未搭建场景, 数据库版本 5.7.12

分析: 
PS: 时间久远, 截图仅做分析/示例所用, 不一定是当时候出问题时的数据

尝试方向1:
首先考虑的是buffer相关的参数是否设置有误, 毕竟当初crash的时候曾经出现过类似的问题(http://blog.itpub.net/29510932/viewspace-2123096/)
结果: 参数设置都没什么明显的问题;

尝试方向2:
既然设置没什么问题, 那就看一下内存的占用情况吧~
使用pmap -d  看一下进程的内存情况; 部分信息截图如下


anon代表进程主动申请的内存, 当时对有问题的机器进行统计时, 发现主动申请的内存占了进程内存的95%(当然的..因为buffer都在这里面)
考虑到innodb_buffer_pool的大小只有总内存的50%, 多出来的这些"已申请"的内存实在是有点太多了, 是不是有什么线程申请了大量的内存没有释放?

尝试方向2--检查线程的内存使用:
MySQL5.7中对ps(performance_schema)进行了拓展, 能统计更多的数据了, 这其中就包括了有关mem的信息;
由于默认是关闭的, 所以现在要临时打开这些统计数据;

点击(此处)折叠或打开

  1. update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%'
执行上述语句之后, 在ps里面就能在mem相关的表里面看到相关的统计信息了; 如下图:


其中 CURRENT_NUMBER_OF_BYTES_USED可以近似的当成目前占用的内存总数;
PS: 由于这个统计信息并不会区分共享内存, 所以有可能会出现占用内存为负数, 或者各个项的总和大于实际占用内存总数;

由于是怀疑线程, 所以用CURRENT_NUMBER_OF_BYTES_USED倒序, 查询Thread相关的表; 结果类似下图:


当时有问题的实例中, 查询结果结合ps.thread表数据,显示thread/sql/slave_sql和thread/sql/one_connection(monitor用户)的内存占用非常高~

尝试方向2--分析线程:
thread/sql/slave_sql是同步中的SQL线程, 负责复现主库binlog中的事务, 这个线程占用大量内存却不进行释放的现象, 第一反应不是我们自己的问题;
在mysql bug上面找了一圈,发现以前有人提交了类似的bug
(https://bugs.mysql.com/bug.php?id=71197), 状态为close;
官方给出的解决方案是关闭并行复制, 并且把 rpl相关的信息存在file里面, 而不是table;


PS: Nice! 那5.7弄个并行复制不是坑自己么......  _(:з」∠)_

thread/sql/one_connection(monitor用户)是由用户创建的, 可以发现是monitor用户保持的连接, 主要用于自维护的监控插件获取信息的;
这个至少是能想办法解决的, 那么看一下monitor线程的详细信息:

查看以后发现memory/sql/String::value占用的内存数最多;
从字面意思理解, 似乎是执行的SQL有点问题, 保存了大量的结果没有释放?

联系了插件的编写人员, 找到插件的代码, 仔细看了一圈, 发现代码在使用cursor执行SQL以后, 没有close......

对代码进行fix及推送以后, 内存使用率的增长速度大幅度降低了;

处理结果:
把这个没有close的经典问题挂到了内部的文档里面作为反例.......
然后由于一些原因, SQL线程无法释放已占用内存的问题无法解决, 好在增长的速度并不快, 还在可接受的范围之内, 暂时做好定期维护(重启)的准备;
PS: 到目前为止, 出问题的个别实例都没有再增长到非常高的地步, 目测需要两个多月才可能会维护(重启)一次;
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
5月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
7月前
|
存储 SQL 关系型数据库
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
184 25
|
7月前
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
|
9月前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
498 5
|
9月前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
9月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
907 7
|
11月前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
701 3
|
11月前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
165 4
|
11月前
|
SQL 监控 关系型数据库
如何查看MySQL使用的内存
综合运用上述方法,您可以全方位地监控和管理MySQL的内存使用。从简单查看配置到深入分析实时内存占用,每种方法都有其适用场景和优势。定期检查和调整MySQL的内存配置,对于维持数据库性能和稳定性至关重要。
1460 0

推荐镜像

更多