エラーが発生します
ERROR: invalid page header in block 411 of relation "t_value_time"
私のPostgreSQLデータベースにあります。これは、さまざまなマシンで発生し続けます。それが起こらないようにする方法、または少なくとも無効なブロックのデータを無視して先に進むようにPSQLに指示する方法はありますか?
私はむしろブロックからデータを失い、彼にそれをスキップして残りのデータを読んでもらいたいです。このブロックをスキップするようにPSQLに指示する方法はありますか?
警告:一部のデータが失われます!
以下を発行することで、なんとかそれを乗り越えることができました(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 で修正します。
毎回同じブロック?
私が読んだところによると、無効なブロックの最も一般的な原因はハードウェアです。 Red Hatには、「PostgreSQLヒープ、インデックス、および制御ファイルを人間が読める形式に」フォーマットするユーティリティ pg_filedump があります。 8.4.0以降のPostgreSQLバージョンはサポートされていないと思いますが、間違っている可能性があります。
頑丈で完全なディスク、RAM、およびNIC診断)を使用して、ハードウェアが優れていることを証明したいと考えています。
これを行う簡単な方法はありませんが、データファイルを直接編集するだけでかなり簡単に行うことができます(pg_classエントリのrelfilenodeがファイル名を示します)。
ファイルの他の場所から不良ブロックの上にブロックをコピーするだけです。理想的には、空のブロックを合成するか、上書きするブロックを更新して、有効なタプルが含まれないようにします。
そのエラーを生成しないものを取得したら、安全のためにテーブルをダンプしてリロードします。
これらはほとんどの場合、ハードウェアの問題です。 RAM、ディスク、CPUを検証およびテストします。環境が良好であることを確認してください(電源入力が悪いと、過熱と同様に問題が発生する可能性があります)。それを防ぐための最良の方法です。これに対処する最善の方法は、基本バックアップからのポイントインタイムリカバリです。
スレーブがある場合は、まだの場合は、hot_standby_feedbackを「オン」に設定します。 pg_dumpを実行し、それを/ dev/nullに書き込んで、スペースを消費しないようにします。 Nohup pg_dump db_name -v -Fc -f/dev/null&ダンプが成功した場合、スレーブは正常です。フェイルオーバーを実行します。データの損失はありません。
スレーブを検証するもう1つの方法は、table_nameからselect count(*)を説明することです。成功し、シーケンススキャンを使用している場合、スレーブは正常です。インデックススキャンを使用している場合は、このオプションを考慮する必要がない場合があります。
注:これは、マスターがストレージレベルの破損の影響を受けている場合にのみ機能します。
今日、たまたま同じ問題に直面し、それを修正することができました。