MySQL 8.0不再担心被垃圾SQL搞爆内存

刚升级到MySQL8.0就凉凉,是时候准备再次重启升级了 2) 新增group_replication_preemptive_garbage_collection(单主模式预垃圾回收)和group_replication_preemptive_garbage_collection_rows_threshold(触发阈值)专用服务器自动配置:当innodb_dedicated_server=ON时,innodb_redo_log_capacity的计算从基于内存改为基于CPU,且不再改变innodb_flush_metho。下面总结几个比较常见的已弃用参数及命令。 阅读详情

MySQL 8.0.28引入的新功能

MySQL 8.0.28开始,新增一个特性,支持监控统计并限制各个连接(会话)的内存消耗,避免大量用户连接因为执行垃圾SQL消耗过多内存,造成可能被OOM kill的风险。

首先,需要先设置系统选项 global_connection_memory_tracking = 1,之后可以通过系统状态变量 Global_connection_memory 查看当前所有连接消耗的内存总量:

mysql> show global status like 'Global_connection_memory';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| Global_connection_memory | 1122912 |
+--------------------------+---------+

系统选项 global_connection_memory_tracking 可以全局开启,也可以在单个会话中独立开启。如果是全局开启,则会针对所有连接统计内存消耗情况,包括系统内部线程,以及root用户创建的连接;如果是单个会话中独立开启,则只会统计当前会话连接的内存消耗。此外,InnoDB buffer pool不在统计范围内。

可以通过设置选项 connection_memory_chunk_size 来控制内存统计更新频率,该选项默认值为8KB,也就是当内存使用变化超过8KB时,才会更新统计结果。

可以调整每个会话连接可使用内存上限,由选项 connection_memory_limit 定义其限制,默认值及最大值都是 18446744073709551615,这个默认值太大了,等同于没有限制。如果线上经常运行垃圾SQL导致MySQL内存消耗过大的话,可以适当调低这个选项。

如何在评估一条SQL可能要消耗多少内存呢?可以先调整选项值 connection_memory_limit = 2097152,即调低到2MB。然后以普通用户身份(没有SUPER、SYSTEM_VARIABLES_ADMIN、SESSION_VARIABLES_ADMIN等权限)执行相应的SQL,如果预估需要消耗的内存超过2MB,则会发出类似下面的报错,并且这个连接会被杀掉断开:

mysql> select @@global.connection_memory_limit;
+----------------------------------+
| @@global.connection_memory_limit |
+----------------------------------+
|                          2097152 |
+----------------------------------+

mysql> select count(c) from t group by c;
ERROR 4082 (HY000): Connection closed. Connection memory limit 2097152 bytes exceeded. Consumed 7079568 bytes.

可以看到上述报错信息中提示这条SQL需要消耗约 7079568字节 的内存。当然了,实际上这条SQL需要消耗的内存不止 7079568字节,随着我们细粒度逐步上调 connection_memory_limit 选项值,最后会发现这条SQL需要消耗的内存约为 13087952字节。

当执行完这条SQL后,我们再次查询状态变量 Global_connection_memory,会发现它的值并没这么大,说明这条SQL执行完毕后,相应的内存也立即释放,只保留维持会话连接所需的基本内存:

mysql> select count(c) from t group by c; show global status like 'Global_connection_memory'; show session status like 'Global_connection_memory';
+----------+
| count(c) |
+----------+
|        2 |
+----------+
1 row in set (0.04 sec)

+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| Global_connection_memory | 2193153 |
+--------------------------+---------+
1 row in set (0.00 sec)

前面提到一点,只有普通用户执行SQL才会受到内存使用上限约束,如果是用root用户执行同一条SQL,则不受限制:

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> select @@global.connection_memory_limit;
+----------------------------------+
| @@global.connection_memory_limit |
+----------------------------------+
|                          2097152 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select count(c) from t group by c;
+----------+
| count(c) |
+----------+
|        2 |
+----------+
1 row in set (0.05 sec)

所以不能频繁用root等具备SUPER权限的用户执行需要大内存的SQL,避免被OOM kill。

另外,选项 connection_memory_chunk_size 如果设置太小,则会频繁更新内存统计,对系统性能也会有影响;但也不建议设置太大,否则可能因为更新不及时而引发OOM问题,大部分情况下采用默认值即可。

综上,假设有个服务器物理内存是96GB,建议考虑做如下分配:

选项设置值
innodb_buffer_pool_size64G
global_connection_memory_limit12G
connection_memory_chunk_size8192
connection_memory_limit96M
global_connection_memory_trackingON

在上述规划中,设置了每个会话中,普通用户执行的SQL消耗内存不能超过96MB,所有会话消耗的内存总量不超过12GB,约可最高支撑128个并发连接;此外,innodb buffer pool + 各会话内存的和是 76G,约为物理内存的80%,已给系统预留出基本充足的剩余内存,降低发生SWAP的风险。

延伸阅读


Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

社区2022年度勋章获奖名单: https://greatsql.cn/thread-184-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流:

image-20221030163217640

内存泄漏?OOM?这篇 Java 垃圾回收指南让你不再踩坑 创建合适的索引:遵循最左前缀原则,避免冗余只查询需要的字段:避免使用SELECT *优化分页查询:使用延迟关联提高性能避免大事务:拆分事务,异步处理非核心操作使用EXPLAIN分析SQL:了解SQL的执行计划🚀 行动建议:今天就检查你的项目,找出最耗时的10条SQL,按照本文的方法进行优化,你会看到意想不到的性能提升!💬 互动时间:你在MySQL优化中遇到过什么有趣的问题?有什么独特的调优技巧?欢迎在评论区分享你的故事和见解!👇关注「编程菜鸟旅」,一起从菜鸟成长为技术大牛! 阅读详情

相关推荐

MySQL OOM(内存溢出)的解决思路

主要介绍了MySQL OOM(内存溢出)的解决思路,文中讲解非常细致,帮助大家在学习工作中解决内存溢出的问题,感兴趣的朋友可以了解下

MySQL OOM(内存溢出)的排查思路及优化方法

​OOM全称"Out Of Memory",即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出产生原因多种多样,当内存严重不足时,内核有两种选择: 直接panic 杀掉部分进程,释放一些内核。 大部分情况下,会杀掉导致OOM的进程,然后系统恢复。...

MYSQL轻松学的专栏 1万+

PRPD图谱分析从入门到精通:5种典型放电模式的识别手册

本文详细解析PRPD图谱分析技术,重点介绍电晕放电、悬浮放电等5种典型放电模式的识别方法。通过37组真实案例对比,提供关键识别区和诊断流程图模板,帮助工程师快速掌握变电站设备状态监测的核心技能,提升绝缘缺陷诊断准确率。

weixin_29214199的博客 467

查看mysql是什么对象导致被OOM了

有次遇到我的mysql被OOM了,后来翻看mysql系统表的文档才知道怎么看是哪个mysql对象占用的内存比较多,我的版本是5.7.17 下边两个语句都可以查看是哪个对象消耗的内存比较多   1:select event_name,current_alloc from sys.memory_global_by_current_bytes limit 5   2:select even

laiyijian的博客 1864

多标签分类怎么做?(Python)

首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类

y1282037271的博客 1359

PADS VX 蛇形走线的设置方法与绕制

在PCB设计过程中,在等长的设置中是必须用到蛇形走线的,并且DDR模块也会经常使用到。因此掌握蛇形走线的设置方法对我们PCB高速板设计中有很大的帮助。下面介绍蛇形走线的设置方法与绕制。1.单根网络线的蛇形走线的设置:打开PADS router界面,点击“工具”→“选项”(快捷方式“Ctrl+Enter”),弹出“选项”窗口,选择“布线”界面下的“调整”,在“调整”界面,设置蛇形走线,倒角比例可以灵活设置。操作如下图所示:完成蛇形走线的配置后,快捷方式“F3”进行交互式布线时,单击右键选择“添加蛇形走线”,便

tianpu2320959696的博客 3391

mysql sys库 oom_MySQL异常OOM排查

收到告警,提示mysql挂了,此时看监控,负载已经比较高,服务器已经无法登录。看见监控此时的负载情况如下:除了系统层面的监控还可以看到,mysql层面的监控已经断图,等负载降下来的时候mysql已经被oom,自动重启了。从mysql错误日志看到如下信息:2020-08-01T09:14:11.778918+08:00 0 [Note] InnoDB: page_cleaner: 1000ms in...

weixin_28741099的博客 483

Veeam Backup 13 通过UI界面高效备份VMware ESXi虚拟机的完整指南

本文提供了一份使用Veeam Backup 13图形化界面高效备份VMware ESXi虚拟机的完整指南。内容涵盖从环境准备、添加vCenter/ESXi主机、配置备份存储库,到创建备份任务、设置保留策略与计划,以及执行备份和验证成功的关键步骤。通过直观的UI操作,管理员可以轻松实现虚拟机数据的可靠保护与快速恢复。

weixin_29322553的博客 438

多线程查询MySQL大数据量单表导致OOM及线程卡死

1 需求 对数据进行迁移,需要将MySQL中的一张大表数据(亿级)读出并插入另一个数据库。 2 问题 对数据分组后,然后开启对应个数的线程,每个线程处理一个分组数据的任务(每个分组后的数据量从几十万至千万级),最初思路是从原库取出1000条数据后,再进入入库,设置了PreparedStatement 的 fetchSize为1000, 但是很快就报“ java.lang.OutOfMemoryEr...

zhouxukun123的专栏 6439

kali2020.2安装出现的问题并附详细解决办法

kali2020.2的安装

weixin_48776804的博客 3048

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 970

宝塔低内存安装mysql_宝塔面板安装mysql 8.0提示最低内存和最低CPU限制的三种解决方法...

今天一个会员说亲测修复 金刚电竞 解密去授权 LOL赛事预测电竞游戏比分竞猜源码 修复比赛采集这个源码安装不了,我问他你按照说明安装的mysql8.0根redis了吗,他说没有,然后他安装数据库的时候提示至少需要[3700MB]内存才能安装,那今天趣模板源码网就写一个解决这个问题的教程。网上找到一个强制安装的办法,貌似不行,然后发现了这个。宝塔面板最低内存和最低CPU限制Mysql 5.6 :最低...

weixin_39717121的博客 5699

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1730

MySQL 8.0不再担心被垃圾SQL搞爆内存的新特性

看到叶老师写的这篇文章《MySQL 8.0不再担心被垃圾SQL搞爆内存》,介绍了MySQL 8.0.28引入的新功能,即支持监控统计并限制各个连接(会话)的内存消耗,避免大量用户连接因为执行垃圾SQL消耗过多内存,造成可能被OOM kill的风险。一定程度上,避免了开发层面乱用SQL导致数据库问题的场景,很像Oracle的资源管理器。mysql>showglobalstatuslik...

bisal的专栏 610

YOLOv11 改进 - 特征融合 | 替换 C3k2 涨点:GELAN 融合 CSP+ELAN 提精度

本文介绍了可编程梯度信息(PGI)和广义高效层聚合网络(GELAN)与 YOLOv11 的结合,以解决深度网络数据传输时的信息丢失问题。PGI 能为目标任务提供完整输入信息,计算目标函数以更新网络权重。GELAN 作为轻量级网络架构,由 SPPELAN、ELAN1、RepNCSPELAN4 等模块组成。我们将 GELAN 代码集成进 YOLOv11, 实验脚本显示,结合 GELAN 的 YOLOv11 在 MS COCO 数据集目标检测任务中或有良好表现。

魔改工程师的博客 1242

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MySQL 8.0中InnoDB buffer pool size进度更透明

MySQL 8.0 up up up~从MySQL 5.7开始,支持在线动态调整 innodb buffer pool,并为此新增了一个状态变量 Innodb_buffer_pool_resize_status,可以通过观察它了解调整buffer pool过程中的一些状态,例如 Resizing also other hash tables. 或 Completed resizing buffer...

老叶茶馆 629

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL的垃圾回收机制到底是怎样的?使用场景是什么?底层原理是什么?

1. 为什么需要垃圾回收?系统稳定性防止资源泄漏导致性能下降或崩溃。资源优化及时释放未使用的内存或磁盘空间,提高性能。数据一致性清理未提交事务或过期日志,确保数据一致性。2. 底层原理总结临时表清理查询完成后,MySQL 自动释放与临时表相关的内存。事务回滚段清理对于未提交的事务,InnoDB 使用 undo log 记录旧版本数据。当事务完成或回滚时,undo log 被清理。数据页回收InnoDB 使用后台线程(如)清理被删除或更新后遗留的数据页。日志轮转。

长风破浪会有时的博客 1054

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL会话连接数消耗内存分析

MySQL 8.0.28引入新特性监控和限制会话内存使用,通过设置global_connection_memory_tracking=1启用后,可以查看所有连接的内存消耗总量(Global_connection_memory)。测试显示每个空闲连接约消耗8.05KB内存。参数connection_memory_limit可限制单会话内存使用(默认无限制),设置上限(如2MB)后,超限连接会被自动关闭,有效防止内存耗尽风险。该特性有助于优化数据库资源管理,特别适合高并发场景下预防OOM问题。

Eucalyptus's blog 987

MySQL内存分析常用语句

GreatSQL 运行时内存太高,超过90%怎么办(重发,附解决办法)-优快云博客。MySQL 8.0不再担心被垃圾SQL搞爆内存 - GreatSQL - 博客园。MySQL内存使用率高且不释放问题排查与总结_Mysql_脚本之家。各模块内存使用变化(结果是累计值,可以根据差值观察变化情况)各种buffer pool大小,是否有明显不合理的设置。MySQL内存为什么不断增高,怎么让它释放 - 墨天轮。MySQL进程内存一直在涨,怎么办?首先需要确认是否是MySQL占用的内存。MySQL总占用内存。

snowyar的专栏 623

MySQL到底是如何防止内存溢出的?使用场景是什么?底层原理是什么?

1. 为什么需要防止内存溢出?系统稳定性防止内存溢出可以避免 MySQL 崩溃,确保系统稳定运行。资源优化动态分配内存可以避免资源浪费,提高性能。错误处理如果内存不足,MySQL 抛出错误并终止操作,避免进一步损害。2. 底层原理总结参数限制使用配置参数(如和)限制内存使用。动态分配根据实际需求动态分配内存,避免一次性分配过多内存。错误检测如果内存不足或数据包过大,MySQL 抛出错误并终止操作。垃圾回收查询完成后释放分配的内存,避免内存泄漏。3. 注意事项。

长风破浪会有时的博客 1122

MySQL 内存使用率常用分析语句

最近连续遇到MySQL内存占用过高导致服务器内存不足的问题,整理下收集到的常用分析语句。

Hehuyi_In的博客 1382

PHP内存管理和垃圾回收机制

PHP垃圾回收机制 GC,垃圾回收器,全称Garbage Collection 早期版本,准确地说是5.3之前(不包括5.3)的垃圾回收机制,是没有专门的垃圾回收器的。 只是简单的判断了一下变量的zval的refcount是否为0,是的话就释放否则不释放直至进程结束。 php引用计数基本知识点 关于php的zval结构体,以及refcount与is_ref的知识点 不准...

Tsuabsa4969的博客 281

MYSQL Rewriter plugin 我那什么拯救你,垃圾系统

从SQL 语言, DB 和 开发人员之间对SQL的撰写的目的和本质的理解就有不同,一个是要以逻辑为基础满足业务需求即可,性能方面的需求这变得不是核心人物,而DB 人员则对SQL的撰写和优...

sql server的专栏 245

mgr未同步 mysql_InnoSQL 8.0.19(MySQL分支)特性系列 - MGR增强

InnoSQL从MySQL 5.7.20版本开始调研、测试和使用MGR特性,结合考拉海购的业务场景,我们对MGR进行了深度优化,解决了大量5.7版本的MGR bug并进行了针对性增强。在考拉未被阿里收购前,考拉的绝大部分MySQL实例均已替换为网易数帆下基于MGR的RDS产品,相关的问题分析和优化,在本专栏的前两年文章中有详细介绍。5.7版本上MGR的不足也受到了Oracle MySQL开发团队的...

weixin_35554273的博客 231
上一篇: GreatSQL社区月报 | 2023.04
下一篇: MySQL8.0 优化器介绍(四)
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值