MySQL 8.0 容器频繁崩溃排查实录:从端口误配到内存 OOM 的踩坑与修复

 更新时间:2026年09月16日 09:29:14   作者:钱栈up  
本文记录了daylay项目部署中,火山云服务器上MySQL 8.0容器从“连不上”到“反复崩溃”的完整排查过程:先定位到连接端口误用、端口映射配置的低级失误,感兴趣的朋友跟随小编一起看看吧

上周在daylay项目的云服务器部署中,我遇到了一个非常典型的“薛定谔的MySQL故障”:用Navicat连接数据库一直提示超时,排查完端口映射以为解决了,结果隔几个小时MySQL容器还是会自动崩溃,反复折腾了两天才定位到真正的根因。整个过程踩了好几个低级坑,也积累了不少小内存服务器跑MySQL的避坑经验,这里完整记录下来。

第一阶段:端口连通性故障的排查

一开始用户提供的连接信息是火山云服务器、端口22、root用户,我下意识就把这个当成MySQL的连接信息用了,结果连了半天一直提示连接失败。第一反应是Docker端口映射没生效,赶紧登录服务器执行docker ps查看容器状态,发现MySQL 8.0容器的端口映射明明是0.0.0.0:16034->3306/tcp,完全正常。
这时候才反应过来:22端口是服务器的SSH端口,根本不是MySQL的业务端口,属于典型的“把SSH连接信息和业务连接信息搞混”的低级失误。调整连接端口为16034之后,连通性测试立刻通过了,本以为问题解决了,结果没过几个小时,用户就反馈MySQL又连不上了。

第二阶段:MySQL反复崩溃的根因定位

连通性恢复后,我加了监控观察MySQL的运行状态,发现它几乎是每2-3小时就会崩溃一次,重启后过几个小时又挂。登录服务器查看MySQL容器的日志,发现报错信息全是内存不足,再执行dmesg | grep oom查看系统日志,果然看到多条OOM Killer杀死mysqld进程的记录:

Out of memory: Kill process 3420 (mysqld) score 999 or sacrifice child
Killed process 3420 (mysqld) total-vm:1515520kB, anon-rss:512000kB, file-rss:0kB

再执行free -h查看服务器内存现状:这台火山云服务器只有2G内存,除了MySQL容器占了近1G,还有十几个同名的update_news.py进程在后台运行,每个占用30-50M内存,加起来就吃掉了近600M内存,加上系统本身占用的内存,可用内存经常只剩几十M,MySQL自然会被系统优先杀死。
除了内存不足的问题,我还顺手看了MySQL的配置,发现默认配置也存在隐患:wait_timeout和interactive_timeout默认是28800秒(8小时),table_open_cache默认是4000,这些配置都是给大内存服务器准备的,在2G内存的机器上会占用大量不必要的内存。

第三阶段:修复方案与落地

确认根因后,我立刻做了四件事:

  1. 给MySQL 8.0容器加了内存限制,启动参数加上--memory=768M --memory-swap=768M,避免容器吃光所有内存;
  2. 优化MySQL配置,把wait_timeout和interactive_timeout降到300秒(5分钟),table_open_cache降到300,减少空闲连接和缓存占用的内存;
  3. 清理冗余的update_news.py进程,只保留1个运行实例,避免重复进程占用内存;
  4. 给用户提了硬件升级建议:如果业务有增长,最好把服务器内存加到4G,避免后续再出现资源不足的问题。
    改完之后我观察了3天,MySQL再也没有出现过崩溃的情况,用Navicat连接公网IP:16034也一直稳定可用。

可带走的避坑经验

这次排查踩了好几个典型的云服务器部署坑,总结几个可以直接用的经验:

  1. 先确认端口再排查连通性:云服务器默认开22 SSH端口,业务端口(比如MySQL的3306、Redis的6379)都是自定义映射的,连不上先执行docker ps看端口映射,不要一上来就改配置,避免走错方向。
  2. 小内存服务器跑MySQL必须做资源限制:Docker启动MySQL容器一定要加--memory参数限制最大内存,MySQL 8.0最低建议给512M,生产环境至少1G,避免被OOM Killer杀死。
  3. 小内存场景要调整MySQL默认配置:默认的wait_timeout=28800、table_open_cache=4000都是给8G以上内存的机器准备的,2G以下内存的服务器建议把wait_timeout降到300-600,table_open_cache降到200-400,能省出不少内存。
  4. 定时任务一定要加进程锁:很多Python脚本如果没有做进程锁,会跑出大量重复实例,积少成多就会吃光内存,要么用systemd管理定时任务,要么在脚本里加文件锁避免重复运行。

到此这篇关于MySQL 8.0 容器频繁崩溃排查实录:从端口误配到内存 OOM 的踩坑与修复的文章就介绍到这了,更多相关mysql容器反复崩溃内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL主从复制之GTID模式详细介绍 

    MySQL主从复制之GTID模式详细介绍 

    这篇文章主要介绍了MySQL主从复制之GTID模式,GTID的复制方式,它由UUID和事务ID两个部分组成,具有GTID事务是全局唯一性的,并且一个事务对应一个GTID值、一个GTID值在同一个MySQL实例上只会执行一次等特点,想了解更多的小伙伴可以参考下面详细内容,希望对你有所帮助
    2022-02-02
  • PureFTP借助MySQL实现用户身份验证的操作教程

    PureFTP借助MySQL实现用户身份验证的操作教程

    这篇文章主要介绍了PureFTP借助MySQL实现用户身份验证的操作教程,就像普通程序中的用户注册功能那样为用户登陆数据信息建立一个数据库来进行验证,需要的朋友可以参考下
    2015-12-12
  • Mysql DateTime 查询问题解析

    Mysql DateTime 查询问题解析

    这篇文章主要为大家介绍了Mysql DateTime查询问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • MYSQL如何查看进程和kill进程

    MYSQL如何查看进程和kill进程

    这篇文章主要介绍了MYSQL如何查看进程和kill进程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 新装MySql后登录出现root帐号提示mysql ERROR 1045 (28000): Access denied for use的解决办法

    新装MySql后登录出现root帐号提示mysql ERROR 1045 (28000): Access denied

    这篇文章主要介绍了新装MySql后登录出现root帐号提示mysql ERROR 1045 (28000): Access denied for use的解决办法,需要的朋友可以参考下
    2017-01-01
  • sql优化之如何找到那些慢SQL

    sql优化之如何找到那些慢SQL

    执行SQL语句时,如果出现慢SQL或SQL占用系统内存的情况,需进行具体查询分析,这篇文章主要介绍了sql优化之如何找到那些慢SQL的相关资料,文中给出了详细的代码示例,需要的朋友可以参考下
    2026-05-05
  • 解决MySQL存储时间出现不一致的问题

    解决MySQL存储时间出现不一致的问题

    这篇文章主要介绍了解决MySQL存储时间出现不一致的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • MySQL如何生成唯一的server-id

    MySQL如何生成唯一的server-id

    这篇文章主要给大家介绍了关于MySQL如何生成唯一的server-id的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • MySQL redo日志写入磁盘的实现过程

    MySQL redo日志写入磁盘的实现过程

    这篇文章主要介绍了MySQL redo日志写入磁盘的实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 关于MySQL与Golan分布式事务经典的七种解决方案

    关于MySQL与Golan分布式事务经典的七种解决方案

    本文介绍了分布式事务的一些基础理论,并对常用的分布式事务方案进行了讲解;在文章的后半部分还给出了事务异常的原因、分类以及优雅的解决方案;最后以一个可运行的分布式事务例子,将前面介绍的内容以简短的程序进行演示,需要的朋友可以参考一下文章具体内容
    2021-10-10

最新评论