vim引发的MySQL进程挂掉的问题解决

 更新时间:2025年09月24日 10:11:22   作者:渔不是鱼  
本文介绍了使用logrotate工具对MySQL日志进行自动归档和管理,通过配置logrotate,可以实现按周归档,文件大于2G时执行,保留最近两周的数据,感兴趣的可以了解一下

背景

上周一个业务排查处理死锁的时候的时候,先tail -n200 mysql-error.log,处理过
死锁的小伙伴都知道,show engine innodb status\G只能看到最近一次的死锁信息,
而对于历史的死锁信息需要开启innodb_print_all_deadlocks_output这个参数,
一旦数据库开启了这个参数,就会将所有的历史死锁信息输出到MySQL的error log。
而一条死锁如果锁定的行数或者记录很多的话,一条死锁记录可能就会几百行,
所以当时一直看不到想要的信息,就直接vim打开查看了一下,结果直接就卡住了,
(后来恢复了,看了一下当时的那个error log居然18GB)紧接着就收到报警信息,主库MySQL进程时间运行少于10min,然后就从库也报警IO
线程停掉了。

解决排查过程

1.遇到报警第一瞬间上去修复主从复制,还好该库不是一个核心业务而且是在业务低峰期,
qps非常低,所以主从自己重新连接上,恢复正常。
2.查看数据情况,数据
3接下来进入问题排查过程,查看监控,监控如下:

可以看到监控图内存使用率到一个点掉了下来,看起来是OOM导致的问题,
4.查看系统日志,查找元凶。

这里可以看到确实发生了OOM,但是可以看到是因为filebeat导致的,思考一下,肯定是因为
当时vim的时已经出发到边界了,但是filebeat刚好在临界值又去tail slow log刚好到达了OOM的触发条件,引发了OOM
继续往下看发现了问题:

可以看到这里kernel选择杀死了分数最高的mysqld进程

PS: 这里说一下为什么,在OOM的时候,kernal杀掉了mysqld进程,在OOM的情况下,系统会有一个打分策略,会kill掉分数最高的进程、

#关于OOM
linux OOM是由系统参数vm.overcommit_memory控制的.
#查看方式:
$ sysctl -a| grep vm.overcommit
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50

#vm.overcommit_memory的取值
#简单总结
0--用之前先申请,申请不到足够空间抛出OOM(默认值)
1--不申请直接使用,过载使用内存,不触发OOM
2--不允许过载使用内存,不触发OOM

#kernel score如何计算的,主要是通过下面值计算出来的
oom_score
oom_score_adj
#就是下面这两个文件/proc/进程号/下
$ ls -l /proc/197543/oom_score*
-r--r--r-- 1 mysql mysql 0 9月  15 18:40 /proc/197543/oom_score
-rw-r--r-- 1 mysql mysql 0 9月  15 18:40 /proc/197543/oom_score_adj

感兴趣的可以继续深入研究

所以可以看到我们在OOM并不是内存使用率达到100%的时候才会抛出OOM异常,像我们监控的时候95%就OOM
5万幸的是这次挂掉的是一个qps非常低的非核心业务库,由于重启速度也很快,在1s之内完成,所以业务几乎无任何影响

后续改进措施

既然问题发生了,解决了,那么作为一个合格的DBA,接下来就应该去考虑如何去做优化,以及避免这种问题发生:
针对这次的问题,整理了以下的措施:

  1. 优化告警策略,明明平常内存使用已经很高了,但是没有报警提示
  2. vim的时候注意,vim的时候一定要注意文件大小
  3. 定时归档日志文件,定时分割拆分清理错误日志,慢查询日志
  4. 合理分配数据库使用buffer,如果这台机器还有其他业务,比如canal,filebeat考虑调小buffer pool size大小
  5. 重要进程保证不会被oom-killer kill掉,实现方式,可以把对应进程的oom_score_adj文件内容调成一个比较小的负数,注意会有范围的,在范围之内调小,然后使其在OOM的时候拿到一个比较低的分数,避免被kill掉。

到此这篇关于vim引发的MySQL进程挂掉的问题解决的文章就介绍到这了,更多相关MySQL进程挂掉内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • mysql中secure_file_priv=不生效问题及解决

    mysql中secure_file_priv=不生效问题及解决

    这篇文章主要介绍了mysql中secure_file_priv=不生效问题及解决方案,以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家,
    2024-01-01
  • Windows MySQL修改配置文件my.ini不生效问题

    Windows MySQL修改配置文件my.ini不生效问题

    在Windows Server 2019上修改MySQL 5.6的安装目录下my.ini文件后,需要通过修改注册表中的ImagePath值来确保MySQL读取新的配置文件,修改时应确保配置文件路径正确,并且新配置不会覆盖原有配置,以保证修改生效
    2025-01-01
  • 关于MySQL中的查询开销查看方法详解

    关于MySQL中的查询开销查看方法详解

    一个查询通常可以有很多种执行方式,并且返回同样的结果,而好的程序员应该是找到最好的方式,下面这篇文章主要给大家介绍了关于MySQL中查询开销查看方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • MySQL多表链接查询核心优化

    MySQL多表链接查询核心优化

    本篇文章主要介绍了MySQL多表链接查询核心优化,数据库对数据表的多表查询是必不可少的,所以涉及到性能优化,有需要的可以了解一下。
    2016-11-11
  • 关于MySQL存取图片的三种方式(含源码示例)

    关于MySQL存取图片的三种方式(含源码示例)

    最近在做小程序的后台,要求将小程序用户以upload方法上传的图片保存到mysql数据库中,然后机缘巧合三种方式都试了,所以专门整理出来分享给大家,可能有的地方说的不太对,欢迎大家帮纠正,需要的朋友可以参考下
    2024-04-04
  • MySQL删除外键问题小结

    MySQL删除外键问题小结

    mysql删除外键抱错Error on rename of ./ruler/test2child to ./ruler/#sql2-298-92 (errno: 152),怎么回事,有好的方法可以解决吗?下面看下脚本之家小编给大家带来的解决思路
    2016-08-08
  • MySQL中select...for update锁表

    MySQL中select...for update锁表

    select…for update在MySQL中,是一种悲观锁的用法,一般情况下,会锁住一行数据,但如果没有使用正确的话,也会把整张表锁住,本文就来介绍一下,感兴趣的可以了解一下
    2023-10-10
  • Mysql表如何按照日期字段的年月分区

    Mysql表如何按照日期字段的年月分区

    这篇文章主要介绍了Mysql表如何按照日期字段的年月分区的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • MySQL8.0中你必须要知道的索引新特性

    MySQL8.0中你必须要知道的索引新特性

    MySQL8.0索引新特性,支持降序索引,降序索引以降序存储键值,下面这篇文章主要给大家介绍了关于MySQL8.0中你必须要知道的索引新特性的相关资料,需要的朋友可以参考下
    2022-11-11
  • MySQL中的触发器trigger用法解析

    MySQL中的触发器trigger用法解析

    这篇文章主要介绍了MySQL中的触发器trigger用法解析,触发器是由 事件来触发 某个操作,这些事件包括 INSERT、UPDATE、DELETE事件,事件就是指用户的动作或者触发某项行为,需要的朋友可以参考下
    2023-08-08

最新评论