我在 mac (10.10.4) 上运行 postgres (postgis) 9.4.2。
我有几张大桌子(几个 TB)。
在其中一个上建立索引大约需要一周的时间,我看到可用的 HD 空间下降了,正如你所期望的那样,当停电持续时间超过电池单元和系统时,索引将完成的点接近下楼。我关闭了缓冲区,并且fillfactor=100
在构建期间,因为它是一个静态数据源。重新启动时,驱动器上剩余的可用空间恰好是索引构建接近尾声时的位置。真空分析不会释放空间。
我尝试放下桌子并重新摄取,但并没有减少空间。现在我所处的位置没有足够的空间来构建索引。
索引构建期间生成的文件是否由于停电期间机器停机的方式而陷入无法被系统删除的困境?
当我查看数据库中的表大小 + 索引(这是该驱动器上的唯一数据)时,它们加起来约为6TB。驱动器是8TB,驱动器上剩余的空间不到500GB,因此似乎在某处丢失了大约 1.5TB,这与索引的大小差不多。
有任何想法吗?
通常我们期望当 postgres 重新启动时,崩溃恢复过程会从数据目录中删除与回滚索引相关的文件。
让我们假设它不起作用,或者至少必须手动检查它。
应该在数据目录中的文件列表可以用这样的查询来建立:
reltablespace=0
用于默认表空间。如果有问题的索引是在非默认表空间中创建的,则0
必须将其替换为pg_tablespace
.i,r,t,S,m
relkind
分别对应索引、表、toast空间、序列、物化视图。所有这些对象的数据都在名称匹配的文件中pg_relation_filenode(oid)
。在磁盘上,数据文件位于以下
$PGDATA/base/oid/
位置,其中oid
是oid
通过 获取的数据库的位置select oid,datname from pg_database
。如果我们不是在谈论默认表空间,base
则替换为PG_version_somelabel
instead。列出并排序该目录中匹配 relfilenodes 的文件:
(对于大于 1Gb 的关系,实际上只保留第一段。如果有挥之不去的段没有附加到任何东西,他们应该单独考虑)
并将该文件与上述查询的结果进行比较。
如果存在与数据库知道的任何对象都不对应的延迟数据文件,它们应该出现在该差异中。