Debian/Ubuntu 随机磁盘扩展

Debian/Ubuntu 随机磁盘扩展

在 debian 12 (BookWorm) 上运行 mysql 8.0.34。

我遇到这个随机问题,磁盘看起来正在被稳定消耗,但是当我进入磁盘或搜索磁盘时,似乎没有任何东西正在占用空间,然后在到达后重置回正常磁盘满的。整个过程大约需要45分钟。

全新安装 debian 12,操作系统上安装的唯一服务是 mysql。

最后两个图像从 100% 磁盘消耗回到 44% 发生在大约 1 秒内。

非常感谢任何关于为什么会发生这种情况的解释或有关调试的建议。

在此输入图像描述

运行 lsof +L1

命令 PID 用户 FD 类型 设备大小/关闭 NLINK 节点名称

mysqld 886068 mysql 521u REG 254,1 194824503296 0 29360306 /tmp/#29360306 (已删除)

也许我应该问海豚?

答案1

运行 lsof +L1

COMMAND      PID       USER   FD   TYPE DEVICE     SIZE/OFF NLINK     NODE NAME    
mysqld    886068      mysql  521u   REG  254,1 194824503296     0 29360306 /tmp/#29360306 (deleted)

这是一个临时文件,在 保持打开状态时已被删除mysqld,当您运行该命令时,它的大小似乎约为 194G lsof +L1

如果您想找出文件包含的内容,您可以在/proc/<PID number>/fd/<FD number>进程仍然存在并保持打开状态时访问它。所以在这种情况下,你可以尝试例如:

sudo file -L /proc/886068/fd/521

尝试找出它实际上是什么类型的文件。

你能停止并重新启动你的 MySQL 数据库吗?一旦mysqld停止,它就会“释放”该文件,然后文件系统会自动清理它。或者,如果您可以找到一个数据库会话,该会话可能执行了一个愚蠢的查询,产生了近乎无限的输出,您也许可以强制该会话结束,这可能会导致mysqld关闭与该会话相关的任何临时文件。

如果您的 MySQL 服务器可通过互联网访问,则某些入侵者或恶意软件可能会滥用您的数据库来“隐藏”其中的某些数据。

来自 MySQL 8.0.x 关于临时文件的文档:

如果 mysqld 终止,MySQL 会安排删除临时文件。在支持它的平台(例如 Unix)上,这是通过在打开文件后取消链接来完成的。这样做的缺点是该名称不会出现在目录列表中,并且您看不到填满临时文件目录所在文件系统的大临时文件。 (在这种情况下,lsof +L1可能有助于识别与 mysqld 关联的大文件。)

在排序(ORDER BY 或 GROUP BY)时,MySQL 通常会使用一两个临时文件。所需的最大磁盘空间由以下表达式确定:

(排序内容的长度 + sizeof(行指针)) * 匹配行数 * 2

行指针大小通常为四个字节,但对于非常大的表,将来可能会增长。

对于某些语句,MySQL 会创建不隐藏且名称以 #sql 开头的临时 SQL 表。

某些 SELECT 查询会创建临时 SQL 表来保存中间结果。

因此,您的系统似乎经常运行一些具有相当大结果集的查询,并且中间结果或排序需要创建大型临时文件。

如果事实证明某个特定查询经常重复,并且中间文件是根据对结果进行排序的要求创建的,那么您确实应该考虑添加一个索引,该索引将允许数据库有效地预先访问适当的表。按照频繁重复的查询所需的方式进行排序。这也可能会给你一个重要的查询性能提升。

当然,如果您检查实际查询并发现应用程序正在创建一个可以以更智能的方式实现的愚蠢查询,那么错误报告(如果您可以提出一个改进查询的建议)可能会让每个人受益那正在使用相关的应用程序。

(我不是真正的 DBA,但是在工作中与 DBA 多年的讨论告诉我,缺乏适当的索引和应用程序生成的查询以愚蠢的方式搜索某些内容似乎是两个最常见的问题数据库性能不佳的原因。它们在开发中可能并不重要,但一旦数据量增长到生产规模,效率低下就会变得明显。)

相关内容