我目前正在使用使用 Postgresql 进行数据存储的嵌入式系统。我们目前有一个问题,盒子有时会在没有警告的情况下重新启动,也没有正确关机。在某些情况下,这显然会给我们留下数据库问题(某些高流量表中的无效页眉是最常见的症状)。
我想知道的是,清除错误的最简单方法是什么?我显然会丢失数据,但由于错误通常发生在其中包含临时数据的表中,我并不在意,我只想让系统恢复运行。
现在我们的程序是删除并重新创建任何受影响的表。还有什么我们可以做的更快的吗?正如我所说,我可以在受影响的页面上丢失任何数据,我只是希望它启动并运行。
平台是 Ubuntu 7.04、Postgresql 8.2(我们现在不能强制客户升级)。文件系统是 ext3,在 2 gig CF 卡上。
显然,修复意外重启是我的首要任务,但进展缓慢(在实验室中很难重现)。同时,我希望有一个更简单的解决方案,让我们的现场人员更快地处理确实出现的问题。
只想跟进创可贴,以防有人需要:
您可以启用zero_damaged_pages并在受影响的表上运行 VACCUUM,这应该清除任何包含已知缺陷数据的页面。但是,这并不能保护您免受列值的静默损坏,因为 PostgreSQL 目前还没有对其数据进行块/页面级别的校验和。
所以这是最后的选择,解决问题的根源总是可取的;)。
您是否尝试将WAL 同步方法设置为
fsync_writethrough
?