バックアップの復元が失敗しました

以下の問題が発生しています。10 年以上 Discourse フォーラムを運用してきましたが、しばらく更新をインストールできなくなったため、新しいサーバーのセットアップを検討しました。

旧サーバーのバージョン:3.4.0.beta4-dev

新サーバー:最新バージョン

バックアップファイル(アップロードを除く)のサイズはすでに 673.2 MB の .gz ファイルです。

残念ながら、復元処理がたびたび中止されます。ログファイルには以下のエラーが記録されています。

[2026-06-16 07:54:52] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2026-06-16 07:54:52] DETAIL:  Key (path, incoming_domain_id)=(//, 5) is duplicated.
[2026-06-16 07:54:52] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(//, 5) is duplicated.

[2026-06-16 07:54:52] /var/www/discourse/lib/backup_restore/database_restorer.rb:93:in 'BackupRestore::DatabaseRestorer#restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in 'BackupRestore::DatabaseRestorer#restore'
/var/www/discourse/lib/backup_restore/restorer.rb:61:in 'BackupRestore::Restorer#run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in 'Object#restore'
/var/www/discourse/script/spawn_backup_restore.rb:33:in 'block in '
/var/www/discourse/script/spawn_backup_restore.rb:4:in 'Kernel#fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in ''
[2026-06-16 07:54:52] Trying to rollback...

この問題を解決し、過去 10 年分のデータを失わずに復元するにはどうすればよいでしょうか?

ご支援をいただき、ありがとうございます!

こんにちは、そして9年ぶりのご復帰おめでとうございます!

長年続くフォーラムを見られるのは素晴らしいですね。

これは、こちらで議論されているのと同じインデックスの問題だと思います: Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes)

具体的な状況は以下の通りです:

incoming_referers テーブルは、訪問者をあなたのフォーラムへ誘導したURLパスを追跡します。ここにはユニークインデックスがあり、2つの行が同じパスとドメインの組み合わせを持つことはできません。

あなたのデータベースには、path='//' かつ incoming_domain_id=5 という行が2つ存在します。復元時にこのユニークインデックスの再構築を試みると、重複が見つかり、すべての復元トランザクションが中止されます。

そのため、重複する incoming_referers を見つけて削除し、新しいサーバーに復元するための新しいバックアップを作成する必要があります。

こちらの手順が記載されたトピックが参考になるかもしれません。

迅速なご返信をいただき、誠にありがとうございます!早速試してみます!

(投稿は著者によって削除されました)

すみません、お手すきの際にご確認いただけますでしょうか。コマンド「discourse=# select * from incoming_referers where path LIKE ‘%/search/’ ORDER BY incoming_domain_id;」を実行すると、構文エラーが発生してしまいます。

「discourse=#」と入力しましたか? なら、その部分を外してもう一度お試しください。

その後、「bash: 予期しないトークン `from’ 付近で構文エラー」というエラーメッセージが表示されます。

参考までに、現在の状態は以下の通りです: root@community-app:/var/www/discourse#

ああ、まだデータベースには接続していないようですね。

まず psql -U discourse discourse を実行してください(たぶん)。

そうすると、プロンプトが discourse=# に変わるはずです。

はい、"apt install postgresql-client-common"もインストールしました。しかし、まだ「エラー:少なくとも1つのpostgresql-client-パッケージをインストールする必要があります。」というエラーが表示されます。

それはわかりません。

直接 Rails コンソールで試してみてください:rails c

次に以下を実行します。

ActiveRecord::Base.connection.execute(<<~SQL)
  SELECT id, path, incoming_domain_id 
  FROM incoming_referers 
  WHERE path = '//' 
  AND incoming_domain_id = 5
SQL

これにより、データベースを介さずに同じ結果が得られるかもしれません。

うまくいきましたか?

本当に、本当に愚かな行動をとってごめんなさい。

今、Railsをインストールしましたが、うまくいったようです。「rails c」でも実行してみましたが、これも動作しているようです。しかし、コマンドを入力すると、次のような表示になります:

“root@community:/var/discourse# ActiveRecord::Base.connection.execute(<<~SQL)
-bash: syntax error near unexpected token `<<’
root@community:/var/discourse# SELECT id, path, incoming_domain_id
SELECT: コマンドが見つかりません
root@community:/var/discourse# FROM incoming_referers
FROM: コマンドが見つかりません
root@community:/var/discourse# WHERE path = ‘//’
WHERE: コマンドが見つかりません
root@community:/var/discourse# AND incoming_domain_id = 5
AND: コマンドが見つかりません
root@community:/var/discourse# SQL”

心配しないでください。もしかしたら私の指示があまり良くなかったのかもしれません :slight_smile:

Railsをインストールしたばかりなのにデータベースにアクセスできないというのは、私としても少し混乱しています。もしかしたら古いバージョンだからすべてが異なるのかもしれませんが、私もこれ以上は詳しくありません。

いずれにせよ、Railsに入った後はプロンプトが異なるはずです。出力結果を見ると、まだRailsコンソールに入っていないようです。

もしかしたら、実際のコンテナにも入っていないのかもしれません。./launcher enter app を実行しましたか?