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不懂也希望我将操作的过程记录下来,也就是越详细越好.所以写得比较$%^& ...
随机推荐
- 快速展示原型之Minimal API开发
Minimal API官网地址: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/minimal-apis/security?vi ...
- Go开发IDE全览:GoLand vs VSCode全面解析
关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构 ...
- 虹科分享|虹科Redis企业版数据库带你跑赢MySQL数字时代!
数字革命悄然爆发,数据库也将成为率先破局的关键技术! 借着互联网爆发的东风,前几年MySQL以其过硬的产品能力及开源优势,一度成为全球最受欢迎的关系型数据库.然而,革命的漫长之路才刚开始,MySQL是 ...
- C# 在流行度指数上将超过Java
2023年10月最新的TIOBE编程语言流行指数表明:C#和Java之间的差距从未如此之小,目前,差异仅为1.2%,如果趋势保持这种状态,C#将在大约2个月内超过Java,TIOBE Software ...
- Python JSON 使用指南:解析和转换数据
JSON 是一种用于存储和交换数据的语法.JSON 是文本,使用 JavaScript 对象表示法编写. Python 中的 JSON Python 有一个内置的 json 包,可用于处理 JSON ...
- shell解析xml文档
需要解析的源文件: /tmp/cameralist : <?xml version="1.0" encoding="UTF-8"?><came ...
- USB TYPE-C PIN定义
USB TYPE-C 母座 USB TYPE-C 公头
- 「保姆级」网络爬虫教程(二):教你下载文库中的PDF文档!
如何点赞再看,养成习惯.微信公众号搜索「Job Yan」关注这个爱发技术干货的 Coder.本文 GitHub https://github.com/JobYan/PythonPearls 已收录,还 ...
- 🔥🔥Java开发者的Python快速进修指南:面向对象基础
当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升.不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性.它使用了一些独特的关键字,如sel ...
- base64编码的学习
base64编码是什么 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. Base64编码本质上是一种将二进制数据转成 ...