3.0.0から3.0.1へのアップデート中に問題が発生

こんにちは。

本日、Discourseアプリを3.0.1にアップデートしました。Postgresのマイグレーション処理中にアップデートが失敗しました。
具体的には以下の部分です。

2023-01-27 04:50:48.628 UTC [483] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 04:50:48.628 UTC [483] discourse@discourse DETAIL:  Key (name)=(e-mail) already exists.
2023-01-27 04:50:48.628 UTC [483] discourse@discourse STATEMENT:  UPDATE tags t
	SET public_topic_count = x.topic_count
	FROM (
	  SELECT
	    COUNT(topics.id) AS topic_count,
	    tags.id AS tag_id
	  FROM tags
	  INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
	  INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
	  INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
	  GROUP BY tags.id
	) x
	WHERE x.tag_id = t.id
	AND x.topic_count <> t.public_topic_count;

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

タグに重複があるようでした。Postgresに接続してタグを修正しました。その後、マイグレーションとアップデートは完了しました。

質問ですが、DBを直接操作して対応したのは正しかったでしょうか?重複したタグの名前を変更しただけです。
重複したタグがどのように作成されたかは分かりません。過去2〜3年で挿入されたようです。
この状況が再び発生する可能性があるかどうかも分かりません。

「いいね!」 1

私も同じ問題があります

全く同じ症状でしたか?

ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(e-mail) already exists.
「いいね!」 1

はい。重複したタグ / index_tags_on_name が原因でもあります。
私の場合は、タグの名前が異なります。

現在、以下を調査中です。

  • ruby を 3.0.0 にアップグレードする方法。web-push が 2.6.7 であるため、タグを修正するための便利なコマンドを入力するために rails c に入ることさえできません。
  • postgres データベースからタグを安全に削除する方法。まだ手がかりはありません。
「いいね!」 1

エラーが発生したログの断片を投稿してください!

重複キーの値がどのように発生したのかが誰かにわかるようになれば、より詳細な情報があれば助かります。

データベースの修復はお手伝いできません。

Rubyの問題については、コマンドラインでのアップグレードが必要だと思います(*)。例えば以下をご覧ください。

(*)編集:しかし、以下を参照してください。現在のデータベースではアップグレードが失敗します。しまった。

「いいね!」 2
I, [2023-01-27T07:46:34.317438 #1]  INFO -- : 
> cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate'
2023-01-27 07:46:45.663 UTC [584] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL:  Key (name)=(hws-connect) already exists.
2023-01-27 07:46:45.663 UTC [584] discourse@discourse STATEMENT:  UPDATE tags t
        SET public_topic_count = x.topic_count
        FROM (
          SELECT
            COUNT(topics.id) AS topic_count,
            tags.id AS tag_id
          FROM tags
          INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
          INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
          INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
          GROUP BY tags.id
        ) x
        WHERE x.tag_id = t.id
        AND x.topic_count <> t.public_topic_count;

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(hws-connect) already exists.

このエラーは、タグが3つのトピックで見つかるため、3回発生します。

これを予期していたなら、タグを有効にしたことを後悔します。フロントエンドに警告がなかった理由もわかりません。
フォーラムを再び稼働させたいので、削除したいだけです :cold_sweat:

「いいね!」 1

アプリは何度でも再構築できます。エラーが発生して中止されます。そのため、Rubyはアップグレードされません。
基本的に行き詰まっています。

「いいね!」 1

こんにちは。

次のような SELECT を試してみてはどうでしょうか。
SELECT * FROM tags WHERE name LIKE '%hws-connect%'

これにより、同じ名前のタグが複数見つかるはずです。私の場合はそれが問題でした。

「いいね!」 1

選択を実行しました。

質問ですが、「hws-connect」タグをDiscourseインフラストラクチャを破損させずにデータベースで名前変更することは可能でしょうか?
また、Postgres経由で名前を変更するにはどうすればよいですか?

OK、いくつか申し上げます。

  • (ほぼ)無料で利用できる、非常に役立つコミュニティに支えられた、数百万ドル相当のソフトウェアの独自のインストールを実行する際には、時折発生する不具合を受け入れる必要があります。
  • 最近、タグをかなり多用している2つのサイトを更新しましたが、問題はありませんでした。
  • 5年以上にわたり複数のDiscourseインスタンスを実行してきましたが、このような問題に遭遇したのは一度だけだと思います。

いずれにしても、これは次のような問題と非常によく似ています。解決策として同様の戦略を使用できるかもしれません。

あなたはすでに正しい方向に向かっていたようです。それを最後までやり遂げるだけです…

「いいね!」 2

承知していますし、Discourseやアップグレード自体に対する不満ではありません。起こりうることですし、問題ありません。
ただ、Docker、Ruby、Postgres、Discourseなど、多くのトピックと格闘しなければならない行き詰まった状況に陥りたくないだけです。私の日常業務ではなく、時間投資が必要です。

リンクをありがとうございます!
状況を更新します。

「いいね!」 1

更新:@merefieldさんのトピックから最も参考になったのは以下の点です

勇気を出してやるべきだと思います

:smiley:
データベースの操作は私にとって常に怖いものですが、この場合はうまくいきました。

同じ問題(タグの重複 / index_tags_on_name)を抱えている方へ:

  1. 指を鳴らして、インセプションフェーズ1を開始します。
    cd /var/discourse
    sudo ./launcher enter app

これは、「dockerコンテナが実行されていません」などのエラーで失敗した場合、以下を入力します。
sudo docker ps -a --no-trunc
これにより、利用可能なDockerコンテナとそのIDが一覧表示されます。それを使ってコンテナを再起動します。
sudo docker restart <container ID>
その後、sudo ./launcher enter app が機能するはずです。

  1. PostgreSQLデータベースにアクセスし、インセプションフェーズ2を開始します。
    su discourse
    psql
    再構築のエラーログには、原因となったタグ名が表示されているはずです。私の場合は以下のようでした。
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL:  Key (name)=(hws-connect) already exists.

まず、タグを検索します。

select * from tags where name='hws-connect';

これにより、上記の私の投稿で表示されているテーブルが表示されます。

  1. UPDATE tags SET name = 'hws-connect1' WHERE name='hws-connect'; を使用して、hws-connectタグをhws-connect1にリネームしました。

  2. いくつかのキックバックでインセプションから離脱します。
    \\q でPostgreSQLを終了します。
    exit でDockerコンテナを終了します。

  3. sudo ./launcher rebuild app で再構築を再度実行します。

  4. うまくいったことを喜び、フロントエンドで実行したことを確認します。
    タグページにアクセスします。https://your-forum/tags

これがどのように発生したのか、なぜこのアップグレードがこれほど失敗したのかは全く分かりません。以前のアップグレードはすべて、Webまたはターミナル経由でうまくいっていました。
今からタグを整理します。

ボーナス:

  1. リネームしたタグをクリックします。
  2. すべてのトピックから削除します。私の場合は3つでした。
  3. タグページに戻り、右上にある機能を使用します。

すべて完了です。:v:
皆さん、助けてくれてありがとう。

「いいね!」 10

よくやった!素晴らしい仕事だ!

「いいね!」 1

素晴らしい説明(そして実証された勇気)をありがとうございます!

私のフォーラムでもタグを使用しています。ここでもたくさんのタグを使用しています。
https://meta.discourse.org/tags

明らかに、重複するキー値を作成するまれで不幸なことが起こり得ます。

「いいね!」 3

私もこれに悩まされています。手動での修正方法を共有していただきありがとうございます。それを使って、約20個の重複を修正しました。

私のフォーラムでは、あらゆる大文字小文字の組み合わせで多くのタグが使用されていましたが、アップグレードまでは問題ありませんでした。大文字小文字を区別せずに重複エントリを作成するバグがあったようです。

  id   |          name          |         created_at
-------+------------------------+----------------------------
   707 | ParkRide               | 2019-05-21 21:36:53.213993
 18982 | ParkRide               | 2020-06-05 18:43:09.409895

(はい、これらの間には空白の違いがあります)

最後に残った重複が1つあり、修正できません。

discourse=> select name from tags group by name having count(*) > 1;
    name
------------
 Bike--Ride
(1 row)

discourse=> UPDATE tags SET name = 'Bike--Ride_2' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(Bike--Ride_2) already exists.
discourse=> UPDATE tags SET name = 'Bike--Ride_3' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(Bike--Ride_3) already exists.
discourse=> UPDATE tags SET name = 'something is broken here' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(something is broken here) already exists.

アップグレードは次のようなエラーで失敗します。

2023-02-01 18:56:58.610 UTC [475] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-02-01 18:56:58.610 UTC [475] discourse@discourse DETAIL:  Key (name)=(Bike--Ride) already exists.

この回避策について何かアイデアはありますか?

ありがとうございます。アップグレードの助けになりました!

「いいね!」 1

同じエラーが発生しました。新しいタグ名を指定しても、すでに存在すると報告されました。名前列ではなくIDを使用してタグを更新することで回避しました。

UPDATE tags SET name = 'tag1' WHERE id = 1234

「いいね!」 1