警告! データベースが非常に大きい場合、追加のディスク容量(データベースサイズの 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
手動アップデート / スペース制約環境
試す前に必ず POSTGRES_DATA をバックアップしてください
スペース制約環境で追加の容量を取得できない場合は、以下の手順を試すことができます。
./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
これは、前回のアップグレードからのファイルがまだ残っていることを意味します。続行する前に、それらを別の場所に移動してください。