DBAtlas · データベース運用アトラス

PostgreSQL マイナー・バージョンの更新(パッチ)

PostgreSQLレベル: 中級所要時間: 20–60 分

同じメジャー・バージョン内でのマイナー・アップデート(例: 17.4 → 17.x)の手順です。リリースノートの確認、バックアップ、ロールバック用に現在の RPM/deb パッケージを保存する作業を含みます。単一サーバーでは短時間の停止で行います。ストリーミング・レプリケーション構成のクラスタでは、まずスタンバイを更新し、その後 switchover によりプライマリを更新します(rolling)。Patroni クラスタでは、replica を patronictl restart で、leader を patronictl switchover の後に更新します。拡張機能の更新、確認、ロールバック(ダウングレード)の runbook も含まれます。完了時にはすべてのサーバーが同じ新しいマイナー・バージョンで稼働し、ロールバック用に旧バージョンのファイルが手元に残ります。

メジャー・バージョンが変わる場合(例: 16 → 17)は、このガイドではなく pg-major-upgrade を使ってください。Patroni ソフトウェア自体の更新は pg-patroni で扱います。

構成: サーバー 1 台、プライマリ + スタンバイ、または Patroni クラスタ

シナリオ

  • マイナー・アップデート — 同じメジャー・バージョン内で新しいマイナー・バージョンに移行します(例: 17.4 → 17.6)。セキュリティ修正とバグ修正です。単一サーバーでは短時間の停止、クラスタでは rolling で行います。
  • ロールバック: 以前のマイナー・バージョンに戻す(ダウングレード) — 新しいマイナー・バージョンで不具合やリグレッションが見つかった場合、保存しておいた旧バージョンの RPM/deb で元に戻します。データ・ディレクトリは変わりません。

開始前の確認

  • PostgreSQL … が PGDG リポジトリからインストールされ、稼働しています(pg-install)。更新は同じメジャー・バージョン内で行います。… → 別のメジャー・バージョンへの移行には pg-major-upgrade ガイドを使ってください。
  • 現在のバージョンから目標バージョンまでのすべてのマイナー・バージョンのリリースノートを読みました。特に「Migration to Version …」セクションで追加作業(REINDEX、設定変更)が求められていないかを記録しました: https://www.postgresql.org/docs/release/
  • サーバーが PGDG リポジトリまたは社内ミラーに到達でき、ミラーは最新です。
  • メンテナンス・ウィンドウが承認されています…(サービスは数秒~数分停止します)…(switchover / restart の瞬間に接続が数秒切断されます)…。アプリケーション・チームに周知済みです。
  • 直近のバックアップが成功しており…(pgbackrest info の status が ok)…、サーバーの VM / ディスクのスナップショットを取得できます。
  • すべてのスタンバイが streaming 状態で、遅延がありません。
  • switchover 後にロールが入れ替わるため、各ノードの pg_hba.conf が他のノードからの replication 接続を許可しており、… のパスワードがすべてのノードで postgres ユーザーの ~/.pgpass ファイルにあります。
  • クラスタは Patroni や repmgr などの HA ツールで管理されていません。Patroni が管理している場合はトポロジで Patroni を選択してください。repmgr については注記を参照してください。この手順の手動 switchover は HA ツールの判断と競合します。
  • Patroni クラスタが正常です: Leader が 1 つ、すべての replica が streaming、Lag が小さく、Maintenance mode はオフです。… が現在の leader で、replica の名前は Patroni のメンバー名と一致しています。
  • 変更を伴う patronictl コマンド(restart、switchover)には REST API の認証が必要です。ユーザー / パスワードはすべてのノードの /etc/patroni/patroni.env ファイルにあります(pg-patroni でのインストール)。別の構成を使っている場合は、patronictl が -c で読み込むファイルに restapi.authentication が定義されている必要があります。
  • 更新前に、旧バージョンの RPM/deb ファイルを … ディレクトリに保存し、旧バージョン番号を …/prev-version.txt に記録しています。保存していない場合は、旧バージョンをリポジトリからダウンロードする必要があります(EL: PGDG は古いバージョンも保持、Debian/Ubuntu: apt-archive.postgresql.org)。

ガイドのフェーズ

  • 事前確認 — 現在のバージョンを記録する · リポジトリのバージョンを一覧表示する · リリースノートを確認する · インストール済みの拡張機能を一覧表示する · 長時間のトランザクションと準備済みトランザクションを確認する
  • バックアップと切り戻しポイント — バックアップを取得する(pgBackRest) · バックアップを取得する(pg_dumpall + スナップショット) · 現在の RPM/deb ファイルを保存する
  • Patroni クラスタ: 事前確認 — クラスタの状態とロールを確認する
  • 更新 — チェックポイントを実行する · PostgreSQL を停止する · ソフトウェアを更新する · PostgreSQL を起動する
  • プライマリの更新(短時間の停止) — チェックポイントを実行する · プライマリを停止する · ソフトウェアを更新する · プライマリを起動する
  • switchover と旧プライマリの更新 — レプリケーションが最新であることを確認する · アプリケーションの書込みを停止する · 旧プライマリをクリーンにシャットダウンし、最後のチェックポイントを記録する · …: WAL がすべて届いたことを確認して昇格させる · アプリケーションを新しいプライマリに向ける · 旧プライマリ用のレプリケーション・スロットを作成する …
  • Leader: switchover と旧 leader の更新 — 旧 leader: ソフトウェアを更新する · switchover: … を leader にする · 旧 leader(…)を再起動する · クラスタの最終状態を確認する
  • 拡張機能と確認 — 拡張機能を更新する(ALTER EXTENSION … UPDATE) · 拡張機能を更新する(ALTER EXTENSION … UPDATE) · リリースノートの追加作業を実施する · バージョンと状態を確認する · ログでエラーを検索する · 更新後のバックアップ …
  • ロールバック(ダウングレード) — 旧バージョンを確認する · …: 停止し、旧バージョンをインストールして起動する · …: 旧バージョンをインストールして Patroni で再起動する · Leader: 旧バージョンをインストールする · leader を引き継がせて旧 leader を再起動する · …プライマリを停止する…PostgreSQL を停止する… …
環境に合わせた手順プランを開く →