PostgreSQL:TRUNCATE 后未释放磁盘空间

Ada*_*tan 14 postgresql truncate disk-space

我有TRUNCATE一个巨大的(~120Gb)表,名为files

TRUNCATE files;
VACUUM FULL files;
Run Code Online (Sandbox Code Playgroud)

表大小为 0,但没有释放磁盘空间。任何想法如何回收我丢失的磁盘空间?

更新: 磁盘空间在大约 12 小时后释放,我这边没有任何操作。我使用 Ubuntu 8.04 服务器。

Mik*_*ll' 12

根据源码中的注释truncate新建一个空的存储文件,并在提交时删除旧的存储文件。(文档建议“存储文件”就操作系统而言只是一个文件,但我可能会误解该术语。)

为关系创建一个新的空存储文件,并将其分配为 relfilenode 值。旧存储文件计划在提交时删除。

由于它似乎正在删除一个文件,我可以想象在某些情况下底层操作系统可能不会立即释放该空间。我想在某些情况下,存储文件可能最终会出现在 Windows 下的回收站中,例如。但就我而言,在 PostgreSQL 9.something 下截断一个表会立即增加 Windows 下的可用空间。

截断也记录在 WAL 日志中。不知道会有多大影响。

  • 可以想象,另一个后端进程仍然具有打开文件的文件描述符。如果这种情况再次发生,我会尝试终止所有其他后端进程,看看它是否有所作为。 (3认同)