这是一个 RHEL 服务器,我在上面运行一个 MySQL 服务器,数据库和日志文件(但是,日志记录已禁用)位于有/srv
足够空间可用的目录中。
最近我有一个崩溃的表,所以我尝试修复它,但第二天我发现 MySQL 无法响应许多查询,并出现错误,表明没有磁盘空间:
ERROR 1030 (HY000): Got error 28 from storage engine
所以我运行以下命令来查看占用空间的内容
[root@tms /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/server-slash
9.9G 9.5G 0 100% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sda1 485M 58M 402M 13% /boot
/dev/mapper/server-var
739G 252G 450G 36% /srv
令人惊讶的是它的/
目录。但更令人惊讶的是,下面的目录/
并没有表明已使用的空间超过2GB, whiledf
显示总空间9.9GB为了/
。
[root@tms /]# du -sh /*
7.5M /bin
48M /boot
200K /dev
24M /etc
4.0K /home
223M /lib
21M /lib64
16K /lost+found
4.0K /media
4.0K /mnt
183M /opt
...deleted some file-not-found errors for files under /proc
0 /proc
144K /root
14M /sbin
4.0K /selinux
252G /srv
0 /sys
44K /tmp
917M /usr
259M /var
那么为什么会df
显示错误的值呢?我怎样才能找出实际占用空间的内容?
答案1
常见的编程技术是创建一个临时文件并立即 unlink() 它。这使得该文件(及其空间)在程序运行期间可用,但在使用该文件的程序终止时会自动删除该文件。优点之一是无需编写 Epilog(清理)代码。
要确定是否有进程保持未链接的文件打开,请执行以下操作:
lsof -a +L1 /dev/server_slash
(或者)
lsof +D /dev/server_slash +L1
查找 NLINK 值为零 (0) 的所有文件。这些文件的链接计数为零,当最后一个进程终止时,这些文件将消失。 SIZE/OFFSET 列将提供相关文件的字符大小。
答案2
1)df
不报告 UNIX 风格文件系统上为 root 保留的空间(默认为 5%)。因此,df
报告的内容总是少于应有的内容。
2)但在这里,我猜测您在没有安装 srv 分区的情况下运行了数据库。如果没有安装 srv 分区,内容将被写入安装点,即。到 /-分区中的 srv 目录下。 (根分区),因此占用了 / 分区上的大量空间。
然而,当你做将 srv-partition 挂载到 srv-directory 上,/-partition 的 srv-directory 下的所有文件都会被您“挂载”在其上的分区“隐藏” - 但空间仍然已用完,尽管您无法看到它或访问它以将其删除。
尝试卸载 srv-partition(转到 singleuser-moder/runlevel 1/maintenance 模式,以便一切都停止),检查它是否确实已卸载(使用mount
),并查看是否有文件隐藏在您通常用作挂载点的目录下( usr、srv、home、var、tmp、...)位于 / 分区中。我敢打赌你会在其中一些中发现一些重要的东西。完成并重新启动后,请确保 srv 分区实际上按照应有的方式安装。
这——你可以在通常被安装的分区隐藏的目录中保存东西——实际上有时是有用的。