当前位置: 首页>>WEB开发>>正文


我需要在没有可用磁盘空间的情况下运行VACUUM FULL

webfans WEB开发 , , , , , 去评论

问题描述

我有一张桌子占据了我们服务器上近90%的高清空间。我决定放下几列以释放空间。但我需要将空间返回给操作系统。但问题是,如果我运行VACUUM FULL并且没有足够的可用空间来制作表的副本,我不确定会发生什么。

我知道不应该使用VACUUM FULL,但我认为这是这种情况下的最佳选择。

任何想法,将不胜感激。

我正在使用PostgreSQL 9.0.6

最佳解决思路

由于您没有足够的空间来运行vacumm或重建,您可以通过恢复它们来重建postgresql数据库。恢复数据库,表,索引将释放空间和碎片整理。之后,您可以设置自动维护以定期对数据库进行真正的自定义。

1备份postgresql服务器上的所有数据库

您需要将所有数据库备份到具有足够空间的分区。如果您使用的是Linux,则可以使用gzip进一步压缩备份以节省空间

su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz

2备份配置文件

cp /path/to/postgresql/data_directory/*.conf /some/partition/

3停止Postgresql

pg_ctl -D /path/to/postgresql/data_directory stop

4擦除数据目录的内容

rm -Rf /path/to/postgresql/data_directory/*

5运行initdb以重新启动数据目录

initdb -D /path/to/postgresql/data_directory

6恢复配置文件

cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf 

7启动Postgresql

pg_ctl -D /path/to/postgresql/data_directory start

8恢复所有数据库的转储

gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out

次佳解决思路

注意:我在9.1上测试了这个。我这里没有9.0服务器。虽然它可以在9.0上运行,但我确信它很合适。


小心(如@erny的评论中所述):

Note that high CPU load due to I/O operations may be expected.

通过使用临时表空间,您可以使用几乎没有down-time来完成此操作。 down-time将采用独占锁的形式。但只有你在桌子上吸尘。所有这一切都将发生,如果客户端查询访问有问题的表,它将只是等待获取锁。您无需关闭现有连接。

但要注意的一件事是,移动桌子和真空吸尘器本身需要先等待独家锁定!


首先,您显然需要一些额外的存储空间。正如Stéphane在评论中提到的那样,这需要至少是所讨论的表的两倍,因为VACUUM FULL可以完整复制。如果您很幸运并且可以动态地将磁盘添加到计算机,请执行此操作。在最坏的情况下,你可以只附加一个USB磁盘(尽管风险和速度慢)!

接下来,安装新设备并使其可用作表空间:

CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';

您可以使用以下方法轻松列出表空间:

\db

Double-check表的当前表空间(您需要知道将其移回的位置):

SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';

如果它是NULL,它将在默认表空间中:

SHOW default_tablespace;

如果那也是NULL,它可能是pg_default(如果它被改变,检查the official docs)。

现在移动表格:

ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT;  -- if autocommit is off

吸尘:

VACUUM FULL mytable;

将其移回:

-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT;  -- if autocommit is off

删除临时空间:

DROP TABLESPACE tempspace;

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/3040.html,转载请务必附带本地址声明。