我今天截断了一个145GB的表,但是空间没有归还给操作系统。我已经在数据库内部进行了验证,表现在是空的。
尽管空间没有释放给操作系统,但我注意到在分区中运行 du
命令已经报告少了 145GB,但是当我运行 df -h
时它确实如此不是。 145GB 的差异不可能是因为 inode 大小。
我在 CentOS 7 中运行带有 Postgres 9.3 数据库的 Mirth 服务器。
知道为什么没有释放空间吗?
最佳答案
您必须等到事务提交后文件才会被删除。
请参阅 ExecuteTruncateGuts
中的以下注释:
/*
* Need the full transaction-safe pushups.
*
* Create a new empty storage file for the relation, and assign it
* as the relfilenode value. The old storage file is scheduled for
* deletion at commit.
*/
但既然你说 du
不再报告空间,那么一定是以下情况之一:
运行
TRUNCATE
的事务仍然打开。其他东西打开了文件。直到最后一个(硬)链接消失并且最后一个进程关闭它,UNIX 才真正删除该文件。症状是
df
显示文件仍然存在,但du
没有列出它。
关于postgresql - TRUNCATE 145GB 表后,Postgres 没有释放空间给操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840465/