pg_dump: サーバーからのエラー メッセージ: エラー: pg_toast_16418 のトースト値 43712886 のチャンク番号 0 がありません

pg_dump: サーバーからのエラー メッセージ: エラー: pg_toast_16418 のトースト値 43712886 のチャンク番号 0 がありません

$ pg_dumpall -U postgres -f /tmp/pgall.sql 

次のように表示されます。

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  missing chunk number 0 for toast value 43712886 in pg_toast_16418
pg_dump: The command was: COPY public.page_parts (id, name, filter_id, content, page_id) TO stdout;
pg_dumpall: pg_dump failed on database "radiant", exiting

以前のバックアップがありません。どうすれば修正できますか?

前もって感謝します。

答え1

これは、何らかの理由でデータベースが基本的に破損していることを意味します。

必要なのは、テーブル page_parts に少しずつ (一度に 1 行ずつ) アクセスして、どの行が破損しているかを判断し、その行を削除することです。これを行う最も簡単な方法は、 SELECT * FROM page_parts LIMIT を実行し、テーブル内の行に対してバイナリ検索を実行することです (中央から開始し、各部分を半分に分割するなど)。行を特定したら、それを削除すれば、データベースの残りの部分をダンプできるはずです。行を取得したら、もちろん、データの価値が高い場合は、個々の列を特定することもできます。

答え2

ありがとう。簡単なスクリプトを作成してください。

514 -- page_parts から count(*) を選択

for ((i=0; i<514; i++ )); do psql -U postgres radiant -c "SELECT * FROM page_parts LIMIT 1 offset $i" >/dev/null || echo $i; done

ERROR: missing chunk number 0 for toast value 43712886 in pg_toast_16418
433

関連情報