【问题标题】:Postgresql Corrupted pg_catalog tablePostgresql 损坏的 pg_catalog 表
【发布时间】:2019-11-04 17:46:15
【问题描述】:

我一直在外部硬盘驱动器上运行 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。

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

【问题讨论】:

  • 如果我运行命令:select table_name, view_definition from INFORMATION_SCHEMA.views;我收到错误:错误:pg_toast_2618 中的 toast 值 12942 缺少块号 0 位置:41 另外运行此:SELECT ev_action FROM pg_rewrite;返回错误:pg_toast_2618 中的 toast 值 11598 缺少块号 0
  • 我删除了对### 和 $$$$ 的引用。我的印象是这些数字仅与我的特定数据库实例相关,因此与调试无关。不过也许我错了。
  • 我的立场是正确的:pg_rewrite 确实有烤面包桌。

标签: postgresql corruption postgresql-11


【解决方案1】:

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

最好的办法是恢复备份。

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

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

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

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

【讨论】:

  • 谢谢,我想我内心深处知道这一点。谢天谢地,我一直将我的大部分视图保存为 .sql 文件,并且由于数据是可访问的,我应该可以转移到新的数据库。
猜你喜欢
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
相关资源
最近更新 更多