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 FULL
和 REINDEX
并不是清除警告所必需的。如果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 中的页脚行