Postgresql 损坏的 pg_catalog 表

标签 postgresql corruption postgresql-11

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

错误:pg_toast_2618 中的 toast 值 12942 缺少 block 编号 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 缺少 block 编号 0

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

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

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

最佳答案

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

最好的办法是恢复备份。

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

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

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

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

关于Postgresql 损坏的 pg_catalog 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58698625/

相关文章:

c - 在读取结构体中的数据之前检测其是否已损坏

arrays - PostgreSQL 将出现次数计入 json 键/值

ios - 编译时错误 - XCode 4.1、iOS 4 中的 XIB/NIB 损坏

django - 在 ModelForm 中使用 `SplitArrayField` 而不是 `SimpleArrayField`

javascript - ExtJS 和 Internet Explorer : Layout corruption with scrollbars

postgresql - 如何使用 postgres 11 从函数迭代返回表

postgresql - 如何从 PostgreSQL 存储过程中获取结果集?

postgresql - 如何获得postgres中两个向量之间的余弦距离?

postgresql - 将关系数据库转换为图形数据库

python - 在 Python 2.7 中向字符串添加单引号