MySQL数据库CPU飙升到100%的详细解决方案

 更新时间:2023年05月29日 10:40:05   作者:冰封酸辣粉  
在监控线上数据库的运行是否安全、正常的过程中,cpu使用率是一个重要的指标,一旦cpu使用率飙升至90%+甚至达到100%,必然会对数据库的正常工作产生影响,下面这篇文章主要给大家介绍了关于MySQL数据库CPU飙升到100%的详细解决方案,需要的朋友可以参考下

1、定位cpu问题所在

当cpu飙升到100%时,先用操作系统命令top命令观察是不是mysqld占用导致的,如果不是,找出占用高的进程,并进行相关处理。

2、查看慢查询日志

进入mysql命令行

mysql -h主机地址 -u用户名 -p用户密码

查看慢查询SQL是否启用:ON是开启,OFF是关闭。

show variables like ‘log_slow_queries';

开启慢查询日志

set global log_slow_queries = on;

3、使用show processlist查看运行线程

如果是mysqld造成的,show processlist显示用户正在运行的线程,看看里面跑的session情况,是不是有消耗资源的sql在运行【查看Time这一列最大值】。找出消耗高的sql,看看执行计划是否准确,index是否缺失,或者是数据量太大造成。

show processlist

注意state字段中如果包含大量的Sending data、Wating for tabls、或者各种Lock、大概率是SQL造成数据库拥堵。优化对应的SQL,开启慢查询日志,分析sql语句进行优化。

一般来说,肯定要kill掉这些线程(同时观察cpu使用率是否下降),等进行相应的调整(比如说加索引、改sql、改内存参数)之后,再重新跑这些SQL。

也有可能是每个sql消耗资源并不多,但是突然之间,有大量的session连进来导致cpu飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。

阻止滥用资源的程序: 当网站受到攻击时,有可能在短时间内建立异常高的连接数量。MySQL中的PROCESSLIST可用于检测顶级用户并阻止对滥用连接的访问。

4、大量的睡眠线程导致CPU过高

运行show full processlist

【1】根据Command这一列发现大量的Sleep

【2】再根据Time这一列 查看当前Sleep线程的sql所用的耗时

【3】根据sql睡眠线程耗时时间 配置msyql

【4】打开mysql的配置文件my.cnf文件

配置如下:

vim /etc/my.cnf

[mysqld]
wait_timeout=20 ## 大于20秒自动断开 (根据实际情况设置)

配置完成后重启Mysql,不重启的话,可以设置全局的等待超时时间

mysql> set global wait_timeout=20;
mysql> show global variables like '%timeout';

5、合理优化配置项

检查一下MySQL设置,有助于确定内存使用情况,从而为MySQL分配合适的值。缓存在InnoDB存储的缓冲池中完成。缓冲池的大小对系统性能起着关键作用,并被指定为可用RAM的50%-70%之间的值。如果池大小,将导致页面过度刷新,如果太大,将由于内存竞争而导致交换。

innodb_buffer_pool_size

max_connections为了在任何时刻为MySQL分配尽可能多的连接数,并避免单个用户使服务器过载,需要使用max_connections。每个线程使用RAM的一部分进行缓冲区分配,因此它根据RAM的大小限制最大连接数。

max_connections = (Available RAM – Global Buffers) / Thread Buffers 最大连接数 = (有效内存 - 全局缓冲容量)/ 线程缓冲容量
当不经常更改且Web服务器接收许多相同查询时,查询高速缓存可能会很有用。查询缓存将SELECT语句的文本与发送到客户端的相应结果一起存储。

query_cache_size

因此,此参数仅用于此类应用程序服务器,否则将被禁用,并为其他服务器设置为零。

为了避免资源争用,尽管启用了该功能,但应将该值设置为10MB左右的最小值。

总结

到此这篇关于MySQL数据库CPU飙升到100%的文章就介绍到这了,更多相关MySQL数据库CPU飙升100%内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL CTE 通用表达式详解

    MySQL CTE 通用表达式详解

    在MySQL中,CTE是一种简洁而强大的语法,用于构建临时的结果集,通常用于简化复杂查询,下面通过本文给大家介绍MySQL CTE 通用表达式,感兴趣的朋友一起看看吧
    2025-06-06
  • 在Linux环境下mysql的root密码忘记解决方法(三种)

    在Linux环境下mysql的root密码忘记解决方法(三种)

    这篇文章主要介绍了在Linux环境下mysql的root密码忘记解决方法,详细的介绍了3种解决办法,具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • MySQL行列转化方式

    MySQL行列转化方式

    文章介绍了如何将行数据转化为列数据,并展示了如何使用UNION和UNION ALL的区别,作者分享了个人经验,希望能对大家有所帮助
    2026-01-01
  • MySQL数据库的shell脚本自动备份

    MySQL数据库的shell脚本自动备份

    这篇文章主要介绍了MySQL数据库的shell脚本自动备份的相关资料,网站或应用的后台都有备份数据库的功能按钮,但需要去手工执行。我们需要一种安全的,每天自动备份的方法需要的朋友可以参考下
    2017-03-03
  • mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET

    这篇文章主要介绍了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法,结合实例形式较为详细的分析了mysql存储过程创建、调用及变量创建、赋值具体原理、操作技巧与相关注意事项,需要的朋友可以参考下
    2019-12-12
  • mysql中update按照多重条件进行更新处理的方案

    mysql中update按照多重条件进行更新处理的方案

    更新数据是使用数据库时最重要的任务之一,下面这篇文章主要给大家介绍了关于mysql中update按照多重条件进行更新处理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • MySQL批量去掉某个字段中的空格

    MySQL批量去掉某个字段中的空格

    这篇文章主要介绍了MySQL批量去掉某个字段中的空格的简单方法,具有一定参考价值,给大家分享下,一起参考,交流。
    2017-10-10
  • PHP MYSQL注入攻击需要预防7个要点

    PHP MYSQL注入攻击需要预防7个要点

    这篇文章主要介绍了PHP MYSQL开发中,对于注入攻击需要预防的7个要点,大家需要注意了
    2013-11-11
  • Linux下将数据库从MySQL迁移到MariaDB的基础操作教程

    Linux下将数据库从MySQL迁移到MariaDB的基础操作教程

    这篇文章主要介绍了将数据库从MySQL迁移到MariaDB的基础操作教程,当然迁移之前不要忘记数据库的备份!需要的朋友可以参考下
    2015-11-11
  • MySQL之表碎片化的问题解决

    MySQL之表碎片化的问题解决

    MySQL数据库的碎片是由于频繁的增删改查操作导致的数据块不连续或不规则分布,本文主要介绍了MySQL之表碎片化的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08

最新评论