修复损坏的数据库postgresql

时间:2012-06-14 09:23:40

标签: postgresql corrupt-data

我的postgresql数据库有多个错误,这是在电源浪涌后产生的:

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

ERROR: missing chunk number 0 for toast value 118486855 in pg_toast_2619

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

Error message from server: ERROR:  relation "public.st_stock_item_newlist" does not exist
pg_dump: The command was: LOCK TABLE public.st_stock_item_newlist IN ACCESS SHARE MODE

我继续尝试运行整个数据库的重新索引,实际上我离开了它,然后进入睡眠状态,我发现早上没有做任何事情,所以我不得不取消它。

我需要一些帮助来尽快解决这个问题,请帮忙。

3 个答案:

答案 0 :(得分:7)

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

如果没有 - 您刚刚了解了为什么需要定期备份。如果硬件行为不端,PostgreSQL就无法做到。

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

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

  1. 尝试转储各个表。以这种方式获得你能做到的。
  2. 如果它们导致问题则删除索引
  3. 转储表的各个部分(id = 0..9999,1000..19999等) - 这样你就可以识别某些行可能被破坏的地方并转储更小的部分以恢复仍然有用的部分。
  4. 尝试仅转储某些列 - 大型文本值存储在线外(在toast表中),因此避免它们可能会将其余数据输出。
  5. 如果您的系统表已损坏,那么您需要完成大量工作。
  6. 这是很多工作,然后你需要经历并审核你已经恢复的东西,并试图找出缺失/不正确的东西。

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

    要消除这一点的关键信息 - 确保定期备份,并确保它们有效。

答案 1 :(得分:7)

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


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

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

答案 2 :(得分:1)

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

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

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

立即复制