如何处理MySQL由于内存限制导致全表联合查询直接被内核OOM Killer杀掉

落明同学_5142

落明同学_5142

2026-06-11

286人浏览

原创

mysql被oom killer杀死本质是系统内存耗尽,需三步处理:先用dmesg确认oom事件;再调低innodb_buffer_pool_size(≤物理内存60%)、tmp_table_size(64m)、max_connections;最后优化查询,如straight_join控制驱动表、拆分join、禁用performance_schema等。

如何处理mysql由于内存限制导致全表联合查询直接被内核oom killer杀掉

MySQL在执行全表联合查询时被内核OOM Killer直接杀掉,本质不是SQL写得不好,而是系统已无可用内存,内核被迫“清退”占用最多、最“好杀”的进程——而mysqld恰恰符合所有条件:常驻、吃内存多、无特权、无子进程保护。处理这事要分三步走:**先确认是不是OOM、再压住内存峰值、最后让查询本身更可控**。

第一步:确认确实是OOM Killer下的手

别猜,直接查证据:

  • 运行 dmesg -T | grep -i "killed process",如果输出里有 Out of memory: Kill process XXXX (mysqld),时间点和MySQL宕机时间吻合,就100%坐实
  • 补充验证:cat /proc/$(pidof mysqld)/status | grep VmRSS,看实际驻留内存(RSS)是否远超你配置的 innodb_buffer_pool_size —— 超得越多,说明 sort/join/tmp 表等隐性开销越猛
  • 注意:/var/log/messages 在部分新版系统(如CentOS 8+/AlmaLinux)里默认不记录OOM事件,dmesg 是唯一可靠来源

第二步:立刻压住MySQL总内存上限

全表JOIN往往触发大临时表、大排序、大哈希,这些都从 per-connection 缓冲区里现拿内存,乘上连接数就是灾难。重点调这三项:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • innodb_buffer_pool_size ≤ 物理内存 × 50%~60%,且必须预留 ≥2GB 给系统+其他服务;例如16GB机器,设为8G或9G,别硬塞12G
  • tmp_table_size = max_heap_table_size = 64M(别超128M),强制大结果走磁盘临时表,宁慢勿崩
  • max_connections = 实际并发上限×1.2(比如网站日常最高80连接,设为100即可),再配合:
      sort_buffer_size = 256K
      join_buffer_size = 256K
      read_rnd_buffer_size = 512K

第三步:让全表JOIN本身不爆内存

参数调完只是保命,真要跑通大JOIN,还得改查询逻辑和执行方式:

  • 加 STRAIGHT_JOIN 或用 FORCE INDEX 控制驱动表顺序,避免优化器选错表导致中间结果爆炸
  • 拆大JOIN:先用 CREATE TEMPORARY TABLE + INSERT ... SELECT 分步物化中间结果,每步控制数据量
  • 禁用可能导致抖动的组件:performance_schema = OFF(尤其别开 memory/% instrument),query_cache_type = 0
  • 检查是否启用了 innodb_buffer_pool_dump_at_shutdown —— 这个功能在重启初期会额外吃1~2GB内存,OOM高发期建议关掉

额外但关键的一环:别忘了systemd和cgroup

宝塔、Docker、systemd service 都可能自带内存限制,光改my.cnf没用:

  • 查 systemd 限制:systemctl show mysqld | grep Memory,若看到 MemoryLimit=xxx,说明被硬限了
  • Docker用户必须加:--memory=4g --memory-reservation=3g,不能只靠MySQL自己节制
  • 给 mysqld 进程降 OOM 优先级:echo -900 > /proc/$(pidof mysqld)/oom_score_adj(临时),或在 systemd service 文件里加 OOMScoreAdjust=-900

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

417

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

840

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2472

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

836

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

729

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

374

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2236

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4092

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

667

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 172人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 276人学习