Solaris 提示我的分区使用了 100+ GB,但分区看起来是空的。空间用在哪里了?

Solaris 提示我的分区使用了 100+ GB,但分区看起来是空的。空间用在哪里了?

我正在通过 telnet 连接到一个用于存储 Oracle 数据库的 Solaris 5.9 机器。我删除了旧版本的数据库,尝试移入新版本(整个数据库为 90GB),但一直收到“磁盘已满”错误。我运行

df -hk

并发现我试图将文件移动到的分区(称为“/d02”)总共有 135GB,已使用 123GB,可用 10GB。但是,当我运行

ls -lah /d02

我得到 4 个目录:其中 3 个是 512B,1 个是 8KB。

当我删除旧的 Oracle 数据库时,空间是否不知为何没有被释放?我该如何释放空间,或者至少查看我的空间是如何被占用的?

谢谢你的时间。

答案1

我明白了。我必须终止所有持有该数据的进程 — — 在本例中是 Oracle。

另外,我想我应该把这个发到 serverfault。抱歉!

答案2

是的,您发现了根本原因。在 UNIX 上,删除文件会从目录中的访问列表中删除链接。但是,它可能不会删除内容,直到与文件关联的文件句柄关闭。这是一个相当常见的问题,事后很难追踪。

一旦文件句柄关闭,数据链接就可以释放到空闲列表中,正如您所发现的。最有可能的是,日志文件仍处于打开状态。您可能在数据库重新启动后发现了一些奇怪的行为,因为它的日志位置丢失了,并且它开始记录到控制台或其他奇怪的地方,例如 /tmp。

答案3

+1 针对@UnixGeek 的回答:删除文件不会释放磁盘空间,直到打开该文件的进程消失为止。

列出打开文件的“标准”工具是lsof- 我仍然不认为它包含在 Solaris 中(自从我成为 Solaris 管理员甚至使用过它以来已经好几年了),但可以从 sunfreeware 获得。

通过快速谷歌搜索发现,Solaris 实用程序pfiles可以做类似的事情(但我没有用过它)。

另外,fuser关于文件名,但你需要检查一下您删除文件。 fuser当某个进程告诉您该端口已在使用中时,它对于查找哪个端口打开也很有用。

我会插上系统管理员的 Unixersal 翻译器 (ROSETTA STONE),对于使用多个 Unices 并在它们之间进行翻译的人来说,这是一本非常有用的指南。

/proc在基于的系统中恢复已删除且仍由进程打开的文件的额外技巧:

cat /proc/<pid>/fd/<fd-of-delete-file>  > recovered.data

我曾在 Linux 中使用过它,其中ls -l /proc/<pid>/fd输出显示了初始文件名(和 [已删除])。

相关内容