MySQL 数据库救火:磁盘爆满了,怎么办?
摘要:当磁盘空间爆满后,MySQL会发生什么事呢?又应该怎么应对?
本文分享自华为云社区《【MySQL 数据库救火】- 磁盘突然爆满的处理方式》,原文作者:技术火炬手 。
大多数用户在对于磁盘进行分区的时候都是习惯性的不给系统盘预留很大空间,其实这并不是一个好习惯。因为系统分区并不像我们想象的那样会仅仅安装一个操作系统,系统分区多数还是会承载操作系统主要应用软件安装任务。那么当磁盘空间爆满后,MySQL会发生什么事呢?又应该怎么应对?
MySQL 数据库磁盘爆的主要原因
数据量大
MySQL 磁盘爆的最常见原因之一就是数据量突然增大导致数据库爆,这种原因往往和业务相关。比如应用程序在短时间内生成了大量的数据,如果是突然出现新增大量数据,也有可能是某些测试用例或者压测导致。这种原因导致的数据库磁盘暴涨可以通过清理数据的方式解决,比如清除特定时间段的数据。
建议在测试环境等数据库,进行压力测试或者其他自动化测试时候对数据做特殊的标志,在完成测试后自动清除测试产生的垃圾数据,避免日积月来导致磁盘爆满影响数据库使用。
同时按照数据库日常使用的情况看是否需要对磁盘进行扩容,但是扩容只能缓解,不能根治。
日志文件
MySQL在日常运行的时候回产生大量的日志文件,这些日志文件也会占用磁盘空间,日积月累可能会产生几百G的日志文件。
MySQL 的日志文件主要有以下几种:
- bin log 二进制文件通常是占用空间最大的日志类型,这和数据库的使用情况相关。
- error 错误日志占用空间大的原因主要体现在长时间的日积月累,没有定时清除导致,比如运行了一两年的数据库,产生的错误日志往往也比较大。
- 慢查询日志 慢查询日志通常不会占用太多空间,但是长时间不清理也会出现占用过多的问题,需要定时清理
临时文件
临时文件是数据库运行时候产生的临时性文件,这种临时性文件在运行结束以后会自动释放,但是某些异常情况下如果没有释放会造成比较严重的后果,比如短时间的慢查询语句,这种慢查询执行时间巨长,查询的数据很多,MySQL在内存不够的情况下回临时将中间结果存放在数据库的临时目录下。
处理日志文件导致的磁盘爆满
清理日志文件导致的磁盘爆满比较容易,在确保文件备份转存的前提下可以直接清理文件。使用 echo ‘’ >> host- XXXXX.err 等命令可以直接清理这些日志文件。
切记不要直接删除相关的日志文件
查看当前数据库服务器磁盘占用情况可以使用如下命令
df -h

查看某个文件夹下的文件磁盘占中情况可以使用 du 明令 参考
# 切换到需要查看的路径下使用
du -hl
日志文件导致的磁盘爆满可以通过linux 命令
echo '' >> host-xxxxx.log
处理临时文件导致的磁盘爆满
查看Mysql 配置的临时目录
通常 MySQL 的临时目录在 mysql/temp 路径下,如果想查看配置的参数,可以使用 show variables like ‘tmpdir’ SQL命令
show variables like 'tmpdir'

临时文件产生的原因
临时文件产生的主要原因是MySQL在执行的时候,对一些大数据量的操作的时候内存无法满足存储需求的时候,MySQL会使用临时文件,比如某个临时表查询出的几百万数据,某个联合查询产生的结果集等。通常情况下MySQL产生的临时文件很小,同时也会及时释放,但是一些异常情况下,比如慢查询,会导致短时间产生大量的临时文件。
下面是一个因为慢查询导致临时目录下产生大量文件的案例。
临时文件产生过多导致磁盘爆满,造成数据库短时故障
数据库崩溃的前兆往往是短时间出现大量IO,CPU暴涨。出现以上征兆的时候数据库就离崩溃不远了,下面这个案例就是。

这个案例中我们发现在某个时间点数据库突然CPU暴涨,而且是持续性暴涨,与此对应的磁盘的IO次数暴增,内存使用暴增。这个时候基本可以判断数据库出现了短时间大量的慢查询。
为什么慢查询会导致磁盘IO暴增?原因是上面说的,数据库在查询的时候使用的临时表或者临时数据如果内存不足以存放的时候,数据库会将这些数据存放在磁盘中,随着慢查询越来越多就会出现集中踩踏的问题,问题愈演愈烈,最终导致数据库卡顿或者崩溃。


上面案例中通过查看数据库执行记录,我们发现的确出现了慢查询积压的情况,使用以下 SQL查询 可以查询当前正在执行的SQL状态
SELECT id, `state`, user,host,time,`INFO` FROM information_schema.processlist where
state IS NOT NULL and state <> "" ORDER BY time desc;

上面,你可以看到数据库正在执行超过 10W秒的SQL,而且是好几个,这样就不难理解为什么数据库会出现短时间CPU 和IO暴增的情况。
解决这些问题的办法就是: kill 当前的慢查询,这个办法很管用,但是要记录查询的语句和使用的登录账号和机器,以备兴师问罪。
下面这个语句可以快速生成批量 kill 语句。
SELECT concat('kill ', id, ';') FROM information_schema.processlist where user =
'HispaceCMS' and `COMMAND` = 'Query' and state IS NOT NULL and state <> '' and DB is
not null and time > 1000 ORDER BY time desc
生成以后批量执行就可以了。执行完查询磁盘占用情况,从96% 下降到 50左右。

MySQL 数据库救火:磁盘爆满了,怎么办?的更多相关文章
- FAQ | 是什么导致MySQL数据库服务器磁盘I/O高(本文章来自知数堂)
FAQ | 是什么导致MySQL数据库服务器磁盘I/O高 2016-12-26 叶金荣 老叶茶馆 0.导读 有个MySQL服务器的磁盘I/O总有过高报警,怎么回事? 本文约1500字,阅读时间约10分 ...
- 磁盘空间满了之后MySQL会怎样
大多数用户在对于磁盘进行分区的时候都是习惯性的不给系统盘预留很大空间,其实这并不是一个好习惯.因为系统分区并不像我们想象的那样会仅仅安装一个操作系统,系统分区多数还是会承载操作系统主要应用软件安装任务 ...
- mysql数据库磁盘空间被撑爆,创建定时任务定期释放资源
问题描述: 这是我在工作中遇到的一个问题,目前只发现mysql数据库存在该问题,Oracle和gaussDB未发现磁盘空间被占满的情况,部署堆栈服务的时候抛出了写入数据库表失败的问题,经排查,在数据库 ...
- mysql 数据库磁盘占用量统计
查看某个表的磁盘占用量 select (data_length+index_length)/1024/1024 M from information_schema.tables where table ...
- 查询Mysql数据库所有数据库所占磁盘空间大小
查询Mysql数据库所有数据库所占磁盘空间大小: /,),' MB') as data_size, concat(truncate(sum(index_length)//,),'MB') as ind ...
- MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句
查询所有数据库占用磁盘空间大小的SQL语句: ,),' MB') as data_size, concat(,),'MB') as index_size from information_schema ...
- MySQL中查询所有数据库占用磁盘空间大小
查询所有数据库占用磁盘空间大小的SQL语句: 复制代码 代码如下:select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2), ...
- mysql数据库存储路径更改 数据文件位置
使用了VPS一段时间之后发现磁盘空间快满了.本人的VPS在购买的时候买了500gb的磁盘,提供商赠送了20GB的高性能系统磁盘.这样系统就有两个磁盘空间了.在初次安装mysql 的时候将数据库目录安装 ...
- Mysql数据库之Binlog日志使用总结
binlog二进制日志对于mysql数据库的重要性有多大,在此就不多说了.下面根据本人的日常操作经历,并结合网上参考资料,对binlog日志使用做一梳理: 一.binlog日志介绍1)什么是binlo ...
- linux自动定时备份web程序和mysql数据库
前些天受朋友说linux定时备份不知道怎么搞,叫帮忙处理一下.由于这段时间正闲着,所以也就欣然答应.由于朋友对linux不懂也希望我将操作的过程记录下来,也就是越详细越好.所以写得比较$%^& ...
随机推荐
- 自研、好用、够快、稳定、代码可读性强的ORM
Fast Framework 作者 Mr-zhong 代码改变世界.... 一.前言 Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer O ...
- c# 引入同一个版本dll(比如包含opencv不同模块的dll,但是版本却是一致的)
1.使用dnSpy.exe工具,打开相关dll 在左侧"管理器"中选中并点击右键 2.在弹出菜单中点击编辑程序集 3.更改名称和版本号 4.工具栏-文件-全部保存 5.在VS中引入 ...
- JUC并发编程学习笔记(十四)异步回调
异步回调 Future设计的初衷:对将来的某个事件的结果进行建模 在Future类的子类中可以找到CompletableFuture,在介绍中可以看到这是为非异步的请求使用一些异步的方法来处理 点进具 ...
- 【scipy 基础】--插值
插值运算是一种数据处理方法,主要用来填补数据之间的空白或缺失值.因为在实际应用中,数据往往不是完整的,而是存在着空白或缺失值,这些空白或缺失值可能是由于数据采集困难.数据丢失或数据处理错误等原因造成的 ...
- re2-cpp-is-awesome
没做出来,看题解得 攻防世界逆向高手题之re2-cpp-is-awesome_align 20h-CSDN博客 注意 汇编知识 align 8,align num是让后面的字节都对齐num,也就是这里 ...
- answer_to_everything
题解,第一次遇到这种题目纪念一下 攻防世界逆向入门题之answer_to_everything_沐一 · 林的博客-CSDN博客
- 使用DHorse发布SpringBoot项目到K8S
前言 在介绍DHorse的操作之前,先来介绍一下使用k8s发布应用的步骤,以SpringBoot应用为例进行说明. 1.首先从代码仓库下载代码,比如GitLab: 2.接着进行构建,比如使用Maven ...
- python中面向对象有什么特点
一:问题 python中面向对象有什么特点? 二:回答 python同其他面向对象语言一样,有3个特征:封装.继承.重写 简单理解就是:封装:把一系列属性和操作封装到一个方法里面,这样想要实现某种效果 ...
- 基于python的Linux服务器资源监控
介绍 项目地址: https://github.com/leeyoshinari/performance_monitor 已完成如下功能 1.监控整个服务器的CPU使用率.io wait.内存使用.磁 ...
- 【JMeter】使用nmon进行性能资源监控
使用nmon进行性能资源监控 目录 使用nmon进行性能资源监控 一.前言 二.nmon的下载安装 1.查看系统信息 2.查看CPU信息 2.下载 3.解压 4.一个小问题 三.在性能测试时使用命令行 ...