postgresql:即使删除并重新创建后仍显示“页面标题无效”消息

postgresql:即使删除并重新创建后仍显示“页面标题无效”消息

我的运行 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/mainpg_createcluster 8.4 main在新目录中运行,然后尝试在那里恢复,看看是否有助于解决任何遗留的问题。

如果此后您仍然遇到问题,请转到#postgresqlFreenode 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;

如果成功并且使用的是顺序扫描,则您的从属服务器没有问题。如果使用索引扫描,则可能不必考虑此选项。

注意:仅当您的主服务器受到存储级别损坏的影响时,这才有效。

我今天碰巧遇到了同样的问题并且我能够解决它。

相关内容