インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

PostgreSQL 18 のマイナーバージョンアップ実務:安全な更新と切り戻し

公開
現場で迷わない PostgreSQL 18 構築・運用ガイド 第7回 アイキャッチ:マイナーバージョンアップ安全実践



データベースを本番運用する上で、セキュリティ脆弱性(CVE)への対処や予期せぬクラッシュを引き起こすバグの解消は避けて通れない重要責務です。PostgreSQLグローバル開発グループ(PGDG)からは、約3ヶ月に1回のペースで定期的な「マイナーアップデート」がリリースされます。しかし、「メジャーバージョンアップと何が違うのか」「どのような手順で安全に更新すべきか」「万一起動しなくなったときにどう切り戻すか」という実務基準が確立されていない現場は少なくありません。

マイナーバージョンアップは、データ移行作業が一切不要であり、実行ファイルの置換と再起動のみで完結する安全性の高い作業です。しかし、事前のバックアップを怠ったり、OS全体の自動アップデートによって予期せぬタイミングで更新されてしまうと、不要な障害を招きます。本稿では、マイナーバージョンの互換性の仕組み、AppStream版とPGDG版でのパッケージ管理の挙動差、安全な7ステップ作業標準、および万一のダウングレード切り戻し手順を整理します。

本記事の到達目標

  • PostgreSQLのバージョニング規則(メジャー.マイナー)と、マイナー更新時にデータ移行(pg_upgrade)が不要な技術的理由を説明できる。
  • OS公式のAppStream版とコミュニティ公式のPGDG版におけるパッケージアップデート挙動の違いを理解できる。
  • 事前バックアップ採取から計画停止、dnf update、起動確認に至る7ステップ標準作業手順を実行できる。
  • 万一の不具合発生時に、dnf downgradeによるパッケージ切り戻しやバックアップリストアの判断ができる。
  • dnf-plugins-core(versionlock)を用いて意図しない自動更新を抑止できる。

検証環境情報

  • ホストOS:AlmaLinux 10.2 (Lavender Lion) x86_64
  • DBサーバーノード:alma-db01 (IP: 192.168.2.132 / PostgreSQL 18 PGDG)
  • 検証対象バージョン:PostgreSQL 18.4 から 18.6 へのマイナーアップデート
目次
  1. 1. PostgreSQLのバージョニング規則とマイナー更新の本質
    1. 1.1 バージョン番号の読み方
    2. 1.2 なぜマイナーアップデートはデータ移行が不要なのか
    3. 1.3 計画停止枠(ダウンタイム)の短さ
  2. 2. パッケージリポジトリ別の更新挙動:AppStream vs PGDG
    1. 2.1 AppStream版:OS標準アップデートに巻き込まれるリスク
    2. 2.2 PGDG版:バージョン明示的な安全更新設計
    3. 2.3 リリースノート確認の重要ポイント
    4. 2.4 レプリケーション環境におけるマイナーバージョン混在互換性
    5. 2.5 マイナーアップデートで修正される主要な不具合類型
  3. 3. 実務標準:マイナーバージョンアップの7ステップ作業手順
    1. 3.1 接続セッションの安全なドレイン(Drain)と切断フロー
    2. 3.2 計画停止時のメンテナンス画面ルーティング設計
  4. 4. 【実機検証】AlmaLinux 10でのアップデート実践と切り戻しテスト
    1. 4.1 アップデート前の初期状態確認
    2. 4.2 計画停止から dnf update によるバージョンアップ実行
    3. 4.3 起動後のバージョン確認と既存データの完全保全確認
    4. 4.4 万一の不具合発生時:dnf downgrade による切り戻し検証
    5. 4.5 切り戻しにおけるデータ整合性の注意点
    6. 4.6 リリースノート特定指示に基づく REINDEX 実機検証
  5. 5. 実務チートシート:意図せぬ自動更新を防ぐ versionlock 設定
  6. 6. 実務トラブルシューティング事例集(3大障害シナリオと解決策)
    1. 6.1 事例1:dnf update 実行時のパッケージ依存関係エラー
    2. 6.2 事例2:拡張モジュール(Extension)の関数ロードエラー
    3. 6.3 事例3:ダウングレード切り戻しにおける後退リスクと安全原則
    4. 6.4 事例4:pg_stat_statements 実行統計リセットの運用判断
  7. 7. 実務チートシート:マイナーバージョンアップ計画・点検チェックリスト
    1. 7.1 実務作業手順書の標準タイムテーブル設計例
  8. 8. 理解度確認演習問題(全3問・解答解説付き)
  9. 9. まとめと次回予告

1. PostgreSQLのバージョニング規則とマイナー更新の本質

1.1 バージョン番号の読み方

PostgreSQLのバージョン番号は、バージョン10以降、「メジャー.マイナー」という2桁のシンプルな体系に統一されています。

  • メジャーバージョン(第1数値):161718 などの数値を指します。年に1回(通常秋頃)リリースされ、新機能の追加、内部アーキテクチャの刷新、パフォーマンスの向上、および後方互換性の変更が含まれます。
  • マイナーバージョン(第2数値):18.118.418.6 などの末尾の数値を指します。数ヶ月ごとにリリースされ、セキュリティ脆弱性の修正や深刻な不具合のバグ修正のみが含まれます。新機能の追加は原則として行われません。
マイナー vs メジャーアップデートの本質的相違とデータ互換性(バイナリ置換 vs pg_upgradeデータ移行)
図1: マイナー vs メジャーアップデートの本質的相違とデータ互換性

1.2 なぜマイナーアップデートはデータ移行が不要なのか

メジャーバージョンアップ(第8回で後述)では、データディレクトリ($PGDATA)の内部構造やシステムカタログ定義、データ型OIDの配置が変更されるため、古いクラスタのデータファイルを新バージョンのバイナリで直接読み込むことはできません。そのため、pg_upgradeコマンドやダンプ/リストアによる大掛かりなデータ移行が必要となります。

対照的に、同一メジャー系列内におけるマイナーアップデート(例: 18.4 から 18.6)では、ディスク上のデータブロック形式(内部レイアウト)が100%完全同一に保たれることが公式に保証されています。データベースエンジンを停止させ、実行ファイル(バイナリ)を新しいバージョンに置き換えて再起動するだけで、既存のデータディレクトリをそのまま何事もなかったかのように読み込んで処理を継続できます。

1.3 計画停止枠(ダウンタイム)の短さ

データ変換のオーバーヘッドが一切発生しないため、シングル構成におけるマイナーアップデートの所要時間は「サービスの停止 + パッケージの置換 + サービスの起動」に要する時間のみです。一般的な環境であれば、わずか1〜2分程度の計画停止枠で作業を完了できます。

2. パッケージリポジトリ別の更新挙動:AppStream vs PGDG

第2回で解説したリポジトリの選定方針は、バージョンアップ作業の運用性にも直接影響を与えます。

2.1 AppStream版:OS標準アップデートに巻き込まれるリスク

AlmaLinuxのOS標準リポジトリ(AppStream)から導入した場合、パッケージ名はpostgresql-serverという汎用的な名称になります。

# AppStream版のアップデート
$ sudo dnf update postgresql-server

注意すべきリスクは、インフラ管理者がOSの定期セキュリティパッチ適用としてsudo dnf updateを全体実行した際、PostgreSQLのパッケージも自動的に巻き込まれて更新されてしまう点です。意図しないタイミングでデータベースが再起動されたり、仕様変更が適用されるのを防ぐため、本番環境では更新対象から除外する運用(versionlock)が推奨されます。

2.2 PGDG版:バージョン明示的な安全更新設計

PostgreSQL公式コミュニティが提供するPGDGリポジトリでは、メジャーバージョンごとにパッケージ名が完全に分離されています(例: postgresql18-server)。

# PGDG版のアップデート(18系マイナーのみが対象)
$ sudo dnf update postgresql18-server

この設計により、意図せずメジャーバージョンが上がってしまう危険性が構造的に排除されています。また、リポジトリ内には過去のマイナーバージョン(18.0, 18.1, 18.4等)のRPMパッケージもアーカイブとして保持されているため、特定バージョンへの固定やダウングレードを柔軟に行えます。

2.3 リリースノート確認の重要ポイント

マイナーアップデートは互換性が重視されているとはいえ、適用前には必ず公式リリースノート(Release Notes)を確認し、変更内容を確実に把握してください。特に注意すべき項目は以下の2点です。

  • CVE識別番号と重要度:自社環境が抱える脆弱性の深刻度(CVSSスコア)を評価し、緊急適用すべきか定期保守で対応すべきかを判断します。
  • REINDEX指示の有無:稀に「B-Treeインデックスの破損につながるバグ修正」が含まれる場合があり、その際はリリースノートに「バージョンアップ後にREINDEX TABLEまたはREINDEX DATABASEを実行してください」という特記事項が明記されます。この指示を見落とすと、インデックス不整合による検索漏れを引き起こす恐れがあります。

2.4 レプリケーション環境におけるマイナーバージョン混在互換性

将来的なクラスタ冗長化(第09回参照)を見据えた場合、マイナーバージョンアップにおけるレプリケーション互換性ルールを正しく理解しておく必要があります。

PostgreSQLの公式仕様では、同一メジャーバージョン内であれば、異なるマイナーバージョンのノード間での物理ストリーミングレプリケーションが完全保証されています(例:Primaryが18.4でStandbyが18.6、あるいはその逆)。

ローリングアップデート時のバージョン更新順序原則

  • 原則:スタンバイ(Standby)を先行して更新する
    旧バージョンのPrimary(18.4)が生成したWALレコードは、新バージョンのStandby(18.6)で問題なくリプレイ(Replay)できます。したがって、まずスタンバイノードから安全にマイナー更新を実施し、動作を確認できます。
  • 非推奨:プライマリ(Primary)を先に更新しない
    新バージョンのPrimaryが稀に新形式のWAL内部レコードを生成した場合、旧バージョンのStandbyがそのWALを解釈できずレプリケーションが停止するリスクがあります。更新順序は必ず「Standby先行」を原則とします。

2.5 マイナーアップデートで修正される主要な不具合類型

「システムが安定稼働しているなら、あえてマイナーバージョンアップを行う必要はないのではないか」という疑問を持つエンジニアも少なくありません。しかし、PostgreSQLコミュニティが3ヶ月ごとにリリースするマイナーバージョンには、以下のような実務上無視できない重大な修正が含まれています。

マイナーリリースに含まれる3大修正領域

  • セキュリティ脆弱性(CVE)の修正:認証バイパス、権限昇格、バッファオーバーフローによるリモートコード実行など、外部攻撃に直結する脆弱性のパッチ。公表と同時に攻撃手法が研究されるため、CVSSスコアが高いものは即座に適用する必要があります。
  • データ破損(Data Corruption)防止:特定パターンの並行トランザクションやクラッシュリカバリ時に、WALレコードが不正に適用されてデータページが破損する潜在的バグの解消。
  • メモリリークおよびサーバークラッシュ(PANIC)の解消:複雑なプランナ最適化やJITコンパイル実行時にバックエンドプロセスが異常終了(SIGSEGV)する問題の修正。

3. 実務標準:マイナーバージョンアップの7ステップ作業手順

シングル構成のデータベースにおいて、人為的ミスや予期せぬトラブルを完全に防ぐための標準作業ワークフローを提示します。

安全なマイナーバージョンアップ実務フローと切り戻し判断基準
図2: 安全なマイナーバージョンアップ実務フローと切り戻し判断基準

3.1 接続セッションの安全なドレイン(Drain)と切断フロー

データベースサービスを停止(systemctl stop)する際、最も回避すべき事態は「更新トランザクションを実行中のセッションが強制中断され、未コミット処理がロールバックされる」ことです。安全にサービスを停止させるため、以下の事前ドレイン手順を実施します。

-- 1. 新規接続の受付を一時遮断(一般ユーザーの接続不可)
ALTER DATABASE production_db CONNECTION LIMIT 0;

-- 2. 現在実行中のアクティブセッション数を確認
SELECT count(*) FROM pg_stat_activity WHERE datname = 'production_db' AND pid <> pg_backend_pid();

-- 3. 残存しているセッションを安全に強制切断(管理者セッション以外)
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'production_db' AND pid <> pg_backend_pid();

接続が完全にゼロになったことを確認した上で systemctl stop を発行することで、クリーンなチェックポイントがディスクに書き込まれ、数秒での安全なプロセス停止が可能になります。

3.2 計画停止時のメンテナンス画面ルーティング設計

WebサービスやAPIを伴う本番システムでは、データベース停止中にエンドユーザーへ「DB接続エラー(HTTP 500)」画面が露出することは避けなければなりません。リバースプロキシ(Nginx / ALB)と連携し、計画停止中は「システムメンテナンス中(HTTP 503)」画面へ自動ルーティングする設計を組み込みます。

# Nginx におけるメンテナンス切替設定例
# /var/www/maintenance.flag が存在する場合は強制的に503を返却
if (-f /var/www/maintenance.flag) {
    return 503;
}
error_page 503 /maintenance.html;

作業開始時にフラグファイルを配置して503を返却させ、マイナー更新完了および動作確認が完了した後にフラグファイルを削除してサービスを再開する手順を策定します。

実行手順

  1. リリースノートを精読し、CVE修正内容とインデックス再構築指示の有無を確認します。
  2. ロール情報(pg_dumpall -g)および各DBのカスタムバックアップ(pg_dump -Fc)を採取します。
  3. Webアプリケーションやバッチ処理を停止し、接続を遮断します。
  4. PostgreSQLサービスを停止します(systemctl stop)。
  5. dnf updateを実行し、新マイナーパッケージを導入します。
  6. サービスを起動し、バージョン情報と接続性を照合します。
  7. アプリケーションを再開し、稼働ログにエラーがないことを確認します。

4. 【実機検証】AlmaLinux 10でのアップデート実践と切り戻しテスト

実機環境(alma-db01)を用いて、あえて旧バージョンであるPostgreSQL 18.4を初期構築した状態から、最新の18.6へのマイナーバージョンアップ、および万一のダウングレード切り戻しを検証します。

4.1 アップデート前の初期状態確認

データベースproduction_dbにテスト用テーブルapp_recordsを作成し、18.4環境で3件のデータを投入しておきます。

$ sudo -u postgres /usr/pgsql-18/bin/psql -c "SELECT version();"
                                                 version                                                  
----------------------------------------------------------------------------------------------------------
 PostgreSQL 18.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 14.3.1 20251022 (Red Hat 14.3.1-4), 64-bit

$ sudo -u postgres /usr/pgsql-18/bin/psql -d production_db -c "SELECT * FROM public.app_records;"
 id |        title        | created_version |          created_at           
----+---------------------+-----------------+-------------------------------
  1 | 運用マニュアル第1版 | 18.4            | 2026-09-09 20:51:53.221458+09
  2 | インフラ構成図      | 18.4            | 2026-09-09 20:51:53.221458+09
  3 | 監視アラート一覧    | 18.4            | 2026-09-09 20:51:53.221458+09
(3 行)

4.2 計画停止から dnf update によるバージョンアップ実行

第5回で解説した通り、万一の障害に備えて事前バックアップを採取した上で、サービスを停止してパッケージを更新します。

# 1. 事前バックアップ採取
$ sudo -u postgres /usr/pgsql-18/bin/pg_dumpall -g -f /var/lib/pgsql/globals_pre_upgrade.sql
$ sudo -u postgres /usr/pgsql-18/bin/pg_dump -Fc -v -d production_db -f /var/lib/pgsql/production_db_pre_upgrade.dump

# 2. サービス停止
$ sudo systemctl stop postgresql-18

# 3. パッケージ更新
$ sudo dnf -y update postgresql18-server

# 4. サービス起動
$ sudo systemctl start postgresql-18

4.3 起動後のバージョン確認と既存データの完全保全確認

サービス起動後、バージョン照合とデータの読み出しテストを実行します。

$ sudo -u postgres /usr/pgsql-18/bin/psql -c "SELECT version();"
                                                 version                                                  
----------------------------------------------------------------------------------------------------------
 PostgreSQL 18.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 14.3.1 20251022 (Red Hat 14.3.1-4), 64-bit
(1 行)

$ sudo -u postgres /usr/pgsql-18/bin/psql -d production_db -c "SELECT * FROM public.app_records;"
 id |        title        | created_version |          created_at           
----+---------------------+-----------------+-------------------------------
  1 | 運用マニュアル第1版 | 18.4            | 2026-09-09 20:51:53.221458+09
  2 | インフラ構成図      | 18.4            | 2026-09-09 20:51:53.221458+09
  3 | 監視アラート一覧    | 18.4            | 2026-09-09 20:51:53.221458+09
(3 行)

バージョン表記がPostgreSQL 18.6に更新されていること、および18.4稼働時に投入した3件のレコードが何の手間もなくそのまま整合性を保って参照できることが確認できました。

4.4 万一の不具合発生時:dnf downgrade による切り戻し検証

「新マイナーバージョンに起因する予期せぬ不具合がアプリ側で発覚した」という想定で、旧バージョン(18.4)への切り戻しを実施します。

# 1. サービス停止
$ sudo systemctl stop postgresql-18

# 2. パッケージのダウングレード
$ sudo dnf -y downgrade \
    postgresql18-server-18.4-2PGDG.rhel10.2 \
    postgresql18-18.4-2PGDG.rhel10.2 \
    postgresql18-libs-18.4-2PGDG.rhel10.2

# 3. サービス起動
$ sudo systemctl start postgresql-18

ダウングレード完了後の状態を確認します。

$ sudo -u postgres /usr/pgsql-18/bin/psql -c "SELECT version();"
                                                 version                                                  
----------------------------------------------------------------------------------------------------------
 PostgreSQL 18.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 14.3.1 20251022 (Red Hat 14.3.1-4), 64-bit
(1 行)

$ sudo -u postgres /usr/pgsql-18/bin/psql -d production_db -c "SELECT * FROM public.app_records;"
 id |        title        | created_version |          created_at           
----+---------------------+-----------------+-------------------------------
  1 | 運用マニュアル第1版 | 18.4            | 2026-09-09 20:51:53.221458+09
  2 | インフラ構成図      | 18.4            | 2026-09-09 20:51:53.221458+09
  3 | 監視アラート一覧    | 18.4            | 2026-09-09 20:51:53.221458+09
(3 行)

バイナリが旧マイナーバージョン(18.4)に安全に巻き戻され、正常稼働を回復できることが実証されました。

4.5 切り戻しにおけるデータ整合性の注意点

重要:ダウングレード時の潜在的リスク

上記の実機検証のように「起動直後でデータ更新が一切走っていない状態」であればdnf downgradeによるバイナリの巻き戻しは有効です。しかし、新バージョンで一定時間サービスが稼働し、データの更新やWALの書き込みが行われた後にダウングレードを実行することは推奨されません。新バージョン固有のバグ修正コードによって書き込まれたインデックスやデータブロックを旧バージョンのバイナリが正しく解釈できないリスクがあるためです。トラブル時の最も安全な復旧手段は、「仮想マシンのスナップショット復元」または「更新直前に採取した完全バックアップからのクリーンリストア」であることを銘記してください。

4.6 リリースノート特定指示に基づく REINDEX 実機検証

マイナーバージョンアップのリリースノートに「インデックス破損バグ修正に伴うREINDEX必須」の特記事項が記載されていたシナリオを想定し、新バージョン起動後のインデックス再構築手順を検証します。

通常の REINDEX TABLE は対象テーブルに対して ACCESS EXCLUSIVE ロックを取得するため、オンライン業務を完全にブロッキングしてしまいます。そこで、業務影響を排除するために CONCURRENTLY オプションを使用します。

-- 1. アプリケーション再開後、バックグラウンドで並行インデックス再構築を実行
$ sudo -u postgres /usr/pgsql-18/bin/psql -d production_db -c "
REINDEX TABLE CONCURRENTLY public.app_records;
"
REINDEX

-- 2. 再構築されたインデックスの健全性と有効性を確認
$ sudo -u postgres /usr/pgsql-18/bin/psql -d production_db -c "
SELECT indexrelname, indisvalid FROM pg_index i 
JOIN pg_stat_user_indexes u ON i.indexrelid = u.indexrelid 
WHERE u.relname = 'app_records';
"
   indexrelname    | indisvalid 
-------------------+------------
 app_records_pkey  | t
(1 行)

indisvalid = t(true)が確認でき、新しいマイナーバージョンの正しいB-Treeロジックに基づいてインデックスがオンラインで正常再構築されたことが実証されました。

5. 実務チートシート:意図せぬ自動更新を防ぐ versionlock 設定

OSのパッケージ自動更新機能(dnf-automaticなど)や管理者の誤操作によってPostgreSQLが勝手に更新される事故を防ぐため、特定のバージョンでパッケージを固定(ロック)する設定方法をまとめます。

# 1. versionlock プラグインのインストール
$ sudo dnf install -y python3-dnf-plugin-versionlock

# 2. 現在のPostgreSQL 18パッケージをロック
$ sudo dnf versionlock add "postgresql18*"

# 3. ロック一覧の確認
$ sudo dnf versionlock list
postgresql18-server-0:18.6-4PGDG.rhel10.2.*
postgresql18-0:18.6-4PGDG.rhel10.2.*
postgresql18-libs-0:18.6-4PGDG.rhel10.2.*

# 4. バージョンアップ作業時にロックを解除する場合
$ sudo dnf versionlock delete "postgresql18*"

本番サーバーでは上記のようにロックをかけておき、計画メンテナンスの作業手順内でのみロックを解除して更新する運用がエンタープライズの標準です。

6. 実務トラブルシューティング事例集(3大障害シナリオと解決策)

マイナーバージョンアップ作業において、現場のインフラエンジニアが直面しやすい典型的なトラブル3選と、その回避・対処手順を解説します。

6.1 事例1:dnf update 実行時のパッケージ依存関係エラー

マイナー更新を実行した際、リポジトリのメタデータ不整合やサードパーティパッケージの競合により、以下のような依存関係エラーが発生することがあります。

Error: 
 Problem: cannot install the best update candidate for package postgresql18-server-18.4-2PGDG.rhel10.x86_64
  - nothing provides postgresql18-libs(x86-64) = 18.6-4PGDG.rhel10 needed by postgresql18-server-18.6-4PGDG.rhel10.x86_64

原因と解決手順

  • 原因:postgresql18-server のみを更新指定し、共通ライブラリである postgresql18-libs やクライアントツール postgresql18 が旧バージョンのまま取り残された場合に発生します。
  • 解決策:関連パッケージを明示的に一括更新します(sudo dnf update postgresql18-server postgresql18 postgresql18-libs)。また、古いメタデータキャッシュが原因の場合は sudo dnf clean all を実行してから再試行します。

6.2 事例2:拡張モジュール(Extension)の関数ロードエラー

PostGISや pg_stat_statementspgaudit などのC言語で書かれた拡張モジュールを利用している場合、本体バイナリを更新した直後にクエリを実行すると incompatible libraryundefined symbol エラーが発生することがあります。

マイナー更新ではABI互換性が極力維持されますが、拡張機能側にもマイナーアップデート版のRPMが提供されている場合は、必ず本体と同時に拡張機能RPMも更新します。また、更新後にデータベース内で以下のSQLを実行し、拡張機能の定義を最新化します。

-- 拡張機能の定義カタログを新バイナリに合わせて更新
ALTER EXTENSION pg_stat_statements UPDATE;
ALTER EXTENSION pgaudit UPDATE;

6.3 事例3:ダウングレード切り戻しにおける後退リスクと安全原則

更新後に万一重大なアプリケーション不具合が発覚した場合、「安易にパッケージを dnf downgrade すれば安全に切り戻せる」と考えるのは本番運用において極めて危険です。

PostgreSQLのマイナーバージョン間ではディスクフォーマットおよびWAL形式の後方互換性が厳格に維持されていますが、新マイナーバージョン(例:18.6)で稼働してカタログ更新や拡張機能のアップデート、新パラメータの書き込みが行われたデータディレクトリに対して、古いバイナリ(例:18.4)を起動した場合、修正されたはずのデータ破損バグが再発したり、未定義の内部状態に陥る理論上のリスクを完全に排除できません。

【本番運用原則】切り戻しは「スナップショット復元」を絶対ルールとする

本番ミッションクリティカル環境における切り戻し手順は、バイナリのダウングレードではなく、「更新直前に取得した仮想マシンスナップショットへのロールバック」または「直前バックアップからのリストア」を唯一の正本として作業計画書に定義します。データディレクトリごと確実に更新前の状態へ巻き戻すことで、潜在的な不整合リスクを完全にゼロに抑えられます。

6.4 事例4:pg_stat_statements 実行統計リセットの運用判断

マイナーバージョンアップにおいてオプティマイザのバグ修正や性能改善が含まれていた場合、更新前と更新後でクエリの実行時間差分を正しく評価するために、蓄積されたクエリ統計情報をリセットするかどうかの判断が必要になります。

-- 1. 更新前の統計情報をログまたはテーブルへ退避
CREATE TABLE pre_upgrade_query_stats AS SELECT * FROM pg_stat_statements;

-- 2. 統計カウンタをゼロクリア
SELECT pg_stat_statements_reset();

過去の累計統計(call回数やmean_exec_time)が混ざったままだと、「新マイナーバージョン適用後にクエリ性能が向上したのか、あるいは新たなボトルネックが発生したのか」を正確に判別できません。本番サービス再開直前に統計をクリアし、新バージョン環境での初期数日間のクエリ傾向をクリーンに計測・監視することが推奨されます。

7. 実務チートシート:マイナーバージョンアップ計画・点検チェックリスト

本番適用時のミスを防ぐため、作業前・作業中・作業後に実施すべき確認項目をチェックリストとして整理しました。

作業フェーズ 点検項目 確認コマンド / 判定基準
事前準備 リリースノート精読 CVE深刻度および REINDEX 指示の有無確認
事前準備 事前バックアップ採取 pg_dumpall -g および pg_dump -Fc の正常終了
事前準備 更新対象パッケージ確認 dnf check-update postgresql18* で差分確認
計画停止 セッションドレイン CONNECTION LIMIT 0 およびアクティブ接続数0確認
計画停止 クリーン停止 systemctl stop で正常終了コード0を確認
更新実行 パッケージ更新 dnf update でエラー・警告なくComplete確認
事後確認 サービス起動・バージョン確認 SELECT version(); で新マイナー版の表記確認
事後確認 データ完全性照合 代表テーブルのレコード件数・最新更新日時確認
事後確認 接続受付再開 CONNECTION LIMIT -1 で一般アプリ接続を再開
事後確認 エラーログ監視 postgresql-*.log にFATALやERRORが出ないことを確認

7.1 実務作業手順書の標準タイムテーブル設計例

夜間計画メンテナンス枠(例:停止枠30分間)において、チーム作業を安全に進行させるための標準タイムライン設計例です。

  1. T-30分(23:30):事前点検とバックアップ採取
    仮想マシン健全性確認、ディスク空き容量確認、論理バックアップ(pg_dump -Fc)採取とベリファイ完了。
  2. T-00分(00:00):メンテナンス突入と接続ドレイン
    リバースプロキシでメンテナンス画面(503)へ切替。CONNECTION LIMIT 0 を発行し、既存接続を pg_terminate_backend() で安全に切断。
  3. T+05分(00:05):サービス停止とパッケージ更新
    systemctl stop postgresql-18 実行(正常停止コード確認)。dnf update -y postgresql18-server postgresql18 postgresql18-libs 実行。
  4. T+10分(00:10):サービス再起動と内部整合性確認
    systemctl start postgresql-18 実行。SELECT version(); で新バージョン確認。主要業務テーブルのカウント照合テスト。
  5. T+15分(00:15):サービス再開(メンテナンス解除)
    CONNECTION LIMIT -1 設定。リバースプロキシのメンテナンス画面を解除し、一般トラフィックを受付再開。
  6. T+30分(00:30):完了判定(GO判断)
    AP/DBログ監視でエラーゼロ確認。切り戻し判断時刻(デッドライン)を通過し、作業完了を宣言。

このように、「何分までにどのステップが完了していなければ切り戻し(スナップショット復元)を開始するか」という「デッドライン(判断限界時刻)」を作業手順書に明記しておくことが、本番障害を未然に防ぐ鉄則です。

8. 理解度確認演習問題(全3問・解答解説付き)

第1問:マイナーアップデートの互換性に関する正誤判定

PostgreSQLのマイナーバージョンアップ(例: 18.4から18.6への更新)に関する記述として、最も適切なものを選択してください。

  1. データフォーマットが非互換となるため、更新前に必ずpg_upgradeコマンドを実行しなければならない。
  2. 内部データブロック形式およびカタログ構造の完全な互換性が保証されているため、実行ファイルの置換と再起動のみで適用できる。
  3. マイナーアップデートには大幅な新機能追加が含まれるため、アプリケーションのSQL構文全面書き換えが必要となる。
  4. マイナーアップデートはデータベースを停止することなく、サービス稼働中にオンラインでバイナリを上書きしなければならない。
解答と解説を見る

正解:2

解説:PostgreSQLの同一メジャー系列内におけるマイナーアップデートは、データディレクトリの物理互換性が100%保証されています。したがって、pg_upgradeやデータ変換処理は一切不要で、パッケージの置換と再起動のみで適用できます。シングル構成では数分程度のサービス停止が必要です。

第2問:マイナーアップデート前の確認事項

マイナーバージョンアップを本番適用する直前の事前作業として、リリースノートで特に警戒して確認すべき記述はどれでしょうか。

  1. 新しいSQL関数が追加されたかどうかの確認
  2. データディレクトリの物理パスが変更されたかどうかの確認
  3. B-Treeインデックスの破損修正に伴うREINDEX指示の有無
  4. rootユーザーのパスワード変更指示の有無
解答と解説を見る

正解:3

解説:マイナーアップデートでは稀に、インデックス作成や比較処理に関わる深刻なバグの修正が含まれることがあります。その際、リリースノートに「アップデート後に既存インデックスのREINDEXを実行してください」という特記事項が記載されます。この指示を見落とすと検索結果の不整合につながるため、事前精読が不可欠です。

第3問:切り戻し(ロールバック)の安全基準

マイナーバージョンアップ後に本番障害が発生した場合の復旧方針として、最も安全かつ確実なアプローチを選択してください。

  1. 稼働中に新旧バイナリを強制的に混在させて同期させる。
  2. データベースを停止せず、そのまま旧バージョンのRPMパッケージを強制上書きインストールする。
  3. 更新直前に取得した仮想マシンのスナップショットから復元するか、事前採取した完全バックアップからクリーン再構築する。
  4. データディレクトリ内のPG_VERSIONファイルを古いバージョン番号に手動で書き換える。
解答と解説を見る

正解:3

解説:新バージョンで一定時間データが更新された後に単純なパッケージダウングレードを行うと、新バイナリが書き込んだデータやWALを旧バイナリが正しく処理できず二次障害を起こす恐れがあります。確実な切り戻しを行うための最大の安全弁は、更新直前のスナップショット復元または事前バックアップからのリストアです。

9. まとめと次回予告

  • マイナーアップデートはデータ互換性が保たれており、数分間の計画停止枠でバイナリ置換のみで完了する。
  • OS全体の自動アップデートによって意図せずPostgreSQLが更新されないよう、versionlock設定などで防御する。
  • 適用前にはリリースノートのCVE内容とREINDEX指示の有無を必ず確認する。
  • 万一の障害発生時に備え、更新直前の完全バックアップ採取およびスナップショット確保を省略してはならない。
  • 本番での切り戻しはパッケージダウングレードではなく、事前スナップショットまたはバックアップ復旧を唯一のルールとする。

次回は第8回「【ダウンタイム極小化】PostgreSQLのメジャーバージョンアップ手順:pg_upgrade実務攻略」を解説します。物理フォーマット非互換の壁、新旧バージョンのバイナリ共存、–check による事前診断、–link(ハードリンク)によるテラバイト級DBの瞬時移行、そしてアップグレード後のオプティマイザ統計再収集を実機検証で整理します。

PostgreSQL 18 構築・運用ガイド

Kindle書籍版(第9章)のご案内:スタンバイ先行ローリングアップデートによる無停止更新

本ブログ記事で解説したシングル構成の手順では、どうしても数分間の「サービス計画停止(ダウンタイム)」が発生します。しかし、ミッションクリティカルな24時間365日稼働システムでは、たとえ数分の停止であってもビジネス上の損失につながります。商業出版予定のKindle書籍版『現場で困らない PostgreSQL 本番運用大全 —— 4ノード実機で作る高可用性・チューニング・障害復旧』第9章では、以下の高度な無停止運用を網羅します。

  • スタンバイ先行ローリングアップデート:レプリケーション構成において、まず参照用Standbyノードを新マイナーバージョンへ更新・検証し、本番影響をゼロにする設計。
  • 制御されたフェイルオーバー(スイッチオーバー):StandbyをPrimaryへ昇格させ、旧Primaryを安全に切り離して新バージョンへ更新し、新Standbyとして再同期させる完全無停止マイナーアップデート手順書。
  • コネクションプーラー(PgBouncer)連携:ノード切り替え時におけるアプリケーション接続の一時停止(ポーズ)と再開により、クライアントにエラーを一切見せない無停止切り替え技術。
前の記事
次の記事