PostgreSQL:块中的无效页眉

Posted

技术标签:

【中文标题】PostgreSQL:块中的无效页眉【英文标题】:PostgreSQL: invalid page header in block 【发布时间】:2011-07-10 08:56:02 【问题描述】:

我遇到了一个错误

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

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

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

【问题讨论】:

【参考方案1】:

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

我们通过发出以下命令设法克服了它(崩溃的 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修复。

【讨论】:

这是正确的解决方案。 VACUUM FULLREINDEX 并不是清除警告所必需的。如果zero_damaged_pages 打开,任何从磁盘读取页面并触发“无效页面标题”错误的操作都将修复损坏的页面(通过全零重写),所以你可以只做一个命中坏的查询页面。【参考方案2】:

每次都是同一个区块?

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

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

【讨论】:

【参考方案3】:

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

只需从文件中的其他地方复制一个块来覆盖坏块。理想情况下,合成一个空块或更新您正在覆盖的块以使其中没有有效的元组。

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

【讨论】:

【参考方案4】:

顺便说一句,这些几乎都是硬件问题。验证和测试 RAM、磁盘、CPU。确保您的环境良好(不良的电源输入会导致问题和过热)。这是防止它的最好方法。解决此问题的最佳方法是从基本备份中进行时间点恢复。

【讨论】:

【参考方案5】:

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

另一种验证slave的方法是,解释select count(*) from table_name; 如果它成功并且它正在使用序列扫描,那么你的奴隶是好的。 如果它使用索引扫描,您可能不必考虑此选项。

注意:这仅适用于您的主服务器受到存储级别损坏的影响。

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

【讨论】:

以上是关于PostgreSQL:块中的无效页眉的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL COPY 附加页眉 - csv 中的页脚行

Postgresql 内存表空间中的插入速度慢

如何在将放置在页眉区域的块中显示页面上显示的数据?

postgres 错误:Postgresql 11.6 中的列不存在错误

匿名plsql块中的列索引无效[重复]

Postgresql:如何为postgres中的相同时间戳选择“媒体”列中的最大值?