我今天截断了一张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
的交易仍然开放。df
显示该文件仍然存在,但du
没有列出它。删除或截断表时,PostgreSQL不会将其空间返回给OS 它只是将每一行标记为“已删除”。 当您插入新行时,PostgreSQL会重新使用“已删除”空间来存储新数据。
要释放这样的“删除”空间,您应该使用VACUUM FULL
https://www.postgresql.org/docs/devel/sql-vacuum.html