我的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
我继续尝试运行整个数据库的重新索引,实际上我离开了它,然后进入睡眠状态,我发现早上没有做任何事情,所以我不得不取消它。
我需要一些帮助来尽快解决这个问题,请帮忙。
答案 0 :(得分:7)
如果您有备份,只需从中恢复。
如果没有 - 您刚刚了解了为什么需要定期备份。如果硬件行为不端,PostgreSQL就无法做到。
此外,如果您再次发现自己处于这种情况,请先停止PostgreSQL并对所有内容进行完整的文件级备份 - 所有表空间,WAL等。这样您就有了一个已知的起点。
所以 - 如果你还想恢复一些数据。
这是很多工作,然后你需要经历并审核你已经恢复的东西,并试图找出缺失/不正确的东西。
你可以做更多的事情(在某些情况下创建空块可以让你转储部分数据)但是它们更加复杂和繁琐,除非数据特别有价值,不值得付出努力。
要消除这一点的关键信息 - 确保定期备份,并确保它们有效。
答案 1 :(得分:7)
在您执行任何其他其他操作之前,http://wiki.postgresql.org/wiki/Corruption 并按照说明操作。如果不这样做可能会使问题变得更糟。
Fine Manual中列出了两个可能有用的配置参数:ignore_system_indexes
和zero_damaged_pages
。我从来没有用过它们,但如果我绝望的话,我会这样做......
我不知道他们是否有助于反对吐司桌。在任何情况下,如果设置它们会导致您的数据库再次可用,我会{backup + drop + restore}以使所有表格和目录再次成为新生儿形状。成功了!
答案 2 :(得分:1)
在执行任何操作之前,请获取损坏数据库的完整文件系统级副本。
http://wiki.postgresql.org/wiki/Corruption
如果不这样做会破坏导致腐败的证据,并且意味着如果你的修复工作变得更糟并且使事情变得更糟,你就无法撤消它们。
立即复制 !