我有一个“小”问题。一周前,我的数据库达到了完整的磁盘容量。我在不同的表中删除了许多行,试图释放磁盘空间。之后,我尝试运行完全真空,但没有完成。
我想知道的是。当我从完全compliting停止真空时它是否留下我必须手动删除的磁盘上的任何临时文件? 我现在拥有一个100%磁盘容量的数据库,不用说这是一个大问题。
有关释放磁盘空间的任何提示吗?
我正在使用postgres 8.1.4数据库运行SUSE。
答案 0 :(得分:4)
首先:
即使你不能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命令。
答案 1 :(得分:1)
在问题的新切线上,您可以使用query找出数据库中正在使用大量空间的内容。这可以帮助您找到TRUNCATE的候选人来回收足够的工作空间来清理那些已删除信息的人。
请注意,删除大量行但不经常进行VACUUMing以保持磁盘空间不受检查通常会导致称为索引膨胀的情况,而VACUUM FULL根本没有帮助。当我建议的查询显示你的大部分空间被索引而不是常规表占用时,你就会知道你在那里。您需要CLUSTER,它需要与表本身一样多的可用磁盘空间来重建所有内容,以便从该问题中恢复。