我收到错误
ERROR: invalid page header in block 411 of relation "t_value_time"
在我的PostgreSQL数据库中。这种情况在不同的机器上发生。有没有办法防止它发生,或者至少告诉PSQL忽略无效块上的数据并继续前进?
我宁愿丢失块中的数据,让他跳过它,读取剩下的数据。有没有办法告诉PSQL跳过这个块?
答案 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(*); 如果成功,并且正在使用顺序扫描,则您的从属设备良好。 如果使用索引扫描,则可能不必考虑此选项。
注意:仅当您的主服务器受到存储级别损坏的影响时,此方法才有效。
我恰好在今天遇到了同样的问题,我能够解决它。