PostgreSQL 12 のアップデート

:warning: 警告! データベースが非常に大きい場合、追加のディスク容量(データベースサイズの 2 倍)が必要となり、このアップグレードには細心の注意を払う必要があります!

長年待ち望んだ PostgreSQL のメジャーバージョンアップグレードがようやく実装されました。コマンドラインから Discourse を再構築するすべてのサイト管理者は、古い PostgreSQL 10 から PostgreSQL 12 にアップグレードされます。

この新バージョンは Meta サイトでしばらくの間実行されており、すべて正常に動作しています。PostgreSQL 12 には多くの改善が盛り込まれており、Discourse によって自動的に活用されます。

アップデート方法

公式インストールガイド(シングルコンテナ)

次の再構築時に、最後に以下のメッセージが表示されます。

Upgrade Complete
----------------

To complete the upgrade, rebuild again using:

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

これはアップグレードが正常に完了したことを意味します。サイトを復元して稼働させるには、新しい再構築を実行するだけです。

データコンテナインストール

discourse_docker リポジトリで提供されているサンプルに基づき、専用データコンテナを使用している場合は、PostgreSQL を安全かつクリーンにシャットダウンしていることを確認してください。

現在では、数分にわたるクエリを実行するバックグラウンドジョブが実行されているため、Web コンテナをシャットダウンすると、データコンテナも安全にシャットダウンされます。

./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only

データコンテナに対して最初の再構築を実行する前に、PostgreSQL ログを tail して、正しくシャットダウンされたか確認できます。

クリーンにシャットダウンされた場合、tail -f shared/data/log/var-log/postgres/current を実行すると、以下のようなログが表示されます。

2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

手動アップデート / スペース制約環境

:warning::warning::warning:
試す前に必ず POSTGRES_DATA をバックアップしてください
:warning::warning::warning:

スペース制約環境で追加の容量を取得できない場合は、以下の手順を試すことができます。

./launcher stop app #(または、その場合は web_only と data の両方)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/10/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/12/data \
	tianon/postgres-upgrade:10-to-12
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
./launcher rebuild app #(または、その場合はまず data、次に web_only)

私のテストでは、この手順には現在のデータベースサイズ未満の空き容量しか必要ありません。

アップデートの延期

次の再構築時にアップデートを延期する必要がある場合は、app.yml ファイル内の PostgreSQL テンプレートを "templates/postgres.template.yml" から "templates/postgres.10.template.yml" に変更することで交換できます。

これは推奨されません。一部のサイト管理者が後で変更を元に戻すのを忘れる可能性があるためです。

アップデート後のオプションタスク

PostgreSQL 統計情報の最適化

アップデート後、新しい PostgreSQL にはテーブル統計情報が存在しません。以下を使用して生成できます。

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
VACUUM VERBOSE ANALYZE;
\q
exit
exit

または、上記の 1 行バージョン:

/var/discourse/launcher run app "echo 'vacuum verbose analyze;' | su postgres -c 'psql discourse'"

古いデータの削除

標準インストールの場合、以下のコマンドで PG10 形式の古いデータを削除できます。

cd /var/discourse
./launcher cleanup

別個のデータコンテナを使用している場合は、以下のようにバックアップコピーを削除する必要があります。

rm -fr /var/discourse/shared/data/postgres_data_old/

よくある質問 (FAQ)

ソースクラスタがクリーンにシャットダウンされなかった場合

上記のメッセージでアップグレードに失敗した場合は、より簡単なアプローチでより良い状態に戻すことができます。

./launcher start app で古いコンテナを再起動します。再起動するまで数分待ちます。

次に ./launcher stop app で再度シャットダウンします。その後、ログを tail してクリーンにシャットダウンされたか確認します。

tail -f shared/data/log/var-log/postgres/current
2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

ログが上記のようであれば、./launcher rebuild app を使用して再度アップグレードを試すことができます。

データベース “postgres” の lc_collate 値が一致しない

このエラーは、データベースにデフォルト以外のロケールを使用している場合に発生します。成功するには 3 つの変数が必要であることが報告されています。app.yml ファイルの env: セクションに以下の 3 行が含まれていることを確認してください。

  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

en_US.UTF-8 をお使いのロケールに変更してください。

再構築ごとにアップグレードが繰り返される(アップグレードループ)

この場合、アップグレードログには以下が含まれます。

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty

これは、前回のアップグレードからのファイルがまだ残っていることを意味します。続行する前に、それらを別の場所に移動してください。

「いいね!」 68
Update failed (postgresql)
Trouble with latest update
Discourse Update Probs. Help please
Cant backup because of version mismatch on aws
User profile page and other features page not available
Error after Upgrading
SAML error after upgrade
Updated to latest version: ./analyze_new_cluster.sh message
Discourse 2.5.0.beta5 Release Notes
Problem with upgrading the latest version
UPGRADE OF POSTGRES FAILED - I've tried everything
Trouble with postgre(maybe)
Postgres upgrade success loop due to prior postgres 8 to 10 migration
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
Failed upgrade from 2.5.0beta4 to 2.5.0beta5
Corrupt indexes in PG12, how do I fix?
PostgreSQL 13 update
Fixing discourse after disk full
LDAP Auth Missing from Plugins
Today error when upgrade from 2.5.1 to 2.5.2, discourse-assign
Discourse for Teams (Alpha Testing summer 2020)
Issue Rebuilding App Failing on Postgres Upgrade
How hard is it to handle Discourse after installation
Primary Postgres database process (postmaster) eating all CPU
Discourse failing to connect to port 3000
Upgrade of postgres failed
Search 502 errors in 2.5.0.beta6
2.6.0 beta 3 update failed on disk and/or memory space
How to backup and restore a whole /var/discourse app folder?
PostgreSQL update wrecked my forum. Please help!
Instead of auto-deleting old replies, make them auto-hide?
Add print CSS for front page and category page?
Site down after failed update: permission denied to create extension "unaccent"
Migrate quickly to separate web and data containers
Rebuild failed - FAILED TO BOOTSTRAP
Old Postgres on Docker Image with two containers: web and data
Can't rebuild due to failed postgres 12 upgrade
Should I also rebuild my data container when upgrading
Old Postgres on Docker Image with two containers: web and data
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
UPGRADE OF POSTGRES FAILED - I've tried everything
PostgreSQL 15 update
Help! Problem with firewall/permissions and postgre?
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
Problem with upgrading the latest version
Restore failed at "EXCEPTION: x of y uploads are not migrated to S3. S3 migration failed for db 'default'."
Trouble with latest update
Can't upgrade due to old docker version
Database migration chokes on huge value of a "calendar-details" item in table "post_custom_fields"
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade