Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL服务器磁盘问题一例

MySQL服务器磁盘问题一例

作者头像
AsiaYe
发布于 2022-05-17 02:13:47
发布于 2022-05-17 02:13:47
54200
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行

MySQL服务器磁盘问题一例

今天早上在公司遇到一个磁盘空间相关的问题,比较典型,记录一下,希望对大家有帮助。

业务侧反馈有磁盘报警现象,登陆到服务器上之后,看到下面的场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ data1]# df -h /data1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda8       1.5T  1.3T  140G  91% /data1

[root@ data1]# du -sh *
21M     database_exporter
845M    dbatemp
16K     lost+found
116G    mysql3306
6.4G    mysql3630
414G    mysql5186
10M     mysqlbinlog

图中可以得到下面的信息:

1、磁盘的总容量是1.5T,实际占用了1.3T

2、/data1目录下的mysql相关的目录,加起来只有不到600G,而其他目录,几乎不占用磁盘空间

3、df -h看到的占用1.3T容量和du -sh看到的实际600G容量不匹配,似乎有700G磁盘容量消失了

剩余的700G空间去哪里了?

检查了磁盘上的隐藏文件,也没有发现端倪。于是我想到了之前的一个经典案例,就是Linux服务器下,有可能出现这种删除文件之后,磁盘空间不释放的情况,一般是文件句柄不释放,导致的磁盘空间问题。

这里需要简单说一个Linux命令,就是lsof命令:

在Linux操作系统中,一切皆文件,而lsof命令的全程就是(list open files),将所有的打开的文件都展示出来,lsof命令不仅可以查看操作系统打开文件、目录的情况,还可以查看进程监听的端口等信息。常用的lsof命令的参数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-a 指示其它选项之间为与的关系
-c <进程名> 输出指定进程所打开的文件
-d <文件描述符> 列出占用该文件号的进程
+d <目录> 输出目录及目录下被打开的文件和目录(不递归)
+D <目录> 递归输出及目录下被打开的文件和目录
-i <条件> 输出符合条件与网络相关的文件
-n 不解析主机名
-p <进程号> 输出指定 PID 的进程所打开的文件
-P 不解析端口号
-t 只输出 PID
-u 输出指定用户打开的文件
-U 输出打开的 UNIX domain socket 文件
-h 显示帮助信息
-v 显示版本信息

想到这里,我利用lsof命令查看当前打开的文件内容,并过滤了一下已经被delete的文件,结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@ data1]# lsof -n | grep delete
COMMAND     PID   TID           USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
cupsd      1225                 root    9r      REG                8,2         1926    1575211 /etc/passwd+ (deleted)
mysqld_sa  9014                 root    0u      CHR              136,0          0t0          3 /dev/pts/0 (deleted)
mysqld    10175               my5186    5u      REG                8,8        15513   96731233 /data1/mysql5186/ibdpQaPG (deleted)
mysqld    10175               my5186    6u      REG                8,8            0   96731972 /data1/mysql5186/ibQg9qu6 (deleted)
mysqld    10175               my5186    7u      REG                8,8            0   96731979 /data1/mysql5186/ibLLGH9v (deleted)
mysqld    10175               my5186    8u      REG                8,8            0   96731980 /data1/mysql5186/ibYg7Bln (deleted)
mysqld    10175               my5186   13u      REG                8,8            0   96731981 /data1/mysql5186/ibm22peP (deleted)
mysqld    10175               my5186   19w      REG                8,8 786372990960   96731986 /data1/mysql5186/slow.log (deleted)
mysqld    10175  1400         my5186    5u      REG                8,8        15513   96731233 /data1/mysql5186/ibdpQaPG (deleted)
mysqld    10175  1400         my5186    6u      REG                8,8            0   96731972 /data1/mysql5186/ibQg9qu6 (deleted)
mysqld    10175  1400         my5186    7u      REG                8,8            0   96731979 /data1/mysql5186/ibLLGH9v (deleted)
mysqld    10175  1400         my5186    8u      REG                8,8            0   96731980 /data1/mysql5186/ibYg7Bln (deleted)
mysqld    10175  1400         my5186   13u      REG                8,8            0   96731981 /data1/mysql5186/ibm22peP (deleted)
mysqld    10175  1400         my5186   19w      REG                8,8 786372847911   96731986 /data1/mysql5186/slow.log (deleted)
mysqld    10175  1401         my5186    5u      REG                8,8        15513   96731233 /data1/mysql5186/ibdpQaPG (deleted)
mysqld    10175  1401         my5186    6u      REG                8,8            0   96731972 /data1/mysql5186/ibQg9qu6 (deleted)
mysqld    10175  1401         my5186    7u      REG                8,8            0   96731979 /data1/mysql5186/ibLLGH9v (deleted)
mysqld    10175  1401         my5186    8u      REG                8,8            0   96731980 /data1/mysql5186/ibYg7Bln (deleted)
mysqld    10175  1401         my5186   13u      REG                8,8            0   96731981 /data1/mysql5186/ibm22peP (deleted)
mysqld    10175  1401         my5186   19w      REG                8,8 786372854597   96731986 /data1/mysql5186/slow.log (deleted)
mysqld    10175  1402         my5186    5u      REG                8,8        15513   96731233 /data1/mysql5186/ibdpQaPG (deleted)
mysqld    10175  1402         my5186    6u      REG                8,8            0   96731972 /data1/mysql5186/ibQg9qu6 (deleted)
mysqld    10175  1402         my5186    7u      REG                8,8            0   96731979 /data1/mysql5186/ibLLGH9v (deleted)
mysqld    10175  1402         my5186    8u      REG                8,8            0   96731980 /data1/mysql5186/ibYg7Bln (deleted)
mysqld    10175  1402         my5186   13u      REG                8,8            0   96731981 /data1/mysql5186/ibm22peP (deleted)

上面命令就是过滤那些已经从linux操作系统删除掉,然后还处于打开状态的文件(这意味着他们的文件句柄还没有释放,自然磁盘空间就没有释放)。

结果可以看到,有个MySQL实例持有的slow.log文件已经被删除了,但是句柄还没有释放,红色部分size字段显示的数字是786372854597,这个单位是B,换算成GB,也就是786G,这就能解释为什么我们的磁盘空间被消耗了这么多了,现在的问题就是解决这个句柄占用不释放的问题了。

既然是持有的slowlog文件没有释放,那么我们就重新生成一个新的slowlog文件就行,于是,对这个MySQL实例重新生成slowlog文件,执行命令flush slow logs,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
superdba@[(none)] 17:45:11>flush slow logs;
Query OK, 0 rows affected (28.83 sec)

可以看到,执行时间还是比较长的,持续了28s,这期间我还是比较担心,担心MySQL实例直接挂掉,好在没有挂掉,一切比较正常。

处理过后,再来看磁盘空间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@mis73243 ~]# df -h /data1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda8       1.5T  571G  874G  40% /data1

可以看到磁盘空间已经被释放掉了。

至此,问题解决。

总结:

1、Linux中,删除文件,没有释放空间,有可能是文件句柄没有释放,持续占用磁盘空间

2、可以通过lsof命令来查看当前打开的文件情况,如果要过滤已经删除的文件,可以使用lsof -n | grep delete命令

3、MySQL可以通过flush slow logs命令来重新生成slowlog,释放旧的slowlog句柄,如果是其他类型的log,可以使用对应的flush语句,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FLUSH [NO_WRITE_TO_BINLOG | LOCAL] {
    flush_option [, flush_option] ...
  | tables_option
}

flush_option: {
    BINARY LOGS
  | ENGINE LOGS
  | ERROR LOGS
  | GENERAL LOGS
  | HOSTS
  | LOGS
  | PRIVILEGES
  | OPTIMIZER_COSTS
  | RELAY LOGS [FOR CHANNEL channel]
  | SLOW LOGS
  | STATUS
  | USER_RESOURCES
}

tables_option: {
    TABLES
  | TABLES tbl_name [, tbl_name] ...
  | TABLES WITH READ LOCK
  | TABLES tbl_name [, tbl_name] ... WITH READ LOCK
  | TABLES tbl_name [, tbl_name] ... FOR EXPORT
}

关于flush命令,更多信息,请参考MySQL官方文档。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL为什么lsof会看到这么多临时文件
一般情况下我们会使用lsof命令来查看MySQL当前使用的临时文件的使用,这是因为这些临时文件使用ls命令并不能显示,在5.7中其建立方式是使用Liunx api mkstemp进行的建立,这种文件是进程专用的,返回文件描述符后会使用api unlink进行删除。
老叶茶馆
2020/09/23
1.9K3
MySQL为什么lsof会看到这么多临时文件
MySQL中查看InnoDB状态的一个小技巧
MySQL中如果要查看InnoDB的状态,如果想看到更完整的信息,毫无疑问就是命令show engine innodb status。
jeanron100
2018/09/29
1.6K0
MySQL中查看InnoDB状态的一个小技巧
磁盘空间清理
某天登陆以后发现创建文件失败,提示空间不足了。 于是我用df命令看了一下,使用率确实达到了100%。
派大星在吗
2021/12/05
2K0
MySQL日志故障的处理和分析
有一台预上线的服务器最近在做压力测试,也引发了一系列的相关问题,排查思路可以提供参考。
jeanron100
2018/12/07
7060
MYSQL临时表导致根分区爆满问题分析
突然接到线上Zabbix告警信息,报MYSQL所在的主机/分区不足15%,内容如下:
后场技术
2020/09/03
1.1K0
InnoDB 体系结构(上)
系统层是相应的数据字典,数据文件和日志文件,其中binlog是MySQL Server层的,放在这里是因为和InnoDB有密切的关系。
jeanron100
2019/03/07
9320
InnoDB 体系结构(上)
(二) 服务器端的程序的编译与部署
这篇我们来介绍下TeamTalk服务器端的编译与部署,部署文档在auto_setup下,这里我们只介绍下服务器程序的编译与部署,不包括管理后台的部署,其部署方法在auto_setup\im_server文件夹,其实按官方介绍只要找一台干净的linux系统运行一下auto_setup\im_server\setup.sh程序就可以了,会自动安装mysql(maridb,mysql被oracle收购后,分为两个分支,继续开源的分支改名叫maridb)、nginx和redis。我们暂且不部署web端,所以不需要安
范蠡
2018/04/04
1.4K0
(二)  服务器端的程序的编译与部署
服务器删除文件后磁盘空间没有立刻释放问题
发现一台服务器的磁盘空间不足,需要进行处理,登录后发现磁盘使用率已经100%,操作删除了一些文件和日志信息后,查看空间仍然没有变化。
javaNice
2023/11/17
1.1K0
MySQL慢日志占满磁盘空间导致业务主库宕机解决
在MySQL的日常维护中,我们总会遇到这样或那样的问题,对于那些经常发生且有处理经验的事故,不论是新手还是老司机都能在故障规定的容错时间内解决。而对于那些不常见、比较棘手的问题,新手上路可能就显得举足无措了,这个时候新手和老司机的差距就体现出来了。从知识储备还是工作经验,可能老司机比新手强一点,但如果一个新司机没有日志排错的意识,不具备日志排错的经验,那怎么能学会弯道超车、漂移的快感。我们知道数据库中有很多重要的日志,如错误日志error log、慢日志slow log、二进制日志binary log、查询日志general log等等其他日志,错误日志error log是我们分析问题参考的依据,它记录数据库的启动/运行/停止的过程,包含了info、warning、error三个级别,分析error log也有助于我们了解数据库的运行机制。
星哥玩云
2022/08/17
1K0
从 lsof 开始,深入理解Linux虚拟文件系统
原文:https://juejin.im/post/6875110082724659213 作者:有疑说
入门笔记
2022/06/02
4620
从 lsof 开始,深入理解Linux虚拟文件系统
linux 系统监控、诊断工具之 lsof 用法简介
1、lsof 简介 lsof 是 linux 下的一个非常实用的系统级的监控、诊断工具。 它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合~ 它可以用来列出被各种进程打开的文件信息,记住:linux 下 “一切皆文件”, 包括但不限于 pipes, sockets, directories, devices, 等等。 因此,使用 lsof,你可以获取任何被打开文件的各种信息。 只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种文
用户1177713
2018/02/24
2.4K0
惊心动魄-生产环境Mysql启动失败
根据提示:mysql5.7的mysqld_safe启动时,引用的mysql5.6动态库,是不是因为环境变量之类有影响。直接到/usr/local/mysql-5.7.16-linux-glibc2.5-x86_64/ 路径下启动试试,启动成功^-^。
Linux运维技术之路
2022/06/07
1.3K0
惊心动魄-生产环境Mysql启动失败
《MySQL核心知识》第16章:日志
今天是《MySQL核心知识》专栏的第16章,今天为大家系统的讲讲MySQL中的日志,希望通过本章节的学习,小伙伴们能够举一反三,彻底掌握MySQL中日志相关的知识。好了,开始今天的正题吧。
冰河
2022/12/01
3980
《MySQL核心知识》第16章:日志
从 lsof 开始,深入理解 Linux 虚拟文件系统!
作者:cyningsun 链接:https://juejin.im/post/6875110082724659213
杰哥的IT之旅
2020/09/28
1.4K0
从 lsof 开始,深入理解 Linux 虚拟文件系统!
CentOS删除文件后没有释放空间
发现一台服务器的home空间满了,要清空无用的文件,但删除文件后,发现可用空间没有变化 os:centos6.0
黄啊码
2020/05/31
3.6K0
如何备份mysql_史上最全的MYSQL备份方法
用过的备份方式有:mysqldump、mysqlhotcopy、BACKUP TABLE 、SELECT INTO
全栈程序员站长
2022/06/28
6.1K0
一次服务器磁盘空间不足导致的一系列问题
  继昨天服务器上应用 CPU占用过高 后面该应用宕掉了以后      java 一次CPU占用过高问题的排查及解决
江湖前辈黄药师
2018/08/27
2.8K0
一次服务器磁盘空间不足导致的一系列问题
MYSQL高可用架构heartbeat和drbd实现.md
Mysql数据库高可用涉及技术:1.mysql 主从同步 / 2. heartbeat技术 / 3. drdb 技术 总结:改变单一软件应用思想打组合权;
全栈工程师修炼指南
2022/09/28
5310
MYSQL高可用架构heartbeat和drbd实现.md
一次线上服务器磁盘耗尽的问题排查处理
发现很多文件是删除的状态,但是空间还未释放,应该是有进程还在使用这些文件,导致这些以被删除的文件一致被占用,无法释放磁盘空间。
IT云清
2019/07/10
7420
Mysql服务器企业实战
MySQL属于传统的关系型数据库产品,其开放式的架构使得用户的选择性很强,而且随着技术的逐渐成熟,MySQL支持的功能也越来越多,性能也在不断地提高,对平台的支持也在增多,此外,社区的开发与维护人数也很多。当下,MySQL因为其功能稳定、性能卓越,且在遵守GPL协议的前提下,可以免费使用与修改,因此深受用户喜爱。
用户1570500
2024/10/06
2270
相关推荐
MySQL为什么lsof会看到这么多临时文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验