我正在通过 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
输出显示了初始文件名(和 [已删除])。