例外: psqlに失敗しました: 詳細: キー (post_id)=(36946) が重複しています。

サーバーを新しいホストに移行しようとしています。バックアップファイルをダウンロードし、新しいホストにアップロードしました。Discourse のクリーンなコピーをインストールし、コマンドラインからの手順に従いました。

残念ながら、discourse restore databasename は次のようなエラーで失敗します。

ALTER TABLE
ALTER TABLE
ALTER TABLE
ERROR:  could not create unique index "posts_search_pkey"
DETAIL:  Key (post_id)=(36946) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (post_id)=(36946) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:149:in `restore'

データベースファイルに何か問題があるようです。このエラーを修正する方法について、どなたかアドバイスをいただけますでしょうか?元のサーバーにはまだアクセスでき、正常に動作しているようです。

バックアップファイルをダウンロードする前に、データベースを分析(および修正?)できる SQL コマンドなどを実行する方法はありますか?

破損したインデックスがあるようです。Postgresのバージョンは何ですか?

これに関するトピックがいくつかあります。実行中のインスタンスでそのテーブルを再インデックスしてから、重複するIDを削除または修正してみてください。

はい、破損していると思います。誰かが修正方法を教えてくれたら嬉しいです :slight_smile:

Postgres は 13.6 です。別のサーバーの新しいインスタンスに移動しようとしています。

Docker コンテナ内で rake search:reindex を試しましたが、次のエラーで失敗しました。

........rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "posts_search_pkey"
DETAIL:  Key (post_id)=(86919) already exists.

問題のレコードを削除して再インデックスを試すことは可能でしょうか?

どんな助けでも感謝します!

はい、行を削除することをお勧めします。それが最も簡単な解決策です。

「いいね!」 2

問題のある行を特定して削除するために使用できるpsqlコマンドを教えていただけますか?

ありがとうございます!

それは次のようなものだと思います

./launcher enter app
su - postges
psql discourse
select id from post_search_data were post_id>86918 and post_id<86921;
--- when you get the id ----
delete from post_search_data where id=ID_FROM_LAST_QUERY

もっとあるかもしれません。

おそらく他の誰かがもっと助けを提供できるでしょうが、あなたのサーバーにログインせずにできるのはこれくらいです。もっと助けが必要な場合は、Marketplace に投稿するか、直接連絡してください。

あるいは、単に削除して再生成してもらうのが安全かもしれませんが、それについてはよくわかりません。

皆さん、ありがとうございました。

以下の作業を行うことができました。

discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew2"
DETAIL:  Key (post_id)=(116038) is duplicated.
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 2
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 0
discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew3"
DETAIL:  Key (post_id)=(9336) is duplicated.
discourse=# delete from post_search_data
where post_id = 9336;
DELETE 1
.
.
.
.
discourse=# reindex index concurrently "posts_search_pkey";
REINDEX

すべて問題ないように見えたので、フルバックアップを取得し、新しいサーバーに問題なくリストアしました。

皆様の時間を割いていただき、感謝いたします。Discourseが大好きです!

教訓:バックアップは時々確認して、良好であることを確かめること :slight_smile: 毎日バックアップを取得し、さらに月ごとの「スナップショット」も保持しています。破損していないデータベースのバックアップで最も古いものは4ヶ月前のものでした :frowning:

「いいね!」 5

素晴らしい!解決してよかったです!

@sam 懸念されるのは、これがPG<13の問題だと思っていたのに、PG13を実行していることです。

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.