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

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

PostgreSQL 18 比較:AppStreamとPGDGの導入設計

公開
現場で迷わない PostgreSQL 18 構築・運用ガイド 第2回 アイキャッチ:AppStream vs PGDG 導入設計比較



AlmaLinuxやRHEL系のLinuxサーバーにPostgreSQLを導入する際、最初に直面する重要な分岐点が「どのリポジトリからインストールするか」という選択です。OS標準のAppStreamリポジトリと、PostgreSQLコミュニティ公式のPGDGリポジトリでは、配置されるディレクトリ構造やサービス管理コマンド、さらには将来のメジャーバージョンアップ時の難易度が根本から異なります。

本記事の到達目標

  • AppStream版とPGDG公式RPM版のディレクトリ構造および管理コマンドの違いを整理できる。
  • AlmaLinux 10環境において、両方式のインストール・初期化・systemd自動起動を完結できる。
  • 自社の運用保守ポリシーや将来のバージョンアップ要件に応じた選定基準を判断できる。

検証環境情報

  • ホストOS:AlmaLinux 10.2 (Lavender Lion) x86_64
  • カーネル:Linux 6.12.0
  • 検証ノード1(PGDG検証):alma-db01 (192.168.2.132)
  • 検証ノード2(AppStream検証):alma-db02 (192.168.2.135)
  • ゲートウェイ:alma-proxy (Squidプロキシ経由)
目次
  1. 1. なぜ2種類のリポジトリが存在するのか:設計思想の違い
    1. 1.1 AppStream版(OS標準提供)のメリットと制約
    2. 1.2 PGDG公式RPM版(コミュニティ公式提供)のメリットと制約
  2. 2. AppStream vs PGDG 構造比較一覧
    1. 2.1 systemdユニット定義ファイルの内部構造比較
    2. 2.2 コマンドラインツールのパス解決とフルパス指定の運用原則
  3. 3. 【実践】AppStream版のインストールと初期構築(alma-db02)
    1. 3.1 パッケージの確認とインストール
    2. 3.2 データベース初期化とsystemdサービス起動
  4. 4. 【実践】PGDG公式RPM版のインストールと初期構築(alma-db01)
    1. 4.1 PGDGリポジトリRPMの導入とEL-10での注意点
    2. 4.2 指定バージョンのインストール・初期化・サービス起動
    3. 4.3 initdb 詳細オプション設計:データチェックサムとICUロケール
    4. 4.4 実機検証:同一ホスト内での複数メジャーバージョン並行稼働
  5. 5. 実務トラブルシューティング事例集(3大障害シナリオと解決策)
    1. 5.1 シナリオ1:PGDGリポジトリ追加時のGPG署名検証エラー・接続タイムアウト
    2. 5.2 シナリオ2:AppStream版とPGDG版の混在によるパッケージ競合(transaction check error)
    3. 5.3 シナリオ3:OS更新に伴うglibc照合順序変更とインデックス不整合警告
  6. 6. 初期導入直後の必須セキュリティ・環境設定チェックリスト
    1. 6.1 データディレクトリのパーミッションとSELinuxコンテキスト
    2. 6.2 クライアントツールのPATH環境変数の設定
    3. 6.3 ログ出力設計と日次ローテーションの有効化
  7. 7. どちらを選ぶべきか?実務での選定フローチャート
  8. 8. 本番想定 総合確認演習問題
  9. 9. まとめと次回予告

1. なぜ2種類のリポジトリが存在するのか:設計思想の違い

1.1 AppStream版(OS標準提供)のメリットと制約

AlmaLinux(およびRed Hat Enterprise Linux)の標準リポジトリであるAppStreamから提供されるPostgreSQLパッケージは、OS自体の安定稼働とライフサイクル統合を最優先に設計されています。

AppStream版を採用する場合の主な特徴は以下の通りです。

  • OSライフサイクルとの同期:パッケージの更新やセキュリティパッチの提供がOSディストリビューションの方針に従って管理されます。OS全体の定期メンテナンス(dnf update)を実行するだけで、PostgreSQLのマイナーアップデートも一括で適用されます。
  • 追加リポジトリ不要:外部リポジトリの登録やGPG鍵のインポートが不要であるため、セキュリティ規定が厳しい閉域網環境でも導入ハードルが低い利点があります。
  • 単一パスへの固定:バイナリは/usr/bin/postgres、データディレクトリは/var/lib/pgsql/dataという標準パスに配置されます。この設計はシンプルである反面、「同一OS上に複数の異なるメジャーバージョンを共存させること」ができません

1.2 PGDG公式RPM版(コミュニティ公式提供)のメリットと制約

一方、PostgreSQLの開発元であるPostgreSQL Global Development Group (PGDG)が直接ビルドして配布している公式RPMリポジトリは、データベース専任の運用や長期的なバージョン管理を前提に設計されています。

PGDG版を採用する場合の主な特徴は以下の通りです。

  • スロット化されたパス設計:実行バイナリは/usr/pgsql-XX/bin/、データ領域は/var/lib/pgsql/XX/data/のように、メジャーバージョン番号(XX)を含む専用ディレクトリ配下に分離して格納されます。
  • 新旧バージョンの並行インストール:パスが完全に分離されているため、1台のサーバー上にPostgreSQL 16とPostgreSQL 18を同時にインストールして共存させることが可能です。この特徴は、後述するpg_upgradeを用いたメジャーバージョンアップにおいて決定的な利点となります。
  • 最新リリースの即時利用:コミュニティで新しいメジャーバージョンや緊急セキュリティパッチが公開された際、OSベンダの検証を待つことなく即日パッケージを入手できます。
AppStream版 vs PGDG公式RPM版 ディレクトリ構造とバージョン管理の比較(バイナリパス・データ配置・共存性の対比)
図1: AppStream版 vs PGDG公式RPM版 ディレクトリ構造とバージョン管理の比較

2. AppStream vs PGDG 構造比較一覧

実務で頻繁に使用する主要パス、初期化コマンド、サービス名の違いを一覧表で整理します。

比較項目 AppStream版(OS標準) PGDG公式RPM版(コミュニティ公式)
提供元 AlmaLinux AppStream リポジトリ PostgreSQL Global Development Group
バイナリ配置パス /usr/bin/postgres /usr/pgsql-XX/bin/postgres
クライアントツール /usr/bin/psql /usr/pgsql-XX/bin/psql
データディレクトリ /var/lib/pgsql/data /var/lib/pgsql/XX/data
初期化コマンド postgresql-setup --initdb /usr/pgsql-XX/bin/postgresql-XX-setup initdb
systemdサービス名 postgresql.service postgresql-XX.service
複数バージョン共存 不可(1環境に1バージョンのみ) 可能(新旧バイナリを並行配置可能)
メジャーUPの難易度 同一ノード共存不可のため論理移行が中心 pg_upgrade(高速リンクモード)に対応

重要ポイント:選定の分かれ目はメジャーアップグレード

単に「データベースを起動して動かすだけ」であれば、どちらを選んでも性能やSQLの互換性に差はありません。しかし、数年後に迎える「メジャーバージョンアップ(例: 16から18への移行)」の作業において、新旧バイナリが同居できるPGDG版はダウンタイムを数分〜数秒に短縮できる強力な選択肢となります。

2.1 systemdユニット定義ファイルの内部構造比較

サービスを管理するsystemdのユニット定義(.serviceファイル)にも、両方式の思想の差異が反映されています。それぞれの配置パスおよび主要ディレクティブを確認します。

AppStream版:/usr/lib/systemd/system/postgresql.service

[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=notify
User=postgres
Group=postgres
Environment=PGDATA=/var/lib/pgsql/data
ExecStart=/usr/bin/postgres -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

AppStream版はシンプルな構成となっており、データディレクトリはEnvironment=PGDATA=/var/lib/pgsql/dataに固定されています。バージョン番号の概念を持たず、OS全体で単一のデータベースインスタンスを稼働させる前提の設計です。

PGDG公式RPM版:/usr/lib/systemd/system/postgresql-18.service

[Unit]
Description=PostgreSQL 18 database server
Documentation=https://www.postgresql.org/docs/18/static/
After=network.target

[Service]
Type=notify
User=postgres
Group=postgres
Environment=PGDATA=/var/lib/pgsql/18/data/
Environment=PGENGINE=/usr/pgsql-18/bin
ExecStart=/usr/pgsql-18/bin/postgres -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=300

[Install]
WantedBy=multi-user.target

PGDG版では、ユニット名自体にメジャーバージョン番号が含まれるだけでなく、Environment=PGENGINE=/usr/pgsql-18/binのようにバイナリパスも分離されています。TimeoutSec=300など実務運用に即したタイムアウト設計があらかじめ組み込まれている点も特徴です。

2.2 コマンドラインツールのパス解決とフルパス指定の運用原則

管理者が端末からpsqlpg_dumpを実行する際のパス解決方法にも大きな違いがあります。

  • AppStream版:コマンド類が標準の/usr/bin/に配置されるため、環境変数を設定しなくても全ユーザーが即座にpsqlコマンドを呼び出せます。
  • PGDG版:/usr/pgsql-18/bin/配下にバージョンごとに完全分離して格納されます。複数バージョンのバイナリ衝突を防ぐため、デフォルトでは/usr/bin/への自動登録は行われません。

実務運用の鉄則:バイナリはフルパス指定で実行する

PGDG環境において、Linuxのalternatives機構や/etc/profile.d/でPATHを通す運用も可能ですが、本番環境ではバージョン違いのコマンド誤実行(例:PostgreSQL 17用のpg_dumpでPostgreSQL 18をバックアップしようとしてエラー停止する事故など)を絶対に防ぐ必要があります。

そのため、本連載の実機検証および実務スクリプト運用では、/usr/pgsql-18/bin/psql/usr/pgsql-18/bin/pg_basebackup のように、対象バージョンのバイナリをフルパスで明示指定して実行することを原則とします。

3. 【実践】AppStream版のインストールと初期構築(alma-db02)

実機ノードalma-db02を使用して、OS標準のAppStreamリポジトリからPostgreSQLを導入し、データベースクラスタの初期化からサービス起動までの手順を確認します。

3.1 パッケージの確認とインストール

まず、AppStreamリポジトリで提供されているPostgreSQL関連パッケージを確認し、サーバー本体をインストールします。

実行手順

  1. 対象ノード(alma-db02)にログインします。
  2. dnf install -y postgresql-server を実行します。
$ sudo dnf install -y postgresql-server
依存関係が解決しました。
================================================================================
 パッケージ                  Arch       バージョン          リポジトリー  サイズ
================================================================================
インストール:
 postgresql-server           x86_64     16.14-1.el10_2      appstream     6.9 M
依存関係のインストール:
 libicu                      x86_64     74.2-5.el10_0       baseos         10 M
 postgresql                  x86_64     16.14-1.el10_2      appstream     1.9 M
 postgresql-private-libs     x86_64     16.14-1.el10_2      appstream     143 k

完了しました!

AlmaLinux 10環境では、PostgreSQL 16.14のパッケージが依存関係(クライアント、共有ライブラリ等)とともに自動解決されて導入されます。

3.2 データベース初期化とsystemdサービス起動

インストール直後の状態では、データベースクラスタ(実体ファイル群)が未作成のため、初期化スクリプトを実行します。

# クラスタの初期化
$ sudo postgresql-setup --initdb
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

# サービスの有効化(自動起動登録)と即時起動
$ sudo systemctl enable --now postgresql
Created symlink '/etc/systemd/system/multi-user.target.wants/postgresql.service' → '/usr/lib/systemd/system/postgresql.service'.

# 稼働状態とバージョンの確認
$ systemctl is-active postgresql
active

$ sudo -u postgres psql -c "SELECT version();"
                                                    version                                                    
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 16.14 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 14.3.1 20251022 (Red Hat 14.3.1-4), 64-bit

実行後、/var/lib/pgsql/data配下にクラスタ構造が生成され、postgresql.serviceが正常に起動していることが確認できます。

4. 【実践】PGDG公式RPM版のインストールと初期構築(alma-db01)

次に、実機ノードalma-db01を使用して、PostgreSQLコミュニティ公式のPGDGリポジトリを登録し、最新のPostgreSQL 18を導入する手順を確認します。

4.1 PGDGリポジトリRPMの導入とEL-10での注意点

PGDG版を利用するには、まずコミュニティが配布しているリポジトリ定義RPMをインストールします。

実行手順

  1. 対象ノード(alma-db01)にログインします。
  2. 公式リポジトリRPMをインストールします。
  3. (必要に応じて)メタデータキャッシュを作成します。
# EL-10用 PGDGリポジトリRPMのインストール
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm
インストール済み:
  pgdg-redhat-repo-42.0-66.rhel10PGDG.noarch

完了しました!

RHEL 8/9 と RHEL 10(AlmaLinux 10)の違い

RHEL 8やRHEL 9でPGDGを導入する際は、OS標準のPostgreSQLとの競合を防ぐために dnf -qy module disable postgresql の実行が必須でした。しかし、AlmaLinux 10(RHEL 10系)ではモジュラーストリームの仕組みが簡素化されており、パッケージ名自体が postgresql18-server のようにバージョンごとに完全に分離されているため、モジュール無効化コマンドを実行する必要はありません。

4.2 指定バージョンのインストール・初期化・サービス起動

PGDGリポジトリから、利用したいメジャーバージョンのサーバーパッケージを指定してインストールします。ここではPostgreSQL 18を選択します。

# PostgreSQL 18 サーバーパッケージのインストール
$ sudo dnf install -y postgresql18-server
インストール済み:
  libicu-74.2-5.el10_0.x86_64                                                   
  liburing-2.12-1.el10.x86_64                                                   
  postgresql18-18.6-4PGDG.rhel10.2.x86_64                                       
  postgresql18-libs-18.6-4PGDG.rhel10.2.x86_64                                  
  postgresql18-server-18.6-4PGDG.rhel10.2.x86_64                               

完了しました!

PGDG版の初期化スクリプトおよびsystemdサービス名には、必ずメジャーバージョン番号が含まれる点に注意してください。

# バージョン別初期化スクリプトの実行
$ sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
Initializing database ... OK

# サービス有効化と起動(サービス名は postgresql-18)
$ sudo systemctl enable --now postgresql-18
Created symlink '/etc/systemd/system/multi-user.target.wants/postgresql-18.service' → '/usr/lib/systemd/system/postgresql-18.service'.

# 稼働状態とバージョンの確認
$ systemctl is-active postgresql-18
active

$ 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

データディレクトリは/var/lib/pgsql/18/dataに生成され、バイナリも/usr/pgsql-18/bin/配下に格納されていることが実機で確認できます。

4.3 initdb 詳細オプション設計:データチェックサムとICUロケール

パッケージ付属のセットアップスクリプト(postgresql-18-setup initdb等)は標準的なデフォルト値で初期化を行いますが、エンタープライズの本番システムを設計する際には、initdbコマンドを直接実行するか、環境変数を指定して重要なクラスタオプションを明示的に指定することが推奨されます。

実務で必須となる2大initdb設計項目

  • データチェックサム(--data-checksums / -k):
    ストレージ障害やビット反転(サイレントデータ破損)を検知するため、データページヘッダにチェックサムを付与する機能です。PostgreSQL 18からは初期値でデフォルト有効化(initdb実行時に自動付与)されましたが、PostgreSQL 17以前の環境ではデフォルト無効であったため、クラスタ構築時に明示的な指定が必須でした。稼働中のクラスタに対して後から有効化するには専用ツール(pg_checksums)によるオフライン処理が必要となるため、初期化時の有効化確認が不可欠です。
  • 照合順序プロバイダ(--locale-provider=icu):
    文字列のソート順序を制御するプロバイダとして、従来のOS標準「libc」ではなく「ICU(International Components for Unicode)」を指定します。libc依存の場合、OSのマイナー更新(glibc更新)によって文字列の順序定義が微細に変更され、B-treeインデックスの整合性が破壊される「照合順序バージョンの不整合」問題が頻発していました。ICUプロバイダを採用することで、OSのバージョンアップに起因するインデックス破損リスクを大幅に低減できます。
# 本番推奨オプションを指定した手動初期化コマンド例
$ sudo -u postgres /usr/pgsql-18/bin/initdb \
    -D /var/lib/pgsql/18/data \
    --encoding=UTF8 \
    --locale-provider=icu \
    --icu-locale=ja-JP \
    --data-checksums

# クラスタ状態およびデータチェックサムの有効性確認(pg_controldata)
$ sudo -u postgres /usr/pgsql-18/bin/pg_controldata -D /var/lib/pgsql/18/data | grep "Data page checksum"
Data page checksum version:           1

# ロケールプロバイダ(ICU / ja-JP)の確認(psql)
$ sudo -u postgres /usr/pgsql-18/bin/psql -c "SELECT datname, datlocprovider, datlocale FROM pg_database WHERE datname = 'postgres';"
 datname  | datlocprovider | datlocale 
----------+----------------+-----------
 postgres | i              | ja-JP
(1 行)

4.4 実機検証:同一ホスト内での複数メジャーバージョン並行稼働

PGDG公式RPM版の大きな強みの一つは、将来のメジャーバージョンアップ移行期において、同一OS上で新旧バージョンを競合させずに安全に並行稼働できる点にあります。ここでは、本シリーズ第8回(pg_upgrade移行実務)の事前検証シナリオを想定し、既存の旧環境(PostgreSQL 17がポート5432で稼働中)が存在するサーバーに対して、新環境(PostgreSQL 18)を追加導入し、ポートを5433に変更して同時に稼働させる共存検証の手順と仕組みを確認します。

複数バージョン共存の手順(バージョン移行期シナリオ)

  1. 既存の旧環境(PostgreSQL 17)がポート5432で稼働している状態を前提とします。
  2. dnf install -y postgresql18-server を実行し、新バージョン(PostgreSQL 18)を追加インストールします。
  3. PostgreSQL 18のクラスタを初期化します。
  4. ポート競合を回避するため、/var/lib/pgsql/18/data/postgresql.confport パラメータを 5433 に変更します。
  5. systemctl enable --now postgresql-18 で新旧両サービスを並行起動します。
# 1. 2つのバージョンの稼働状態を確認
$ systemctl is-active postgresql-17 postgresql-18
active
active

# 2. リスニングポートの確認(5432と5433が並行して待ち受け)
$ sudo ss -tulpn | grep postgres
tcp   LISTEN 0      244    0.0.0.0:5432   0.0.0.0:*   users:(("postgres",pid=1201,fd=7))
tcp   LISTEN 0      244    0.0.0.0:5433   0.0.0.0:*   users:(("postgres",pid=8540,fd=7))

# 3. プロセスツリーの確認(別々のバイナリパスから起動)
$ ps aux | grep [p]ostgres | grep -E "/usr/pgsql-(17|18)" | awk '{print $1, $2, $11}'
postgres 1201 /usr/pgsql-17/bin/postgres
postgres 8540 /usr/pgsql-18/bin/postgres

# 4. 各ポートへの接続テスト
$ /usr/pgsql-17/bin/psql -p 5432 -U postgres -c "SELECT version();" | head -n 3
                                                  version                                                  
----------------------------------------------------------------------------------------------------------
 PostgreSQL 17.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 14.3.1 20251022 (Red Hat 14.3.1-4), 64-bit

$ /usr/pgsql-18/bin/psql -p 5433 -U postgres -c "SELECT version();" | head -n 3
                                                  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

このように、バイナリ・ライブラリ・データ配置が完全に独立しているため、ポート番号を分けるだけで同一OS上で安全に並行稼働できます。この仕組みこそが、第8回で解説する「ダウンタイム数秒のメジャーバージョンアップ(pg_upgrade)」を可能にする物理的基盤です。

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

PostgreSQLのインストールや初期クラスタセットアップ時に頻発する代表的な障害シナリオ3選と、その原因および解決策を整理します。

5.1 シナリオ1:PGDGリポジトリ追加時のGPG署名検証エラー・接続タイムアウト

社内ネットワークや閉域網環境からdnf installを実行した際、PGDGリポジトリのメタデータ取得やRPMパッケージのGPG鍵検証に失敗し、インストールが中断する障害です。

GPG署名検証エラーの出力例

$ sudo dnf install -y postgresql18-server
PostgreSQL 18 for RHEL / Rocky / AlmaLinux 10 - x86_64   12 kB/s | 3.1 kB     00:00    
GPG 公開鍵のダウンロード中: https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG
エラー: GPG 署名の検証に失敗しました: [Errno 14] Curl error (28): Timeout was reached for https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG

原因:プロキシサーバー経由の通信環境において、dnfにプロキシ設定が未定義である場合や、社内ファイアウォールによってdownload.postgresql.orgへの443ポート通信が遮断されていることが原因です。

解決策

  • dnfプロキシの明示設定:/etc/dnf/dnf.confproxy=http://192.168.2.100:3128を追記し、プロキシ経由でGPG鍵およびRPMを取得できるように構成します。
  • GPG鍵の手動インポート:踏み台サーバー等から鍵ファイルを事前ダウンロードし、rpm --import /path/to/RPM-GPG-KEY-PGDGを実行してOSのRPMデータベースに手動登録します。

5.2 シナリオ2:AppStream版とPGDG版の混在によるパッケージ競合(transaction check error)

すでにAppStream版のPostgreSQL関連ライブラリ(例: postgresql-libs)が導入されている環境に対してPGDG公式RPM版をインストールしようとした際、依存ライブラリのバージョンやファイル衝突によりインストールが失敗する事象です。

エラー: トランザクションの確認エラー:
  file /usr/lib64/libpq.so.5 from install of libpq5-18.6-4PGDG.rhel10.x86_64 conflicts with file from package postgresql-libs-16.14-1.el10.x86_64

原因:OS標準のAppStream版クライアント共有ライブラリ(libpq)と、PGDG版が提供するlibpq5が、同一のファイルパス(/usr/lib64/libpq.so.5)を巡って競合するために発生します。

解決策:構築初期段階であれば、OS標準のパッケージを完全に除去した上でPGDG版を導入します。

# 1. 競合しているOS標準パッケージのアンインストール
$ sudo dnf remove -y postgresql postgresql-server postgresql-libs

# 2. PGDG公式パッケージを新規導入
$ sudo dnf install -y postgresql18-server

5.3 シナリオ3:OS更新に伴うglibc照合順序変更とインデックス不整合警告

OSの定期パッチ適用(dnf update glibc)を実施した後、PostgreSQLのログに照合順序(Collation)のバージョン不整合警告が出力され、検索結果の順序狂いや重複制約違反見逃しが発生する重大トラブルです。

照合順序バージョン不整合警告ログ

WARNING:  database "production_db" has a collation version mismatch
DETAIL:  The database was created using collation version 2.34, but the operating system provides 2.39.
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE production_db REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.

原因:データベース作成時にOSのglibcロケール(例: ja_JP.UTF-8)を使用している場合、glibcのバージョンアップによって文字列の比較ソート順が変更されると、既存のB-treeインデックスが正しく走査できなくなります。

解決手順

  1. 対象データベース内の全インデックスを再作成(REINDEX DATABASE production_db;)します。
  2. データベースの照合順序バージョンメタデータを更新します:ALTER DATABASE production_db REFRESH COLLATION VERSION;
  3. 恒久策として、新規クラスタ構築時は前述の通り --locale-provider=icu を採用し、glibc依存を排除します。

6. 初期導入直後の必須セキュリティ・環境設定チェックリスト

PostgreSQLパッケージのインストールとクラスタ初期化を完了した直後に、インフラ運用担当者が必ず確認・設定すべき初期セキュリティ項目を整理します。

6.1 データディレクトリのパーミッションとSELinuxコンテキスト

PostgreSQLのデータディレクトリ(/var/lib/pgsql/XX/data)は、機密データおよび認証情報を保護するため、所有者以外の全アクセスが遮断されていなければサービスが起動しません。

# パーミッションの確認(必ず 0700 / drwx------ であること)
$ ls -ld /var/lib/pgsql/18/data
drwx------. 19 postgres postgres 4096  9月  9 20:00 /var/lib/pgsql/18/data

# SELinuxコンテキストの確認(postgresql_db_t であること)
$ ls -Zd /var/lib/pgsql/18/data
system_u:object_r:postgresql_db_t:s0 /var/lib/pgsql/18/data

ストレージ増設などでデータディレクトリを別パーティション(例: /data/pgdata)に移動した場合、パーミッションが0700かつ所有者がpostgres:postgresであることに加え、semanage fcontext -a -t postgresql_db_t "/data/pgdata(/.*)?"およびrestorecon -Rv /data/pgdataを実行してSELinuxコンテキストを正しく適用しないと、SELinuxによって起動が拒否されます。

6.2 クライアントツールのPATH環境変数の設定

PGDG版を導入した場合、サーバー上の運用オペレータや保守スクリプトが即座にコマンドを実行できるよう、全ユーザー共通のプロファイル設定を作成します。

# /etc/profile.d/pgsql.sh の作成
$ sudo bash -c 'cat << "EOF" > /etc/profile.d/pgsql.sh
export PATH=/usr/pgsql-18/bin:$PATH
export MANPATH=/usr/pgsql-18/share/man:$MANPATH
EOF'

# 設定の即時反映と確認
$ source /etc/profile.d/pgsql.sh
$ which psql
/usr/pgsql-18/bin/psql

6.3 ログ出力設計と日次ローテーションの有効化

障害発生時の迅速な調査のため、初期化直後にpostgresql.confのログ収集機能を有効化します。

初期設定すべきログパラメータ(/var/lib/pgsql/18/data/postgresql.conf

  • logging_collector = on:ログコレクタープロセスを起動し、stderrの出力をログファイルへ捕捉。
  • log_directory = 'log':データディレクトリ配下のlogディレクトリに格納。
  • log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log':日時付きファイル名で出力。
  • log_rotation_age = 1d:24時間ごとに新しいログファイルへローテーション。
  • log_rotation_size = 100MB:1ファイルが100MBに達した際にもローテーションを実施。
  • log_line_prefix = '%m [%p] %q%u@%d ':日時、PID、ユーザー名、DB名を全ログ行に付与。

7. どちらを選ぶべきか?実務での選定フローチャート

要件や現場の制約に応じて、どちらのリポジトリを採用すべきかの判断基準をフローチャートで整理します。

要件に応じたPostgreSQLリポジトリ選定判断フローチャート(社内規定・停止時間・最新機能の判断分岐)
図2: 要件に応じたPostgreSQLリポジトリ選定判断フローチャート

判断基準の要点は以下の通りです。

  1. 社内規定で外部リポジトリの登録が禁止されている場合:

    選択の余地なくAppStream版を採用します。OSの標準サポート契約の範囲内で運用を完結させたいエンタープライズ環境に適しています。

  2. 将来のメジャーバージョンアップでサービス停止時間を最小化したい場合:

    PGDG公式RPM版の採用を推奨します。同一サーバー上に新旧バージョンを並行インストールできるため、後述のシリーズ第8回で解説するpg_upgrade --link(ハードリンク移行)を活用することで、数十ギガ〜数テラバイト規模のデータでも数分以内で移行を完了できます。

  3. 最新機能や早期パッチ提供が必要な場合:

    コミュニティから最新機能が即座に供給されるPGDG公式RPM版を選択します。

運用上の注意点:構築後のリポジトリ乗り換えリスク

AppStream版で構築した後に「やはりPGDG版に変えたい」となった場合、データディレクトリの配置パスやパッケージの依存関係が異なるため、単純なパッケージ更新では切り替えができません。全データの論理バックアップ(pg_dumpall)を取得した上で、旧パッケージをアンインストールし、再構築してリストアする移行作業が必要になります。リポジトリの選定は必ず初期設計段階で確定させておくことが肝要です。

8. 本番想定 総合確認演習問題

実務でリポジトリや初期構築を扱う際に必須となる知識を確認演習問題で点検します。

確認演習問題 1

AlmaLinux環境において、PGDG公式RPMリポジトリからインストールしたPostgreSQL 17のデータベースクラスタを初期化し、OS起動時の自動起動を有効化して即時起動するコマンドの組み合わせとして、正しいものを1つ選択してください。

  1. postgresql-setup --initdb および systemctl enable --now postgresql
  2. /usr/pgsql-17/bin/postgresql-17-setup initdb および systemctl enable --now postgresql-17
  3. initdb /var/lib/pgsql/data および systemctl start postgresql@17
  4. /usr/bin/postgresql-setup initdb 17 および systemctl enable --now postgresql.service
解答と解説を見る

正解: 2

解説:

PGDG公式RPM版では、複数のメジャーバージョンが共存できるように設計されているため、セットアップコマンドおよびsystemdサービス名の双方にメジャーバージョン番号(17)が含まれます。

選択肢1はAppStream版(OS標準パッケージ)で使用されるコマンド体系です。PGDG版では実行ファイルが/usr/pgsql-17/bin/postgresql-17-setup、サービス名がpostgresql-17.serviceとなります。

確認演習問題 2

将来的なメジャーバージョンアップ(例: PostgreSQL 16から18への移行)において、AppStream版と比較した際のPGDG公式RPM版の構造的利点について、技術的な根拠を述べてください。

解答と解説を見る

正解: 新旧バージョンのバイナリおよびデータディレクトリが同一ノード上で競合せずに共存できるため、pg_upgradeの高速リンクモード(--link)を実行可能である点。

解説:

pg_upgradeコマンドを実行するためには、旧バージョン(例: 16)と新バージョン(例: 18)の双方のバイナリ(postgres, pg_controldata等)が同一システム上に同時に存在している必要があります。

AppStream版はバイナリがすべて/usr/bin/に配置される単一スロット設計のため、新バージョンをインストールすると旧バージョンのバイナリが上書きされてしまい、同一ノード上でのpg_upgrade実行が困難になります。

対してPGDG版は/usr/pgsql-16/bin/usr/pgsql-18/binのようにディレクトリが完全に分離されているため、同一マシン内で新旧クラスタを並行配備し、データファイルをコピーせず瞬時にハードリンクで付け替える--link移行が可能となります。

9. まとめと次回予告

  • AppStream版はOS標準の安定性と一括管理に優れるが、単一パス配置のため複数バージョンの共存ができない。
  • PGDG公式RPM版はスロット化されたディレクトリ設計を採用しており、新旧バージョンの並行インストールと高速なpg_upgradeが可能となる。
  • AlmaLinux 10ではモジュラーストリーム構造が廃止・簡素化され、直接バージョン指定のRPMパッケージをインストールできる。
  • 初期化コマンドやsystemdサービス名には、AppStream版(番号なし)とPGDG版(バージョン番号付き)で明確な差異が存在する。

次回は第3回「postgresql.conf と pg_hba.conf の基本設計とアクセス制御」を解説します。初期構築を終えた直後の安全な接続待ち受け設定(listen_addresses)、SCRAM-SHA-256によるセキュアなパスワード認証、および社内ネットワークからの安全な接続制限ルールを実機設定ファイルを用いて整理します。

PostgreSQL 18 構築・運用ガイド

クラスタ自動構築のAnsibleコードを書籍で習得する

本記事ではシングルノードでの手動構築手順を比較しました。実務で複数台のPostgreSQLノード(Primaryノード、Standbyノード、Proxyノード)を均一かつ迅速にプロビジョニングするための「PGDG公式RPM対応 Ansible自動構築Playbook」およびパラメータ自動設定スクリプトは、Kindle書籍版『現場で困らない PostgreSQL 本番運用大全 —— 4ノード実機で作る高可用性・チューニング・障害復旧』第1章の読者限定特典にて提供しています。

前の記事
次の記事