如何在有大量死行 w/o 磁盘 space 的 table 上进行完全清理?

How to do full vacuum on table with lot of dead rows w/o disk space?

会尽量描述问题:

我们有一个table"stories",当前统计:

total_relation_size:188GB

仅索引大小:52 GB

n_tup_del: 274299085

n_live_tup: 368846049

目前我们的 SSD 上还剩下 ~6 GB 的空间。

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

我们怎样才能解放出来space?

制作pg_dump这个table,然后截断它,然后恢复?它有多安全?

或者我们可以通过某种方式允许 "vacuum full" 使用挂载设备 (/dump) space 来做什么?我们知道 vacuum full 会锁定访问权限。

提前致谢!

A Windows "share" 不是数据库的安全存储。

首先,执行备份。

忽略外键约束,您可以进行如下处理:

  • 创建一个 table空间 dump,位置 /dump

  • 在那里创建一个空副本:

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

    INSERT INTO copy SELECT * FROM largetable;
    
  • 去掉大的table.

  • 将新的table移动到默认的table空格:

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

  • 清理:

    DROP TABLESPACE dump;