今天例行Oracle数据库维护时,因为一个文件系统已经达到82%,而且又要创建新的分区表空间,所以删掉了该分区表最前面两个分区,然后删掉对应的表空间及数据文件(约15G),用下面语句:
alter table tm_bus_site_his drop partition p_site200806_a;
...
DROP TABLESPACE tm_index200805_a INCLUDING CONTENTS and datafiles cascade constraints;
...
删掉以后 发现该文件系统仍然是82%,占用的存储空间仍旧没有释放,是什么原因呢?
从网上搜索到下面的解释:
一般说来不会出现rm掉不释放空间的情况
出现这样的情况一般是由于有进程在向文件中写数据或有进程正在访问文件
而此时rm文件则会出现不释放空间的情况。
理解这样的问题需要理解rm的操作内含
一个文件的存放有数据部分和指针部分,而指针位于文件系统的头
删除操作系统的一个文件与oracle drop表的实质有些相似
处理掉指针,文件数据部分占用的空间就可以写入新内容了
之所以出现rm不释放即为有进程在用这个文件而引起操作系统认为这个文件未实质释放,从而df或bdf空间统计不正确
这一类问题的解决方法一般说来可以重启操作系统,重新umount及mount那个文件系统
这并不是一个好方法
建议的操作方法如下:
1、下载一个lsof软件装上,google上可以搜到
2、找到正在用被删文件的进程
lsof | grep deleted
3、kill掉相应的进程空间就释放了
其它建议:
1、清理alert.log listerner.log这些日志文件时最好用">文件"这样的操作方式,不要用rm。
2、清理归档日志最好用backup ... delete input这样的方式。
3、如果你的操作系统总出现rm不释放空间的问题,该请sa好好查查系统问题了,同时可以在rm前用lsof看一下有无进程在用这个文件。
4、解决问题的方法很多,最好不要用重启数据库或重启操作系统这样的方法。
: