如何回收由部分构建并因断电而终止的索引占用的空间


9

我正在Mac(10.10.4)上运行Postgres(postgis)9.4.2。

我有几个大桌子(几个TB)。

在其中一个索引建立大约一个星期的过程中,我看到了可用的HD空间下降,正如您所期望的那样,当断电持续时间比电池单元和系统更长时,索引将接近完成索引的时间点下去了。fillfactor=100由于它是静态数据源,因此在构建过程中需要缓冲。重新启动后,驱动器上剩余的可用空间恰好接近索引构建即将结束时的位置。真空分析无法释放空间。

我试着放下桌子并重新吃东西,但并没有减少空间。现在,我在一个没有足够空间来建立索引的地方。

索引构建期间生成的文件是否卡在某个状态中,由于机器在断电期间停机而无法被系统删除?

当我查看db中的表大小+索引(这是该驱动器上的唯一数据)时,它们的总和约为6TB。该驱动器为8TB,而驱动器上剩余的空间不足500GB,因此似乎某个地方丢失了约1.5TB的数据,其大小与索引的大小差不多。

有任何想法吗?


索引是否仍与这样的查询一起列出? SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
卡萨德里(Kassandry)

不,它不会显示在该查询的结果中。
dkitchel

1
列表中有什么可以SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;给您的吗?
dezso 2015年

不,那是空的。
dkitchel

Answers:


5

通常,我们希望重新启动postgres时,崩溃恢复过程会从数据目录中删除与回滚索引相关的文件。

让我们假设它不起作用,或者至少必须手动检查它。

可以使用以下查询来建立应位于datadir中的文件列表:

select pg_relation_filenode(oid)
   from pg_class
  where relkind in ('i','r','t','S','m')
    and reltablespace=0
  order by 1;

reltablespace=0用于默认表空间。如果有问题的索引是在非默认表空间中创建的,则0必须在中将其替换为OID pg_tablespace

i,r,t,S,m relkind分别对应于索引,表格,吐司空间,序列,实例化视图。所有这些对象的数据都保存在名称匹配的文件中pg_relation_filenode(oid)

在磁盘上,数据文件在下方$PGDATA/base/oid/oid是所oid获得的数据库的位置select oid,datname from pg_database。如果我们不是在谈论默认表空间,则将base其替换为PG_version_somelabel

列出并排序与该目录中的relfilenodes匹配的文件:

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(实际上,对于大于1Gb的关系,它仅保留第一个段。如果有未缠结的段未连接到任何对象,则应将它们分开考虑)

然后将该文件与上面的查询结果进行比较。

如果存在与数据库知道的任何对象都不对应的持久数据文件,则这些文件应出现在该差异中。


太棒了!我在数据目录中找到1个未在选择列表中显示的文件。我可以安全地删除该文件吗?
dkitchel

实际上,它对应于约800个文件,这些文件在点后都有迭代-都像499807.484等。我可以安全地删除这些文件吗?
dkitchel

@dkitchel:对于巨大的索引,每个分段都是1Gb。也许检查一下它们的时间戳是否与创建索引运行时一致。至于删除它们,我希望上面的推理是正确的,但这是您的数据,因此最终是您的决定!
DanielVérité15年

是的,时间戳与建立索引的时间一致,并且文件大小的总和与索引的大小相对应。您的推理似乎很可靠。我会充满信心地尝试一下。万分感谢。
dkitchel

只是跟进,以便其他陷入困境的人可以放心使用@DanielVerite的解决方案。他的解决方案确实对我来说非常有效。
dkitchel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.