在145GB表的TRUNCATE之后,Postgres没有将空间释放到操作系统

问题描述 投票:2回答:2

我今天截断了一张145GB的表,但空间没有返回操作系统。我已经在数据库中验证了,表现在是空的。

尽管空间没有释放到操作系统,但我注意到在分区中运行du命令已经报告减少了145GB,但是当我运行df -h它没有。 145GB的差异不能因为inode大小。

我在CentOS 7中运行带有Postgres 9.3数据库的Mirth服务器。

任何线索为什么没有释放空间?

postgresql centos7 truncate mirth
2个回答
3
投票

您必须等到提交事务才能删除该文件。

请参阅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没有列出它。

-1
投票

删除或截断表时,PostgreSQL不会将其空间返回给OS 它只是将每一行标记为“已删除”。 当您插入新行时,PostgreSQL会重新使用“已删除”空间来存储新数据。

要释放这样的“删除”空间,您应该使用VACUUM FULL https://www.postgresql.org/docs/devel/sql-vacuum.html

© www.soinside.com 2019 - 2024. All rights reserved.