我一直在一个外部硬盘上运行postgres数据库,在将它重新连接到一台休眠的笔记本电脑后,它似乎被损坏了,该笔记本电脑认为服务器仍在运行。在运行了一堆reindex命令来修复其他一些错误之后,我现在得到以下错误。
错误: pg_toast_2618中缺少toast值12942的区块编号0
返回此错误的命令示例如下:
select table_name, view_definition from INFORMATION_SCHEMA.views;我已经运行了命令"select 2618::regclass;“,它会给出问题表。但是,重新建立索引似乎并不能解决问题。我看到很多关于找到损坏的行并将其删除的建议。但是,在我的实例中似乎有损坏的表是pg_rewrite,它看起来不是损坏的行,而是损坏的列。
我已经运行了以下命令,但它们不能解决问题。
REINDEX table pg_toast.pg_toast_$$$$;
REINDEX table pg_catalog.pg_rewrite;
VACUUM ANALYZE pg_rewrite; -- just returns succeeded.我可以运行下面的SQL语句,它将返回数据。
SELECT oid, rulename, ev_class, ev_type, ev_enabled, is_instead, ev_qual FROM pg_rewrite;但是,如果我将ev_action列添加到上面的查询中,它会抛出一个类似的错误:
错误: pg_toast_2618中缺少toast值11598的区块编号0
此错误似乎会影响所有与模式相关的查询,例如INFORMATION_SCHEMA表。幸运的是,似乎我所有的表和表中的数据都很好,但是我不能查询生成这些表的sql,并且我创建的任何视图似乎都无法访问(尽管我注意到我可以创建新视图)。
我对Postgresql还不够熟悉,不知道pg_rewrite到底是什么,但我猜我不能只是截断表中的数据或设置ev_action = null。
我不确定下一步如何处理我到目前为止收集的信息。
发布于 2019-11-07 00:36:56
(至少)您的pg_rewrite目录有数据损坏。此表包含所有视图的定义,包括系统工作所必需的系统视图。
最好的做法是恢复备份。
您将无法使数据库恢复工作,您能做的最好的事情就是尽可能多地抢救数据。
试试pg_dump。我不知道这是否需要任何视图,但如果它工作,那是很好的。您必须显式地从转储中排除所有视图,否则很可能会失败。
如果这不起作用,请尝试对每个表使用COPY,以便至少获得数据。元数据将更加困难。
如果这是一个重要的数据库,请聘请专家。
https://stackoverflow.com/questions/58698625
复制相似问题