我的运行 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 了解不多,但这样的错误怎么可能在数据库重建后仍然存在呢?不幸的是,我需要让数据库在同一台机器上再次运行。
还有什么我可以尝试让数据库重新运行吗?
答案1
这听起来就像是您的文件系统或磁盘出现了某种损坏。
我建议你看一下这里:postgresql 损坏
随后,我会查看dmesg
您/var/log/messages
可能看到的任何硬件错误。
如果您有一个有效的转储,我会将当前数据目录从中复制出来/var/lib/postgresql/8.4/main
,pg_createcluster 8.4 main
在新目录中运行,然后尝试在那里恢复,看看是否有助于解决任何遗留的问题。
如果此后您仍然遇到问题,请转到#postgresql
Freenode IRC,或者[email protected]
我的下一步是,如果我必须尽快启动并运行它。
希望这能有所帮助。祝你好运。=)
答案2
如果您有从属服务器,请将其设置hot_standby_feedback
为'on'
on(如果尚未设置)。执行 pg_dump 并将其写入 /dev/null,这样您就不会占用任何空间。
nohup pg_dump db_name -v -Fc -f /dev/null &
如果转储成功,则说明从属服务器正常。执行故障转移。不会丢失数据。
验证从属设备的另一种方法是:
explain select count(*) from table_name;
如果成功并且使用的是顺序扫描,则您的从属服务器没有问题。如果使用索引扫描,则可能不必考虑此选项。
注意:仅当您的主服务器受到存储级别损坏的影响时,这才有效。
我今天碰巧遇到了同样的问题并且我能够解决它。