【问题标题】:Postgres Vacuum doesnt free up spacePostgres Vacuum 没有释放空间
【发布时间】:2018-07-06 06:51:35
【问题描述】:

我的数据库中有一个表占用 161GB 硬盘空间。 200Gb 硬盘中只剩下 5GB 可用空间。

  1. 以下命令显示我的表正在消耗161GB的硬盘空间,
    select pg_size_pretty(pg_total_relation_size('Employee'));

  2. 表中有近 527 行。现在我删除了 250 行。我再次检查了 Employee 的 pg_total_relation_size。大小仍然是 161GB。

  3. 看到上面查询的输出后,我运行了vacuum命令:
    VACUUM VERBOSE ANALYZE Employee;

  4. 我检查了 VACUUM 是否真的发生使用,
    SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables; 我可以看到与我运行 VACUUM 命令的时间相匹配的最后一次真空时间。

  5. 我还运行了以下命令来查看是否有死元组,
    SELECT relname, n_dead_tup FROM pg_stat_user_tables; Employee 表的 n_dead_tup 计数为 0。

  6. 如果我运行上述所有这些命令,
    select pg_size_pretty(pg_total_relation_size('Employee')); 它仍然显示 161GB。

请问这背后的原因是什么?另外请纠正我如何释放interface_list。

【问题讨论】:

    标签: postgresql vacuum


    【解决方案1】:

    vacuum 没有物理上的“空闲”空间。它仅将不再使用的空间标记为可重复使用。因此后续的 UPDATE 或 INSERT 语句可以使用该空间而不是追加到表中。

    Quote from the manual

    VACUUM 的标准形式删除了表和索引中的死行版本,并标记了可供将来重用的空间。但是,它不会将空间归还给操作系统,除非在特殊情况下,表末尾的一个或多个页面完全空闲并且可以轻松获得排他表锁 p>

    (强调我的)

    如果您重新插入已删除的 250 行,您将看到该表不会再次增长,因为新插入的行只是使用由vacuum 标记为空闲的空间。

    如果您真的想将表格的大小实际减小到“需要”的大小,则需要运行vacuum full

    Quote from the manual

    VACUUM FULL 通过编写一个完整的新版本的表格文件没有死区来主动压缩表格。这可以最小化表的大小,但可能需要很长时间。它还需要额外的磁盘空间来存储表的新副本,直到操作完成

    (强调我的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多