PostgreSQL:块中无效的页眉

时间:2011-03-07 13:36:24

标签: postgresql block

我收到错误

ERROR:  invalid page header in block 411 of relation "t_value_time"

在我的PostgreSQL数据库中。这种情况在不同的机器上发生。有没有办法防止它发生,或者至少告诉PSQL忽略无效块上的数据并继续前进?

我宁愿丢失块中的数据,让他跳过它,读取剩下的数据。有没有办法告诉PSQL跳过这个块?

5 个答案:

答案 0 :(得分:26)

警告:您将丢失一些数据!

我们设法通过发出:

来克服它(崩溃的DEV VM)
database=# SET zero_damaged_pages = on;
SET
database=# VACUUM FULL damaged_table;
WARNING: invalid page header in block xxx of relation base/yyy/zzz; zeroing out page
[..]
REINDEX TABLE damaged_table;

通过pwkg.ork修复。

答案 1 :(得分:2)

每次相同的块?

根据我的阅读,无效块的最常见原因是硬件。 Red Hat有一个实用程序pg_filedump,它将“PostgreSQL堆,索引和控制文件格式化为人类可读的形式”。我不认为他们支持任何大于8.4.0的PostgreSQL版本,但我可能错了。

您希望通过使用严格,彻底的磁盘,RAM和NIC诊断来证明您的硬件是好的。

答案 2 :(得分:1)

没有简单的方法可以做到这一点,但通过直接编辑数据文件(pg_class条目的relfilenode给出文件名)来做起来相当容易。

只需从坏块中复制文件中其他位置的块。理想情况下,合成一个空块或更新你要覆盖的空块,使其中没有有效的元组。

一旦你得到了一些不会产生错误的东西,请转储表并重新加载以确保安全。

答案 3 :(得分:0)

这些几乎总是硬件问题顺便说一下。验证并测试RAM,磁盘,CPU。确保您的环境良好(电源输入不良可能会导致问题,因为过热)。这是防止它的最好方法。解决这个问题的最佳方法是从基础备份进行时间点恢复。

答案 4 :(得分:0)

如果您有从属服务器,请将其上的hot_standby_feedback设置为“ on”(如果尚未启用)。 执行pg_dump并将其写入/ dev / null,这样就不会占用任何空间。 nohup pg_dump db_name -v -Fc -f / dev / null和 如果转储成功,那么您的从属就可以了。执行故障转移。不会丢失任何数据。

另一种验证您的奴隶的方法是,从table_name解释select count(*); 如果成功,并且正在使用顺序扫描,则您的从属设备良好。 如果使用索引扫描,则可能不必考虑此选项。

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

我恰好在今天遇到了同样的问题,我能够解决它。