PostgreSQL 15のアップデート

アップグレード中に、以下のようなエラーが発生しました。

PostgreSQL 15 データベースサーバーを停止しています: mainエラー: 設定のオーナー (postgres:101) とデータのオーナー (runit-log:999) が一致せず、設定のオーナーが root ではありません… 失敗しました!
失敗しました!
バージョンファイル “/shared/postgres_data/PG_VERSION” を開けませんでした: 権限がありません
失敗、終了します

これは、以下によって解決されました。

sudo ./launcher enter app

そして

chown -R postgres:postgres /shared/postgres_data
chown -R postgres:postgres /shared/postgres_run
chmod -R 700 /shared/postgres_data

「いいね!」 3

無限ループに陥っています。データベースは正常に更新されましたが、./launcher rebuild app を実行するとループしてしまいます。見えるのは以下の情報だけです。

編集:このメッセージを見つけました…

mv: デバイス間で移動できません: '/shared/postgres_data_new' を '/shared/postgres_data/postgres_data_new' に移動できません。ターゲットを削除できません: ディレクトリが空ではありません

お使いのインストールには、ALTER EXTENSION コマンドで更新する必要がある拡張機能が含まれています。
    update_extensions.sql
ファイルをデータベースのスーパーユーザーが psql で実行すると、これらの拡張機能が更新されます。

アドバイスをお願いします。

アップグレード完了
----------------
オプティマイザ統計は pg_upgrade では転送されません。
新しいサーバーを起動したら、以下を実行することを検討してください。
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

このスクリプトを実行すると、古いクラスターのデータファイルが削除されます。
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
POSTGRES のアップグレード完了
古い 13 データベースは /shared/postgres_data_old に保存されています。
アップグレードを完了するには、以下を使用して再度再構築してください。

./launcher rebuild app
-------------------------------------------------------------------------------------

さて、問題はここにあるようです。

これらは shared/standalone/ にあり、すでに手動で移動されています…

mv: '/shared/postgres_data' を '/shared/postgres_data_old' に移動できません: デバイスまたはリソースがビジー状態です
mv: デバイス間で移動できません: '/shared/postgres_data_new' を '/shared/postgres_data/postgres_data_new' に移動できません。ターゲットを削除できません: ディレクトリが空ではありません
I, [2025-02-08T15:22:42.078189 #1]  INFO -- : ロケールを生成しています (これにはしばらく時間がかかる場合があります)...
「いいね!」 1

どの解決策も効果がないようです。とてもイライラします。

「いいね!」 1

まず尋ねられることなく、そのようなサービスを提供すると申し出るのは非常に珍しいことです。
誰かを雇いたい場合は、ここに行きましょう: Marketplace - Discourse Meta

「いいね!」 4

アップグレード後にマルチサイトインスタンスがダウンしました。次のように表示されました。

インストールには、ALTER EXTENSION コマンドで更新する必要がある拡張機能が含まれています。

update_extensions.sql

ファイルをデータベースのスーパーユーザーが psql で実行すると、これらの拡張機能が更新されます。

update_extensions.sql ファイルが見つかりません。どこにありますか?

「いいね!」 2

これを確認してください

mv: '/shared/postgres_data' を '/shared/postgres_data_old' に移動できません: デバイスまたはリソースがビジー状態です
mv: デバイス間の移動に失敗しました: '/shared/postgres_data_new' から '/shared/postgres_data/postgres_data_new' へ。ターゲットを削除できません: ディレクトリが空ではありません
I, [2025-02-08T15:22:42.078189 #1]  INFO -- : ロケールの生成中 (しばらく時間がかかる場合があります)...

それは私でした。解決が難しいと思われる状況にある人がいる場合、私は助けを提供します。

「いいね!」 4

好奇心からの質問です。

Postgresのような主要コンポーネントのアップグレードに関する標準や戦略はありますか?

Postgres 13のサポートは11/25までで、15は2027年まで続き、現在のバージョンは17です。

本当に学び、理解したいだけです。データベースのバージョンを変更することは、一般的に大きな問題であり、大変な作業です。

よろしくお願いします!

「いいね!」 1

私はPostgreSQL 10から使っています。通常は2つのリリースごとにアップグレードしますが、12から13に進んだのは、いくつかの改善があり早めに切り替える価値があったためです。彼らが16に進まなかったので少し驚きました。

通常、十分なディスクスペースと最新のDockerがあれば、かなりスムーズに進みます。

「いいね!」 3

修正があるまで13テンプレートに戻しました。ありがとうございます。

PostgreSQL 13 から 15 へのアップグレードに関する問題を解決しました。失敗したアップグレードをバックアップからサーバーに復元した後、PostgreSQL en_GB.UTF-8 ロケールで以下の手順が機能しました。

sudo -i
su - discourse
cd /var/discourse
git stash
git stash drop
git pull
./launcher stop app
docker run --rm \
    --entrypoint=/bin/bash \
    -e LANG='en_GB.UTF-8' \
    -v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
    -v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
    tianon/postgres-upgrade:13-to-15 \
    -c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
    apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
    docker-upgrade'
exit
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
chown -R 101:104 /var/discourse/shared/standalone/postgres_data
su - discourse
cd /var/discourse
docker run --rm -v /var/discourse/shared/standalone:/shared \
local_discourse/app chown -R postgres:postgres /shared/postgres_data
./launcher rebuild app

PostgreSQL の LANG に対する過去のローカル変更を git stash; git stash drop で削除する必要があり、PostgreSQL データディレクトリの移動は root として実行し、chown が必要でした。

「いいね!」 5

今回 git pull は必要ですか? 通常は不要ですが。

「いいね!」 1

今日では、リビルドがそれを行うため、決して必要ありません。

「いいね!」 3

最初のエラーからの末尾のメッセージ Device or resource busy は、他の何かがその postgres_data ディレクトリのロックを保持しているため、移動できないことを示唆しています。

それがデータベースディレクトリであるため、postgres_data がマウントポイントである可能性が高いです。2番目の mv コマンドで inter-device move failed が表示され、shared/postgres_data_newshared/postgres_data が異なるディスク/パーティション上にあることを示唆しているため、これはさらに可能性が高くなります。

postgres_data がマウントポイントであることを確認した場合は、手動で postgres_data 内のすべてのファイルを別のバックアップディレクトリに移動し、その後、postgres_data_new 内のすべてのファイルを(空になった)postgres_data ディレクトリに移動する必要があります。両方の移動は、最初の再構築が UPGRADE OF POSTGRES COMPLETE で完了した後、2番目の再構築を発行する前に行う必要があります。

postgres_data がマウントポイントでない場合は、lsof が役に立ちます。それを使用して、ロックの原因を特定してみてください。

もちろん、最初に必要なバックアップを取ってください。

「いいね!」 3

完璧です、ありがとうございます。

ファイルは次のフォルダにありました。

/var/postgres_data_discoursepostgres_data_new として)

以下の手順で解決しました。

postgres_data_new/var に移動しました。
postgres_data_discoursepostgres_data_discourse_old にリネームしました。
postgres_data_newpostgres_data_discourse にリネームしました。
./launcher rebuild app を発行しました。

改めてありがとうございました :+1:

「いいね!」 5

62gのdbがあります。最高のアップグレードを実行するために何をお勧めしますか?

62G /var/discourse/shared/standalone/postgres_data

「いいね!」 1

新しいVMに移行し、新しいDiscourseを起動し、データベースを空にして(ゼロダウンタイムの切り替えをご希望の場合は、sslとletsencryptのディレクトリをコピーしてください)、現在のデータベースを新しいサーバーに復元することを推奨します。これにより、ゼロダウンタイムでアップグレードを実行でき、問題が発生するリスクもゼロになります。

いずれにしても、OSのアップグレードもそろそろ時期かもしれません。

「いいね!」 2

それは良い考えですね。

3.4.0.beta4-dev バックアップを ### 最新バージョンの新規インストールに移動できますか?

「いいね!」 1

古いバージョンのDiscourseを新しいバージョンに復元できるかどうか尋ねているのであれば、その答えはイエスです。

「いいね!」 4