如何在没有磁盘空间的大量死行的情况下对表进行完全清理?

时间:2019-11-11 11:59:24

标签: postgresql vacuum

将尝试描述问题:

我们有一个表格“故事”,当前统计数据:

总关系大小:188 GB

仅索引大小:52 GB

n_tup_del:274299085

n_live_tup:368846049

我们目前的SSD上还有约6 GB的存储空间。

现在,我们安装了另一台具有约190 GB可用空间的PC,它可作为/ dump文件夹使用。

我们如何释放空间?

使pg_dump这个表,然后截断它,然后还原?它有多安全?

还是我们可以以某种方式允许“真空已满”来使用安装的设备(/转储)空间?我们知道,真空已满将锁定访问权限。

谢谢!

1 个答案:

答案 0 :(得分:1)

Windows“共享”不是数据库的安全存储。

首先,执行备份。

忽略外键约束,您可以按照以下步骤操作:

  • 创建位置为dump的表空间/dump

  • 在此处创建一个空副本:

    CREATE TABLE copy (LIKE largetable) TABLESPACE dump;
    
  • 运行

    INSERT INTO copy SELECT * FROM largetable;
    
  • 删除大表。

  • 将新表移动到默认表空间:

    ALTER TABLE copy SET TABLESPACE pg_default;
    
    ALTER TABLE copy RENAME TO largetable;
    
  • 根据需要创建索引和约束。

  • 清理:

    DROP TABLESPACE dump;