Answers:
由于您没有足够的空间来运行真空或重建数据库,因此您始终可以通过还原数据库来重建它们。还原数据库,表,索引将释放空间和碎片整理。之后,您可以设置自动维护以定期清理数据库。
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
gzip
部分以节省时间。
注意:我已经在9.1上进行了测试。我这里没有9.0服务器。我很确定,虽然它可以在9.0上运行。
注意(如@erny的注释中所述):
Note that high CPU load due to I/O operations may be expected.
通过使用临时表空间,几乎可以在不停机的情况下完成此操作。停机时间将以排他锁的形式出现。但是,只有在桌子上,您正在吸尘。因此,所有会发生的是,客户端查询时将只是等待锁被收购,如果他们访问相关表格。您不需要关闭现有连接。
但是要注意的一件事是,移动桌子和将真空吸尘器本身先需要等待排它锁!
首先,您显然需要一些额外的存储空间。正如Stéphane
评论中提到的那样,此表的大小至少应为VACUUM FULL
完整表的两倍。如果幸运的话,可以将磁盘动态添加到计算机中,请执行此操作。在最坏的情况下,您只能连接USB磁盘(虽然速度较慢且速度慢)!
接下来,安装新设备并将其用作表空间:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
您可以使用以下命令轻松列出表空间:
\db
仔细检查表的当前表空间(您需要知道将表移回何处):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
如果是NULL
,它将位于默认表空间中:
SHOW default_tablespace;
如果这是NULL
为好,它可能会pg_default
(查看官方文档的情况下,它的改变)。
现在将桌子移到上方:
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;
size of table x 2
,因为它VACUUM FULL
正在制作表的完整副本。
快速又肮脏:
例如,:
$ service postgresql stop
$ mv /var/lib/postgresql/9.5/main /mnt/bigdisk
$ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5
$ vacuumdb --all --full
$ rm /var/lib/postgresql/9.5/main
$ mv /mnt/bigdisk/main /var/lib/postgresql/9.5
$ service postgresql start