如何在有大量死行 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;
会尽量描述问题:
我们有一个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;