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


10

PostgreSQL 8.4.15を使用しています。pg_dumpデータベースのバックアップを実行しているときに、次のエラーが発生しました。

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)

このエラーメッセージを検索したところ、テーブルのインデックスを再作成することを提案する参照(hereおよびhere)がいくつか見つかりました。(これらの議論ではpg_class、正しいpg_toast_XXXXXX値を見つけるためにテーブルをクエリすることへの言及がありましたが、それはエラーメッセージに表示されなかったためであると思われました。エラーメッセージに値が表示されたため、この部分をスキップしました。それ以降のバージョンのPostgreSQLが原因で便利になると思います。)

私は以下を実行しました:

REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;

pg_dumpエラーなしで使用できるようになりました。

pg_toastこれらのコマンドは実際に何をして何をしたのですか?これらは単に単純なクリーンアップに関するものですか、それともそのテーブルの一部の行を削除できたのでしょうか?そもそも何が問題の原因でしたか?

このテーブルには約300000行ありますが、前回の正常なバックアップ以降、約250行しかないと予想されます(このテーブルはINSERT / SELECTにのみ使用され、UPDATEには使用されません)。


私はこのアイデアを見つけました。あなたのケースが同じかどうかを確認できますか?
dezso

回答:


6

あなたが行ったのが再索引付けであったとすると、おそらく起こったのは、索引スキャンを使用してテーブル内のトーストされた値を見つけようとして、それを見つけることができなかったということです。これは壊れたインデックスのように聞こえます。真空分析ではテーブルが変更されますが、インデックスの再作成は行われず、変更はごくわずかです。

これについて考える方法は、TOASTされた属性は実際には約4kのサイズのチャンクに分割され、これらは行に格納されるということです。クエリ時に検索され、メイン行と並べ替え/再接続されます。ここで使用されているインデックスは破損しているようですが、インデックスを再作成すると問題が解決しました。

破損したインデックスは通常、サーバーに問題があることを示しています。メモリ、CPU、ハードドライブがすべて問題なく、問題がないことを確認してください。サーバーの過熱がインデックスの破損を特に引き起こしやすいことがわかりました。インデックスが破損する可能性がある場合、データの破損も心配する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.