復元失敗: キー (plugin_name, key)=(discourse-data-explorer, q:-1) が重複しているため

Discourseをアップグレードしたところ、動作しなくなりました。カテゴリページは表示できますが、トップページや最新ページ(例えば最新ページなど)は閲覧できません。

公式プラグインも含め、すべてのプラグインを削除しましたが、問題は解決しませんでした。

そのため、バックアップから復元を試みたところ、以下のメッセージが表示されました。

[2020-07-12 01:16:20] ERROR:  could not create unique index "index_plugin_store_rows_on_plugin_name_and_key"
[2020-07-12 01:16:20] DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.
[2020-07-12 01:16:20] EXCEPTION: psql failed: DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.

[2020-07-12 01:16:20] /var/www/discourse/lib/backup_restore/database_restorer.rb:95:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:49:in `run'
/var/www/discourse/lib/backup_restore.rb:188:in `block in start!'
「いいね!」 1

プラグインストアに破損したデータがあります。

データエクスプローラーに保存したカスタムデータを気にしない場合は、以下を試してください:

./launcher enter app
rails c
PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
「いいね!」 4
root@HFT-app:/var/www/discourse# rails c
[1] pry(main)> PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
NoMethodError: undefined method `where' for PluginStore:Class
Did you mean?  when
from (pry):1:in `__pry__'
[2] pry(main)>


何か問題があるようです。

さらに詳しい情報をいただけますか?

PluginStoreRow である必要があります。PluginStore ではありません。以下を試してください:

./launcher enter app
rails c
PluginStoreRow.where(plugin_name: 'discourse-data-explorer').delete_all

:warning: これにより、サイトのデータエクスプローラー関連のデータがすべて不可逆的に削除されます

「いいね!」 4

では、どうすればよいでしょうか?
フォーラムが現在読み込めません。latest.json が失われたようです。

アプリの再ビルドを試してみてください。それでも解決しない場合は、/logs にエラーがないか確認してください。

「いいね!」 1

ログの確認方法は?

再構築プロセスのログのことでしたら、再構築時のエラーメッセージは以下の通りです(赤字の部分がすべてここにあります)。


2020/07/14 11:33:39 socat[26] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): No such file or directory


#------




2020-07-14 11:33:42.023 UTC [49] LOG:  database system is ready to accept connections
I, [2020-07-14T11:33:46.972466 #1]  INFO -- :
I, [2020-07-14T11:33:46.972792 #1]  INFO -- : > su postgres -c 'createdb discourse' || true
2020-07-14 11:33:47.025 UTC [62] postgres@postgres ERROR:  database "discourse" already exists
2020-07-14 11:33:47.025 UTC [62] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2020-07-14T11:33:47.026573 #1]  INFO -- :
I, [2020-07-14T11:33:47.026936 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2020-07-14 11:33:47.083 UTC [73] postgres@discourse ERROR:  role "discourse" already exists
2020-07-14 11:33:47.083 UTC [73] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists


こんにちは、コードを実行する方法を教えてください。

@xiasummer

現在の DB とアップロードフォルダの完全なバックアップが確認済みである場合に限り、そのバックアップを共有ディレクトリから移動またはコピーできます。以下は例です(設定に合わせて調整してください):

mv  /var/discourse/shared  /tmp

もちろん、最初に DB の完全なバックアップを取得していることを確認してください。

その後、最初から再構築できます:

./launcher rebuild app

そして、コマンドラインからリストアを実行します:

cp -rf /tmp/shared/backups/default /var/discourse/shared/standalone/backups

その後、通常の方法で最新のバックアップからリストアを実行できます。

これにより、アプリケーションのバックアップが、最後に取得した正常かつ完全なバックアップ時点の状態に復元されます。

これは、DB 全体とアップロードファイルの完全な最新バックアップが存在する場合にのみ推奨されます。

アップロードを含まないバックアップを実行した場合、当然ながらアップロードファイルは /tmp/shared/standalone/uploads にあります。以下のようにコピーして復元できます:

cp -rf /tmp/shared/standalone/uploads/* /var/discourse/shared/standalone/uploads

すべてが正常に動作し、リストアが期待通り完了したことを確認したら、もちろんステージングディレクトリを削除できます:

rm -rf /tmp/shared

これが進める方法の一つです。

他の方法もあるかもしれませんが、もし私が現在の良好な完全バックアップを持っていた場合、このように進めます。

「いいね!」 2

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