我的运行 postgresql 8.4.11 的 Ubuntu 14.04 LTS 服务器崩溃,重新启动后运行针对 postgresql 的查询的应用程序服务器报告以下错误
ERROR: invalid page header in block 40 of relation base/18038/22194
我用谷歌搜索,试图创建一个转储,并使用生成的错误消息来识别损坏的表。然后我执行了
SET zero_damaged_pages = on;
VACUUM FULL damaged_table;
-- vacuum didn't report any errors here
REINDEX TABLE damaged_table;
其他人提到reindexdb
了,所以我跑了
$ reindexdb -s mydb
也一样,但问题仍然存在。
最后——我从数据库中得到了一个工作备份——我删除并重新创建了整个数据库
DROP DATABASE mydb;
CREATE DATABASE mydb;
并恢复备份:
cat mydump| sudo -u postgres pgsql mydb
但即使是现在,问题仍然是一样的。我对 postgresql 了解不多,但是这样的错误如何在重新创建数据库后幸存下来?不幸的是,我需要让数据库再次在同一台机器上工作。
还有什么我可以尝试让数据库再次工作的吗?
这听起来像您的文件系统或磁盘上有某种损坏。
我建议看这里:postgresql corruption
之后,我会查看
dmesg
或/var/log/messages
查找您可能会看到的任何硬件错误。如果你有一个工作转储,我会将当前数据目录从 复制
/var/lib/postgresql/8.4/main
,在一个新目录上运行pg_createcluster 8.4 main
,然后尝试在那里恢复,看看这是否有助于解决任何挥之不去的问题。如果在那之后您仍然遇到问题,请继续
#postgresql
使用 Freenode IRC,或者[email protected]
将是我的下一步,如果我必须尽快启动并运行它。希望有帮助。祝你好运。=)
如果你有一个奴隶,如果还没有,请设置
hot_standby_feedback
它'on'
。执行 pg_dump 并将其写入 /dev/null,这样您就不会占用任何空间。如果转储成功,那么您的奴隶就可以了。进行故障转移。不会有数据丢失。
另一种验证奴隶的方法是:
如果它成功并且它正在使用序列扫描,那么你的奴隶是好的。如果它使用索引扫描,您可能不必考虑此选项。
注意:这仅在您的主服务器受到存储级别损坏的影响时才有效。
我今天碰巧遇到了同样的问题,我能够解决它。