Postgresql 损坏 pg_catalog table

Postgresql Corrupted pg_catalog table

我一直在外部硬盘驱动器上 运行 连接一个 postgres 数据库,在将它重新连接到一台正在休眠的笔记本电脑后,它似乎已损坏,认为服务器仍在 运行 连接。在 运行 执行了一系列重新索引命令来修复其他一些错误后,我现在收到以下错误。

错误:pg_toast_2618

中 toast 值 12942 缺少块编号 0

return此错误的命令示例是:

select table_name, view_definition from INFORMATION_SCHEMA.views;

我 运行 命令 "select 2618::regclass;" 给你带来了问题 table。然而重新索引这似乎并不能解决问题。我看到很多关于查找损坏的行并将其删除的建议。但是,在我的实例中似乎有损坏的 table 是 pg_rewrite 并且它似乎不是损坏的行而是损坏的列。

我已经 运行 以下命令,但它们没有解决问题。

REINDEX table pg_toast.pg_toast_$$$$;
REINDEX table pg_catalog.pg_rewrite;
VACUUM ANALYZE pg_rewrite; -- just returns succeeded.

我可以 运行 以下 SQL 语句,它将 return 数据。

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 tables。幸运的是,似乎我的所有 tables 和 tables 中的数据都很好,但我无法查询生成那些 tables 的 sql 和我拥有的任何视图创建的似乎无法访问(尽管我注意到我可以创建新视图)。

我对 Postgresql 不够熟悉,无法确切地知道 pg_rewrite 是什么,但我猜我不能只是 t运行cate 中的数据table 或设置 ev_action = null。

我不确定接下来要如何处理目前收集到的信息。

(至少)您的 pg_rewrite 目录有数据损坏。这个table包含所有视图的定义,包括系统工作所必需的系统视图。

最好的办法是恢复备份。

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

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

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

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