16

我的 postgresql 数据库有多个错误,这是在电涌后导致的:

我无法从我的数据库中访问大多数表。例如select * from ac_cash_collection,当我尝试时,我得到了愚蠢的错误:

错误:pg_toast_2619 中的 toast 值 118486855 缺少块号 0

当我尝试 pg_dump 时,出现以下错误:

来自服务器的错误消息:错误:关系“public.st_stock_item_newlist”不存在
pg_dump:命令是:LOCK TABLE public.st_stock_item_newlist IN ACCESS SHARE MODE

我继续尝试运行整个数据库的重新索引,实际上我让它运行,去睡觉,我发现它早上没有做任何事情,所以我不得不取消它。

我需要一些帮助以尽快解决此问题,请帮助。

4

3 回答 3

8

如果您有备份,只需从它们恢复。

如果没有 - 您刚刚了解了为什么需要定期备份。如果硬件出现异常,PostgreSQL 将无能为力。

此外,如果您再次遇到这种情况,请先停止 PostgreSQL 并对所有内容(所有表空间、WAL 等)进行完整的文件级备份。这样您就有了一个已知的起点。

所以 - 如果你仍然想恢复一些数据。

  1. 尝试转储单个表。以这种方式得到你能得到的。
  2. 如果索引导致问题,请删除它们
  3. 转储表的部分(id=0..9999、1000..19999 等) - 这样您就可以确定某些行可能损坏的位置并转储更小的部分以恢复仍然好的部分。
  4. 尝试只转储某些列 - 大文本值被离线存储(在 toast 表中),因此避免它们可能会获取其余数据。
  5. 如果您的系统表已损坏,那么您将投入大量工作。

这是很多工作,然后您需要仔细检查并审核您恢复的内容,并尝试找出丢失/不正确的内容。

您可以做更多的事情(在某些情况下创建空块可以让您转储部分数据)但它们都更加复杂和繁琐,除非数据特别有价值,否则不值得付出努力。

从中删除的关键信息 - 确保定期备份,并确保它们正常工作。

于 2012-06-14T15:17:24.783 回答
8

在你做任何其他事情之前,http://wiki.postgresql.org/wiki/Corruption 并按照说明行事。不这样做可能会使问题变得更糟。


Fine Manual中列出了两个可能有用的配置参数:ignore_system_indexeszero_damaged_pages. 我从未使用过它们,但如果我绝望的话,我会使用它们...

我不知道他们是否有助于反对烤面包桌。在任何情况下,如果设置它们会导致您的数据库再次可用,我会 {backup + drop + restore} 让所有表和目录再次恢复为新的形状。成功!

于 2012-06-14T19:34:16.753 回答
1

在您执行任何其他操作之前,请获取损坏数据库的完整文件系统级副本。

http://wiki.postgresql.org/wiki/Corruption

不这样做会破坏导致腐败的证据,这意味着如果您的修复工作不顺利并使事情变得更糟,您将无法撤消它们。

立即复制!

于 2012-06-15T04:09:26.683 回答