修复损坏的数据库postgresql

Jef*_*tho 16 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

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

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

wil*_*ser 8

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


精细手册中列出了两个可能有用的配置参数:ignore_system_indexeszero_damaged_pages.我从来没有用过它们,但如果我绝望的话我会的...

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

  • 添加了先发送副本的警告; 这非常重要.`zero_damaged_pa​​ges`*会影响TOAST表(以及索引和其他所有内容).它的工作原理是*擦除数据*,而不是恢复它.在使用它之前要非常仔细地思考,或者`pg_resetxlog`,或任何其他"大锤子"恢复工具. (4认同)

Ric*_*ton 7

如果您有备份,只需从中恢复即可.

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

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

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

  1. 尝试转储单个表.以这种方式获得你能做到的.
  2. 如果它们导致问题,请删除索引
  3. 转储表的部分(id = 0..9999,1000..19999等) - 这样你就可以识别某些行可能被破坏的地方并转储更小的部分来恢复仍然有用的部分.
  4. 尝试转储某些列 - 大型文本值存储在线外(在Toast表中),因此避免它们可能会将其余数据输出.
  5. 如果您的系统表已损坏,那么您需要完成大量工作.

这是很多工作,然后你需要经历并审核你已经恢复的东西,并试图弄清楚什么是缺失/不正确的.

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

要带走的关键信息 - 确保定期备份,并确保它们正常工作.