こんにちは。
フォーラムを新しいサーバーに移行しようとしています。両方のサーバーは最新バージョンの Discourse Docker を実行しています。コマンドライン経由でバックアップをインポートしようとすると、次のエラーが発生します。
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: Key (path, incoming_domain_id)=(/search/, 418) is duplicated.
EXCEPTION: psql failed: DETAIL: Key (path, incoming_domain_id)=(/search/, 418) is duplicated.
これは、上記のスレッドで報告されているものと同じか類似のエラーのようです。
I have a duplicate key issue also, is there a documented fix?
discourse=# REINDEX SCHEMA CONCURRENTLY public;
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_ccnew"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1905) is duplicated.
[1] pry(main)> IncomingReferer.where(path: "/m/search")
=> [#<IncomingReferer:0x0000557176d3f210 id: 44231, path: "/m/search", incoming_domain_id: 4>,
#<IncomingReferer:0x0000557176d925c8 id: 42228, path: "/m/…
ただし、私の場合は、リンクされたスレッドで報告されている /m/search ではなく、/search/ パスで重複レコードが発生しています。
古いサーバーのコンテナに接続し (./launcher enter app)、Rails コンソール (rails c) で次のコマンドを使用して重複レコードを検索しようとしました。
IncomingReferer.where(path: "/search")
および
IncomingReferer.where("path LIKE '%/search%'")
しかし、これらは数百件のレコードを表示します。重複しているレコードをどのように特定し、安全に削除して再構築するにはどうすればよいでしょうか?フォーラムは古いサーバーでは現在正常に動作していますが、新しいハードウェアに移行する必要があります。
「いいね!」 1
いいえ、GUI 経由でのインポートも同じインポートプロセスを呼び出すものだと思っていました。今すぐ試してみます。
「いいね!」 1
pfaffman
(Jay Pfaffman)
2021 年 10 月 31 日午後 11:24
4
これは破損したインデックスがあることを意味している可能性があります。現在使用しているPostgresのバージョンは何ですか?
例えば:
cd /var/discourse
cat shared/standalone/postgres_data/PG*
(Postgresのファイル名は正確に覚えていません)
ここで「postgres corrupt index」と検索すると、不良レコードを特定して削除する方法について以前私が書いたトピックが見つかります。
基本的には、そのインデックスを再構築し、エラーを報告するレコードを削除し、インデックスが再構築されるまでこのプロセスを繰り返します。
glynhudson
(Glynhudson)
2021 年 10 月 31 日午後 11:33
5
GUI を通じてインポートを試みましたが、結果は全く同じでした:
pfaffman:
Postgres のバージョンは何ですか?
古いサーバーには PG_VERSION というファイルがありません。どのようにして実行中のバージョンを確認すればよいでしょうか?本日、Docker 版のインストールを最新バージョンに更新しました。
新しいサーバー(新規ブートストラップ済み)は Postgres V13 を実行しています。
cat shared/standalone/postgres_data/PG_VERSION
13
これを行うための推奨手順はありますか?
pfaffman
(Jay Pfaffman)
2021 年 11 月 1 日午前 12:33
6
以前、いくつかのヒントを含むトピックがありましたが、今は見当たりません。Postgres 12へのアップグレードから約1年が経過しています。
reindex index index_incoming_referers_on_path_and_incoming_domain_id;
また、
ActiveRecord::Base.connection.execute('reindex index index_incoming_referers_on_path_and_incoming_domain_id;')
もインデックスを再構築する方法です。エラーが発生するはずですので、その後で問題のあるレコードを削除できます。pathとIDの両方を含める必要があります。
OK、修正しました。以下を行いました。
コンテナに入室
./launcher enter app
データベースに接続
su postgres -c 'psql discourse'
重複を検索
discourse=# select * from incoming_referers where path LIKE '%/search/' ORDER BY incoming_domain_id;
id | path | incoming_domain_id
------+------------+--------------------
3339 | /search/ | 33
6257 | /search/ | 91
1567 | /search/ | 298
1777 | /search/ | 341
3010 | /search/ | 418
6247 | /search/ | 418
4293 | /search/ | 644
2899 | /search/ | 653
3447 | /search/ | 793
3696 | /search/ | 852
4395 | /a/search/ | 1050
6968 | /search/ | 1305
5634 | /search/ | 1387
5834 | /search/ | 1437
6519 | /search/ | 1637
7127 | /search/ | 1787
7280 | /search/ | 1827
(17 rows)
重複を削除
DELETE FROM incoming_referers WHERE path LIKE '%/search/' AND id IN (6247);
その後、再構築
discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING: cannot reindex invalid index "public.incoming_referers_pkey_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_incoming_referers_on_path_and_incoming_domain_id_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "pg_toast.pg_toast_20732_index_ccnew" concurrently, skipping
REINDEX
その後、別のバックアップを取得し、新しいサーバーにコピーして、正常にインポートできました
バックアッププロセスが重複を検出して問題を防げるようになると良いですね。幸運にも、まだ動作していた元のサーバーにアクセスできました。もしコールドバックアップを復元していたら、もっと大きな問題になっていたでしょう。
ご協力いただき、本当にありがとうございます。
「いいね!」 3
system
(system)
クローズされました:
2021 年 12 月 1 日午前 2:12
8
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.