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不懂也希望我将操作的过程记录下来,也就是越详细越好.所以写得比较$%^& ...
随机推荐
- Net 高级调试之二:CLR和Windows加载器及应用程序域介绍
一.简介 今天是 Net 高级调试的第二篇文章,第一篇文章记录了自己学习 Net 高级调试的第一步,认识一些调试工具,有了工具的倚仗,我们开始仗剑走天涯了,开始Net 高级调试正式的征程了.我先说一下 ...
- 文件 inode 与 no space left on device 异常
转载请注明出处: 文件inode 在 Linux 文件系统中,每一个文件或目录都会有一个 inode,它是一个数据结构,用于存储文件的元数据,比如文件的权限.所有者.大小.创建和修改的时间等.inod ...
- 不懂乐理,也能扒谱,基于openvpi将mp3转换为midi乐谱(Python3.10)
所谓"扒谱"是指通过听歌或观看演奏视频等方式,逐步分析和还原音乐作品的曲谱或乐谱的过程.它是音乐学习和演奏的一种常见方法,通常由音乐爱好者.乐手或学生使用. 在扒谱的过程中,人们会 ...
- 2023 11月 AtCoder 做题记录
AGC037F 题目传送门 第一步,考虑判断序列是否合法. 通过对于属于等级 $k$ 的定义将定义反推:$s$ 中最小的元素 $x$,找到所有 $x$ 的连续段.设一个连续段的长度是 $len$,若 ...
- 动态规划——提高Ⅴ(DP优化)
单调队列优化DP 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素.因为其单调性所以经常会被用来维护区间最值或者降低DP ...
- Grok AI 是什么?
原文链接:https://openaigptguide.com/grok-ai/ Grok AI是由马斯克推出的一款高级别的人工智能大语言模型,旨在帮助软件开发者以不同的口头语言交流和表达.它是基于多 ...
- 趋势指标(一)MACD指标
MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA) ...
- GPTs 初体验 - 1 分钟就能创建一个自己的 ChatGPT?
就在 11.10 号早上,ChatGPT 已经偷摸的把GPTs功能,开放给所有尊贵的 Plus 用户了. 随着这波的功能开放,界面也是改了不少.点击左侧的 Explore 或者左下角的用户处,就可以直 ...
- 新来个架构师,把Xxl-Job原理讲的炉火纯青
大家好,我是三友~~ 今天来继续探秘系列,扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 公众号:三友的java日记 核心概念 这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有 ...
- NCTF2022-Crypto WP
superecc 题目 from Crypto.Util.number import * from secrets import INF, flag assert flag[:5] == b'nctf ...