2

我有一个“小”问题。一周前,我的数据库达到了完整的磁盘容量。我删除了不同表中的许多行以释放磁盘空间。之后我尝试运行没有完成的完全真空。

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

释放磁盘空间的任何提示?

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

4

2 回答 2

5

首先:

升级

即使您不能升级到 8.2、8.3 或 8.4 - 至少升级到最新的 8.1(目前是 8.1.17,但将在 1-2 天内升级到 8.1.18)。

第二:诊断是什么问题。

使用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>;

一旦你知道哪些表/索引使用了大部分空间 - 你可以 VACUUM FULL 它,或者(更好)对它们发出CLUSTER命令。

于 2009-09-04T11:48:08.327 回答
2

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

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

于 2009-09-04T23:08:51.960 回答