PostgreSQL的pg_catalog表损坏

我一直在外部硬盘驱动器上运行postgres数据库,并且在将其重新连接到睡眠的笔记本电脑后认为该服务器仍在运行,它似乎已损坏。在运行了一堆重新索引命令以修复其他一些错误之后,我现在得到以下错误。

错误:pg_toast_2618中的烤面包值12942缺少块编号0

返回此错误的命令的示例是:

select table_name,view_definition from INFORMATION_SCHEMA.views;

我已经运行命令“ select 2618 :: regclass;”这会给您问题表。但是,重新索引这似乎无法解决问题。我发现有很多关于找到损坏的行并将其删除的建议。但是,在我的实例中似乎已损坏的表是pg_rewrite,它似乎不是损坏的行,而是损坏的COLUMN。

我已经运行了以下命令,但它们不能解决问题。

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中的烤面包值11598缺少块编号0

此错误似乎会影响对诸如INFORMATION_SCHEMA表之类的所有与架构相关的查询。幸运的是,我的表中的所有表和数据似乎都很好,但是我无法查询生成这些表的sql,而且我创建的任何视图似乎都无法访问(尽管我注意到可以创建新视图)。

我对Postgresql不够熟悉,无法确切地知道pg_rewrite是什么,但是我猜测我不能只是截断表中的数据或设置ev_action = null。

我不确定下一步如何处理到目前为止收集到的信息。

fangchufeng 回答:PostgreSQL的pg_catalog表损坏

(至少)您的pg_rewrite目录具有数据损坏。该表包含所有视图的定义,包括系统正常工作所必需的系统视图。

最好的办法是还原备份。

您将无法使数据库恢复正常工作,最好的办法就是尽可能多地挽救数据。

尝试pg_dump。我不知道是否需要任何意见,但是如果可行,那很好。您将必须从转储中明确排除所有视图,否则很可能会失败。

如果这不起作用,请尝试对每个表使用COPY至少获取数据。元数据将更加困难。

如果这是一个重要的数据库,请聘请专家。

本文链接:https://www.f2er.com/3164728.html

大家都在问