2009-09-04 45 views
0

我有一个“小”的问题。一个星期前,我的数据库达到了全盘的容量。我在不同的表中删除了很多行,试图释放磁盘空间。之后,我试图运行一个完整的真空,但没有完成。postgreSQL真空临时文件?

我想知道的是。当我停止从完全compliting真空它会留下磁盘上的任何临时文件,我必须删除manualy? 我现在有一个数据库,这是一个100%的磁盘容量,不必要地说是一个大问题。

任何提示释放磁盘空间?

我使用postgres 8.1.4数据库运行SUSE。

回答

4

首先:

升级

即使你不能到8.2,8.3或8.4 - 至少升级至最新的8.1(这是8.1.17的那一刻,但将8.1 .18在1-2天内)。

第二:诊断是什么问题。使用du工具来诊断空间的确切位置。什么目录占用太多空间?

df检查什么是总共使用的空间,然后检查它是多少是PostgreSQL目录。

最好的选择是:

cd YOUR_PGDATA_DIR 
du -sk * 
cd base 
du -sk * 
cd LARGEST DIR FROM PREVIOUS COMMAND 
du -sk * | sort -nr | head 

现在,你知道哪些目录PGDATA使用空间,你可以做一些事情。

如果它是日志或pg_temp - 重新启动pg或删除日志(pg_clog和pg_xlog不是日志的通用含义,不会删除任何内容!)。

如果它的东西,在你的根目录,然后:在基本目录

数值目录涉及到数据库。你可以用一下:

select oid, datname from pg_database; 

当你知道正在使用的大部分空间数据库,连接到它,并选中该文件正在使用的大部分空间。

文件名称将是数值,并可选择“.digits”后缀 - 这个后缀是(现在)不相关的,并且可以检查正是该文件所代表发出:

select relname from pg_class where relfilenode = <NUMBER_FROM_FILE_NAME>; 

一旦你知道哪些表/ indexes使用大部分空间 - 你可以使用VACUUM FULL或者(更好)在它们上面发出CLUSTER命令。

+0

感谢您的回复!我的问题是磁盘已满100%。真空和群集需要可用磁盘空间来运行。如果不运行vacuum/cluster,是否可以完全删除数据库? – jorgen 2009-09-04 12:49:13

+0

找到一张你可以牺牲的表格,并对其进行截断。它会立即释放空间。 – 2009-09-04 13:16:32

+0

谢谢你的帮助! – jorgen 2009-09-04 13:50:44

1

在您的问题的新切线上,您可以使用query找出数据库中正在使用大量空间的内容。这可以帮助您找到候选人,以便TRUNCATE收回足够的工作空间来清理已删除信息的工作空间。

请注意,删除大量行但不是VACUUMing足够频繁地检查磁盘空间,通常会导致称为索引膨胀的情况,而VACUUM FULL根本没有任何帮助。当我建议的查询显示大部分空间被索引而非常规表占用时,您就会知道您在那里。您需要CLUSTER,它需要与表本身一样多的可用磁盘空间来重建所有内容,以从该问题中恢复。