Oracle 12c在线移动数据文件后挂载点存储空间未释放问题咨询
这种df显示挂载点100%使用率,但du统计的实际使用空间远小于已用容量的情况,在Oracle环境里通常是以下几个原因导致的,咱们一个个来排查:
1. 已删除文件的句柄未被Oracle进程释放
这是最常见的原因。当你执行ALTER TABLESPACE ... MOVE DATAFILE完成后,Oracle后台进程(比如DBWR、CKPT这类)可能还持有原数据文件的打开句柄。如果你直接删除了原文件,操作系统并不会立即释放这部分空间——因为进程还在占用它,df会继续统计这部分已删除但未释放的空间,而du只会统计当前存在的文件,所以就出现了差异。
你可以用下面的命令找出这类文件:
lsof | grep /oracle/oradata1 | grep deleted
如果输出里有Oracle相关的进程(比如ora_dbw0_<你的实例名>)持有已删除的大文件,那就是这个问题了。解决办法是:
- 如果是用户会话持有,你可以杀掉对应的会话;
- 如果是后台进程持有,通常需要重启Oracle实例才能彻底释放这部分空间(当然重启前要做好备份和业务停机准备)。
2. 挂载点下存在其他用户的隐藏文件或未统计到的文件
你是用oracle用户执行的du -sh,如果/oracle/oradata1/下有其他用户(比如root)创建的文件,或者隐藏文件(以.开头),oracle用户可能没有权限读取,导致du统计不全。
可以切换到root用户执行以下命令重新统计:
sudo du -sh /oracle/oradata1/
如果结果和df的已用容量更接近,那就是有其他用户的文件占用了空间,找到这些文件清理掉就行。
3. 未清理的Oracle临时文件或日志文件
有时候你只迁移了数据文件,但原挂载点下的临时表空间文件(.tmp)、在线重做日志文件(.log)或者归档日志还留在原地,这些文件可能占用了大量空间。你可以检查挂载点下的所有文件:
ls -lh /oracle/oradata1/
看看有没有大的日志或临时文件,如果有,确认这些文件不再被使用后,就可以清理或者迁移它们。
4. 文件系统的快照或预留空间(可能性较低)
部分文件系统(比如ext4)会预留一部分空间给root用户默认是5%,但296G的话预留空间只有约14.8G,和你这里130G的差距不符,所以这个原因的可能性很小。不过你可以用tune2fs -l /dev/mapper/vg_oradata1-lv_oradata1查看预留空间设置,确认是否是这个问题。
内容的提问来源于stack exchange,提问作者Cemox

