緊急、ビルドのアップグレードでUniqueViolationが発生

Discourse のアップグレードを試みたところ、以下のメッセージが表示されました。

I, [2021-01-21T18:39:25.045454 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
2021-01-21 18:39:32.724 UTC [4051] discourse@discourse LOG:  duration: 336.116 ms  statement: UPDATE users
	SET locale = 'en_GB'
	WHERE locale = 'en'
	
2021-01-21 18:39:33.373 UTC [4051] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_users_on_username_lower"
2021-01-21 18:39:33.373 UTC [4051] discourse@discourse DETAIL:  Key (username_lower)=(xyz123) already exists.
2021-01-21 18:39:33.373 UTC [4051] discourse@discourse STATEMENT:  UPDATE users
	SET locale = 'en'
	WHERE locale = 'en_US'
	
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

./launcher enter appsu postgres -c 'psql discourse' を実行してみましたが、以下のエラーが表示されました。

psql: error: could not connect to server: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?

@merefield 何かご存知でしょうか?ありがとうございます!

こんにちは。

アップグレードに失敗すると、コンテナは停止したままになります。(ブラウザでサイトへの接続を試みると、そのことが確認できます)

つまり、最新の動作するコンテナ(アップグレード前)が単に起動していない可能性があります。

./launcher start app を実行してコンテナを起動し、コンテナ内に進入して DB CLI に接続してみてください。

ありがとうございます、コンテナを再起動しました。何か考えられますか?./launcher enter app を試しましたが、他に試せることはありますか?

\u003e ubuntu@:/var/discourse$ ./launcher start app
\u003e WARNING: Docker version 17.05.0-ce deprecated …
\u003e Nothing to do, your container has already started!

コンテナのエンター時にエラーが発生しましたか?

エラーはありませんが、./launcher logs appを実行した際に以下の出力が得られました。

ok: run: redis: (pid 47) 918s
timeout: down: postgres: 1s, normally up, want up
ok: run: redis: (pid 47) 925s
timeout: down: postgres: 0s, normally up, want up
ok: run: redis: (pid 47) 933s
ok: run: postgres: (pid 1855) 0s
supervisor pid: 1847 unicorn pid: 1857
config/unicorn_launcher: line 71: kill: (1857) - No such process
config/unicorn_launcher: line 15: kill: (1857) - No such process
(1847) exiting
ok: run: redis: (pid 47) 938s
timeout: down: postgres: 0s, normally up, want up
ok: run: redis: (pid 47) 945s

ps -ef | grep postgres の結果はどうなっていますか?

root 38 35 0 19:09 ? 00:00:00 runsv postgres
root 46 38 0 19:09 ? 00:00:00 svlogd /var/log/postgres
root 2573 2571 0 19:31 ? 00:00:00 sv start postgres
root 2575 2497 0 19:31 ? 00:00:00 grep postgres

コンテナ内で実行すべきですか、それとも Linux ボックス上で直接実行すべきですか?

内部です。実行されていないようです。

Postgres ユーザーとして手動で再起動する必要があると思われます。

再起動するクイックコマンドをご存知ですか?

以下の方法を試してみてください:

su - postgres /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main - この 13 をお使いの現在のバージョンに置き換えてください。

これは正常にインストールされたプロセスで推奨されるコマンドです。

ただし、私はこれをテストしていないため、保証はいたしかねます。

いいえ、これはやめておいてください。詳細は後ほどご覧ください。

ありがとうございます。バージョン 12 を使用していますが、以下のエラーが発生しました。

su: 無効なオプション – ‘D’
詳細については ‘su --help’ をお試しください。

-D は有効なスイッチです。

コードスニペットの外側にハイフンが含まれていないか確認してください。

余談ですが、バージョン 13 へのアップグレード処理が失敗した可能性があります。

その場合、以下のトピックをご覧になり、必要に応じて投稿してみてください:PostgreSQL 13 update

ええ、まだバージョン 12 です。

すみません、どうやらこれはより高レベルのプロセスによってラップされ、管理されているようです。

私が実行しているプロセスをキルしても、自動的に再起動してしまいます。

root で以下を試してみてください:sv start postgres

Docker コンテナ内で実行することを意味していますか?ありがとうございます。

はい、そのサービスが実行されている場所です。

さらに、以下を実行してください:sv restart postgres

その後、確認します:

tail /var/log/postgres/current

正常な状態では、以下のような表示がどこかに現れます:

2021-01-21 20:21:10.284 UTC [575368] LOG: database system is ready to accept connections

エラーログは以下の通りです -

root@ip--app:/var/www/discourse# cat /var/log/postgresql/postgresql-12-main.log
2021-01-21 18:12:04.965 UTC [623] FATAL:  database files are incompatible with server
2021-01-21 18:12:04.965 UTC [623] DETAIL:  The data directory was initialized by PostgreSQL version 13, which is not compatible with this version 12.3 (Debian 12.3-1.pgdg100+1).
pg_ctl: could not start server
Examine the log output.

ログ出力を確認してください。