关于mysql:MySQL-数据库救火磁盘爆满了怎么办

5次阅读

共计 2235 个字符,预计需要花费 6 分钟才能阅读完成。

摘要: 当磁盘空间爆满后,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 左右。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0