postgresql - TRUNCATE 145GB 表后,Postgres 没有释放空间给操作系统

标签 postgresql centos7 truncate mirth

我今天截断了一个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/

相关文章:

postgresql - 在仍有许多事件事务的同时执行 pg_dump

apache - 如何使用非标准端口以非 root 身份运行 apache?

python - 警告 : The script pip3. 8 安装在不在 PATH 上的 '/usr/local/bin'

sql - 如何检查 TOAST 是否在 postgres 中的特定表上工作

sql - PostgreSQL 查询调优指南?

python - 无法从本地服务器外部连接到 Django

ruby-on-rails - 在事务期间保持数据可用 (postgresql)

sql - 字符串或二进制数据将被截断

python - 有没有办法在 Django 中按 View 中的单词截断?

django - 性能:在 PostgreSQL ArrayField 中存储点赞(Django 示例)