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