16

postgresql db で複数のエラーが発生しました。これは電力サージの後に発生しました。

データベースからほとんどのテーブルにアクセスできません。たとえばselect * from ac_cash_collection、試してみると、愚かなエラーが発生します。

エラー: pg_toast_2619 のトースト値 118486855 のチャンク番号 0 がありません

pg_dump を試すと、次のエラーが表示されます。

サーバーからのエラー メッセージ: エラー: リレーション "public.st_stock_item_newlist" が存在しません
pg_dump: コマンドは: LOCK TABLE public.st_stock_item_newlist IN ACCESS SHARE MODE

先に進んで、データベース全体の再インデックスを実行しようとしましたが、実際には実行したままにしてスリープ状態にしましたが、午前中に何もしていないことがわかったので、キャンセルする必要がありました。

これをできるだけ早く修正するために助けが必要です。助けてください。

4

3 に答える 3

8

バックアップがある場合は、それらから復元するだけです。

そうでない場合は、定期的なバックアップが必要な理由を学びました。ハードウェアが誤動作した場合、PostgreSQLができることは何もありません。

さらに、このような状況に再び遭遇した場合は、最初にPostgreSQLを停止し、すべてのテーブルスペース、WALなどのすべての完全なファイルレベルのバックアップを取ります。これにより、開始点がわかります。

したがって、それでも一部のデータを回復したい場合。

  1. 個々のテーブルをダンプしてみてください。この方法でできることを入手してください。
  2. 問題が発生した場合はインデックスを削除します
  3. テーブルのセクションをダンプします(id = 0..9999、1000..19999など)-これにより、一部の行が破損している可能性のある場所を特定し、さらに小さいセクションをダンプして、まだ良好なものを回復できます。
  4. 特定の列だけをダンプしてみてください。大きなテキスト値は(トーストテーブルに)オフラインで保存されるため、それらを回避すると残りのデータが失われる可能性があります。
  5. システムテーブルが破損している場合は、多くの作業に取り掛かっています。

これは大変な作業です。次に、回復したものを調べて監査し、不足しているものや正しくないものを見つけ出す必要があります。

できることは他にもありますが(場合によっては空のブロックを作成すると、部分的なデータをダンプできる場合があります)、それらはすべてより複雑で面倒であり、データが特に価値がない限り、努力する価値はありません。

これを取り除くための重要なメッセージ-定期的にバックアップを取り、それらが機能することを確認してください。

于 2012-06-14T15:17:24.783 に答える
8

他のことをする前に、http://wiki.postgresql.org/wiki/Corruption実行し、指示に従って行動してください。そうしないと、問題が悪化するリスクがあります。


詳細マニュアルに記載されている、使用できる可能性のある 2 つの構成パラメーターがあります:ignore_system_indexeszero_damaged_pages. 私はそれらを使用したことはありませんが、絶望的であれば使用します...

それらがトーストテーブルに対して役立つかどうかはわかりません。いずれにせよ、それらを設定することでデータベースが再び使用可能になる場合は、{バックアップ + ドロップ + 復元} して、すべてのテーブルとカタログを再び新しい形に戻します。成功!

于 2012-06-14T19:34:16.753 に答える
1

他のことを行う前に、破損したデータベースの完全なファイル システム レベルのコピーを作成します。

http://wiki.postgresql.org/wiki/破損

そうしないと、破損の原因に関する証拠が失われ、修復作業がうまくいかず、事態が悪化した場合、修復作業を元に戻すことができなくなります。

今すぐコピーしてください!

于 2012-06-15T04:09:26.683 に答える