Postgresql损坏了pg_catalog表



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

错误:pg_toast_2618 中toast值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 中toast值11598缺少区块号0

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

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

我不知道下一步该怎么处理我目前收集到的信息。

(至少(您的pg_rewrite目录存在数据损坏。此表包含所有视图的定义,包括系统工作所需的系统视图。

最好的做法是恢复备份。

你将无法让数据库恢复工作,你能做的最好的事情就是尽可能多地抢救数据。

尝试pg_dump。我不知道这是否需要任何观点,但如果它有效,那就好了。您必须明确地从转储中排除所有视图,否则很可能会失败。

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

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

相关内容

  • 没有找到相关文章

最新更新