PostgreSQLを「ただインストールしてSQLを実行できる」状態から、「実務環境で障害を起こさず、安全に保守・更新・冗長化できる」運用エンジニアの領域へと引き上げるための総合ロードマップです。AlmaLinux 10の実機検証環境(2台のDBノードとプロキシ)で全コマンドの動作を検証した全9回の技術連載について、全体像・学習体系・実機検証コマンド・トラブルシューティングの逆引きインデックスを体系的に整理しました。
検証環境・動作保証ポリシー
- 仮想基盤:Hyper-V(ホスト名:heartilly)
- OS:AlmaLinux 10.2 (x86_64) / カーネル Linux 6.12.0
- 主ノード:alma-db01 (192.168.2.132) – PGDG公式RPM版(PostgreSQL 17/18)
- 副ノード:alma-db02 (192.168.2.135) – AppStream版 / レプリケーションスタンバイ
- プロキシ:alma-proxy (192.168.1.121 / 192.168.2.121) – Squid / 外部通信制御
- 状態管理:各回検証前後に「環境設定統一後」スナップショットへロールバックして再現性を担保
目次
1. 本連載シリーズの目的とロードマップ
1.1 インフラエンジニアが直面するPostgreSQL実務の壁
オープンソースのリレーショナルデータベースとして世界中で広く採用されているPostgreSQLですが、実務の現場では「SQLクエリは書けるが、サーバーパラメータや内部プロセスの挙動が把握できていない」「バックアップは取得しているが、いざ障害が発生した際に特定テーブルだけを迅速に復旧する手順が確立されていない」「バージョンアップの停止計画や切り戻し手順の設計が不透明で着手できない」といった課題に直面するケースが後を絶ちません。
データベースは、WebサーバーやAPIゲートウェイのようなステートレスなミドルウェアとは異なり、ディスク上に永続化された実データを抱えています。設定変更の反映手順を誤ればデータ整合性の破損を招き、不要領域の整理(VACUUM)を怠ればディスク枯渇やパフォーマンスの急激な悪化に直面します。また、メジャーバージョンアップ時にデータ形式の互換性制約を理解していなければ、長時間のサービス全面停止を引き起こすリスクがあります。
本連載「インフラエンジニア成長計画:PostgreSQL実務運用シリーズ」は、マニュアルの単なる要約や理想論にとどまらず、現場の運用管理者が直面する具体的なリスクとトラブルシューティングに焦点を当て、実機検証ログに基づいた確実な運用設計手順を体系化することを目的としています。
1.2 基礎・運用・更新の3フェーズ習得ステップ
PostgreSQLの運用スキルを効率的かつ論理的に修得するため、本シリーズでは全9回のコンテンツを3つのフェーズに分割して設計しています。
3フェーズ学習体系の構成
- Phase 1:アーキテクチャと環境構築(第01回〜第03回)
PostgreSQLのメモリ構造(共有バッファとプロセス個別メモリ)やプロセス構成を理解し、AlmaLinux 10への適切なインストール、ネットワーク接続制御(postgresql.conf / pg_hba.conf)を確立します。 - Phase 2:堅牢な運用とデータ保全(第04回〜第06回)
最小権限の原則に基づくロール設計、カスタム形式(-Fc)を活用した柔軟なバックアップ・リストア、MVCCアーキテクチャに起因するテーブル肥大化を防ぐVACUUM/ANALYZEのチューニングを習得します。 - Phase 3:ライフサイクルと高可用化(第07回〜第09回)
計画停止と迅速な切り戻しを担保するマイナーバージョンアップ、ハードリンク(–link)を用いたダウンタイム最小化メジャー更新、WAL物理転送による2ノードストリーミングレプリケーションの構築を完結させます。
1.3 概念理解から実機構築までの全体俯瞰
以下の図1は、本連載全9回の関連性と、単一ノード運用の基礎から将来的な高可用性クラスタ構築(Kindle書籍版)へと至る技術ステップの全体像を示したロードマップです。

この体系に沿って学習を進めることで、単なる「コマンドの暗記」ではなく、「なぜその設定が必要なのか」「障害発生時にどのレイヤーを調査すべきか」を論理的に判断できる実務能力が身につきます。
2. 実機検証基盤トポロジーと再現性保証
2.1 AlmaLinux 10仮想基盤(alma-db01 / alma-db02 / alma-proxy)
技術解説記事において最も重要な要素は「読者が自身の手元で再現した際に、記載されたコマンドが100%同一の挙動を示すこと」です。そのため、本連載の全検証はHyper-V仮想化基盤上のAlmaLinux 10.2環境において実施されています。ブログ連載では3ノード(alma-proxy, alma-db01, alma-db02)で完結する検証を行い、連動書籍版で展開するPatroniクォーラムクラスタを見据えて4ノード目(alma-db03)を追加配備できる統合インフラ構成となっています。

各ノードの役割分担は以下の通りです。
- プロキシノード(alma-proxy: 192.168.1.121 / 192.168.2.121)
外部ネットワークとのゲートウェイとして動作し、Squid(ポート 3128)経由で外部RPMパッケージ取得通信をホワイトリスト制御します。データベースサーバーが直接インターネットへ露出しない本番ネットワーク環境を模擬しています。 - 主DBノード(alma-db01: 192.168.2.132)
PostgreSQL Global Development Group(PGDG)公式RPMリポジトリから最新のPostgreSQLを導入し、シングル構成時の運用保守、メジャーバージョンアップ(pg_upgrade)、レプリケーションPrimaryノードとしての全検証を担当します。 - 副DBノード(alma-db02: 192.168.2.135)
AlmaLinux OS標準のAppStreamリポジトリからPostgreSQLを導入し、PGDG版とのパッケージ構造・運用差異を比較検証します。第09回ではStreaming ReplicationのStandbyノードとしてPrimaryと同期接続します。
各DBノードのプロキシ環境設定(/etc/environmentおよび/etc/dnf/dnf.conf)は以下のように統一されています。
# /etc/environment の設定例(DBノード共通)
http_proxy="http://192.168.2.121:3128"
https_proxy="http://192.168.2.121:3128"
no_proxy="localhost,127.0.0.1,192.168.2.0/24"
# /etc/dnf/dnf.conf への追記
proxy=http://192.168.2.121:3128
2.2 PGDG公式RPMとAppStreamの2台ハイブリッド構成
Enterprise Linux環境におけるPostgreSQL導入では、「OSベンダーが提供するAppStream版」と「コミュニティ公式が提供するPGDG版」のどちらを採用すべきかという議論が頻出します。
| 比較項目 | AppStream版(alma-db02) | PGDG公式RPM版(alma-db01) |
|---|---|---|
| 提供元 | AlmaLinux / Red Hat | PostgreSQL Global Development Group |
| 提供バージョン | OSリリース時点の特定メジャー版(固定) | 最新版から過去5世代の全メジャー版 |
| バイナリパス | /usr/bin/postgres |
/usr/pgsql-XX/bin/postgres |
| データディレクトリ | /var/lib/pgsql/data |
/var/lib/pgsql/XX/data |
| 複数バージョンの共存 | 不可(同一システム上に1系統のみ) | 可能(メジャー版ごとにディレクトリ分離) |
| pg_upgrade移行 | 複数版共存が困難なため制約が大きい | 新旧バイナリ共存により迅速に完結 |
本シリーズでは2台の実機ノードを個別に構成しているため、双方のディレクトリ設計やsystemdユニット定義の差異を具体的なコマンドライン出力で比較しながら学習を進めることが可能です。
2.3 スナップショットロールバック運用によるコマンド完全動作保証
データベースの検証作業では、パッケージのインストール、設定変更、データの投入、クラスタの初期化などにより、環境状態が不可逆的に変化します。前回の検証で残った残骸ファイルやポート競合が原因で後続の手順が失敗する事態を防ぐため、本シリーズではHyper-Vのスナップショット機能を厳格に運用しています。
全仮想マシンには、OSインストールおよび初期ネットワーク設定(プロキシ設定・ホスト名解決)が完了した直後のクリーンな状態を記録した共通スナップショット「環境設定統一後」が作成されています。各記事の執筆および検証を行う際には、必ずこのスナップショットへロールバックしてからコマンドを実行し、エビデンスを取得しています。
# Hyper-Vホスト(heartilly)上でのロールバック実行例(PowerShell)
$ConfirmPreference = 'None'
Stop-VM -Name alma-db01, alma-db02, alma-proxy -Force
Restore-VMSnapshot -VMName alma-db01 -Name '環境設定統一後'
Restore-VMSnapshot -VMName alma-db02 -Name '環境設定統一後'
Restore-VMSnapshot -VMName alma-proxy -Name '環境設定統一後'
Start-VM -Name alma-proxy, alma-db01, alma-db02
この運用により、読者が記事の手順を実行する際にも、不要な環境汚染に悩まされることなく、確実に同一の結果を得ることができます。
3. 全9回記事の詳細解説と学習ガイド
3.1 【Phase 1:基礎・構築編】第01回〜第03回
データベース運用を始めるにあたり、最初に押さえるべき内部構造と初期セットアップを扱います。
第01回:PostgreSQLアーキテクチャ入門:プロセス構成とメモリの仕組み
- 学習テーマ:Postmaster主プロセスと子プロセス群の役割分担、共有メモリとローカルメモリの分離構造。
- 現場の重要知見:クライアントが接続するたびにフォークされるバックエンドプロセスのメモリ消費(work_mem)と、接続急増時のOOM Killer発動リスク。
- 主要実機確認コマンド:
# プロセス親子関係の確認 ps -ef --forest | grep -E 'postgres|UID' # 共有メモリ使用量と設定値の確認 psql -c "SHOW shared_buffers;" -c "SHOW work_mem;" - 習得成果:
ps -ef --forestコマンドでプロセスツリーを追跡し、共有バッファ(shared_buffers)とWALバッファのデータ保護メカニズムを説明できるようになります。
第02回:PostgreSQLインストール比較:AlmaLinux 10でのAppStreamとPGDG
- 学習テーマ:AlmaLinux 10における2大導入手法の構造比較と選定基準。
- 現場の重要知見:AppStream版の単一バージョン制約と、将来のメジャーバージョンアップ(pg_upgrade)を見据えたPGDG版のパス分離構造(/usr/pgsql-XX/)。
- 主要実機確認コマンド:
# PGDGリポジトリ登録とインストール dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm dnf install -y postgresql18-server # データベース初期化とサービス起動 /usr/pgsql-18/bin/postgresql-18-setup initdb systemctl enable --now postgresql-18 - 習得成果:dnfコマンドによるリポジトリ追加から、systemdサービス管理(postgresql-XX.service)、initdbオプション設計までを自力で完結できるようになります。
第03回:postgresql.conf基本設定とpg_hba.confアクセス制御の設計
- 学習テーマ:外部接続を許可する基本通信設定と、ホストベース認証(pg_hba.conf)によるセキュリティ強化。
- 現場の重要知見:listen_addressesのデフォルト設定(localhost)による接続拒否、pg_hba.confの評価順序(ファーストマッチ方式)による認証設定ミス、SCRAM-SHA-256パスワード暗号化の適用。
- 主要実機確認コマンド:
# 設定変更後のリロード実行と反映確認 psql -c "SELECT pg_reload_conf();" psql -c "SELECT name, setting, context FROM pg_settings WHERE name IN ('listen_addresses', 'password_encryption');" # 接続元IP別の認証ルール確認(pg_hba.conf) grep -vE '^#|^$' /var/lib/pgsql/18/data/pg_hba.conf - 習得成果:設定変更時のreload(pg_ctl reload)とrestart(サービス再起動)の適切な使い分け、およびpg_settingsシステムビューを活用した動的反映確認が可能になります。
3.2 【Phase 2:堅牢運用編】第04回〜第06回
日々のデータベース運用において障害を未然に防ぎ、セキュリティとデータ保全を両立させる中核技術を扱います。
第04回:PostgreSQLのロールと権限管理:最小権限で安全に運用する設計
- 学習テーマ:ユーザーとグループを包括するロール概念、データベース・スキーマ・テーブルの3階層アクセス権限モデル。
- 現場の重要知見:スーパーユーザー(postgres)の常時利用がもたらす重大リスク、スキーマのUSAGE権限とテーブルのSELECT権限の混同、テーブル追加時に権限付与漏れを防ぐALTER DEFAULT PRIVILEGESの必須性。
- 主要実機確認コマンド:
# アプリ用ロールと参照専用ロールの作成 CREATE ROLE app_user WITH LOGIN PASSWORD 'AppUserSecurePass2026'; CREATE ROLE readonly_user WITH LOGIN PASSWORD 'ReadOnlyPass2026'; # 3階層権限の付与と将来テーブルへのデフォルト権限定義 GRANT USAGE ON SCHEMA app_schema TO app_user, readonly_user; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app_schema TO app_user; GRANT SELECT ON ALL TABLES IN SCHEMA app_schema TO readonly_user; ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA app_schema GRANT SELECT ON TABLES TO readonly_user; - 習得成果:アプリケーション用(Read/Write)および監視・分析用(Read-Only)のロールを最小権限の原則に基づいて分離構築し、
\dpメタコマンドの権限フラグを正確に解読できるようになります。
第05回:pg_dumpとpg_restore実務入門:カスタム形式と障害復旧
- 学習テーマ:論理バックアップツールpg_dumpの運用プラクティスとpg_restoreによる柔軟なデータ復元。
- 現場の重要知見:プレーンテキストSQL形式(-Fp)の復旧柔軟性の限界と、カスタム形式(-Fc)が実務標準とされる理由(圧縮、並列復元、特定オブジェクトのみの抽出リストア)。
- 主要実機確認コマンド:
# カスタム形式による論理バックアップ取得 pg_dump -Fc -U postgres -d production_db -f /backup/prod_$(date +%Y%m%d).dump # 特定テーブル(orders)のみを対象としたピンポイント復旧(--cleanで既存テーブル再作成) pg_restore -U postgres -d production_db -t orders --clean --if-exists /backup/prod_20260909.dump - 習得成果:
-tオプションを用いた特定テーブルのピンポイント復旧、--clean --if-existsオプションを活用した安全なテーブル再作成、およびグローバルオブジェクト(ロール・表領域)を保護するpg_dumpallの併用手順を確立できます。
第06回:PostgreSQLのVACUUMとANALYZE:肥大化防止と性能維持
- 学習テーマ:MVCC(多版型同時実行制御)の内部メカニズム、不要行(Dead Tuple)の発生原因、テーブル統計情報の収集。
- 現場の重要知見:VACUUM FULLが本番環境で原則厳禁とされる理由(排他ロックによる全クエリ遮断とディスク容量2倍消費)、autovacuumの自動起動閾値の計算式、ロングトランザクションによるVACUUM停止リスク。
- 主要実機確認コマンド:
# 不要タプル(Dead Tuple)蓄積状況の監視 SELECT relname, n_live_tup, n_dead_tup, round(n_dead_tup * 100.0 / nullif(n_live_tup + n_dead_tup, 0), 2) AS dead_ratio, last_vacuum, last_autovacuum FROM pg_stat_user_tables ORDER BY n_dead_tup DESC; # 特定テーブルに対するautovacuum個別チューニング ALTER TABLE high_update_table SET ( autovacuum_vacuum_scale_factor = 0.05, autovacuum_vacuum_threshold = 100 ); - 習得成果:pg_stat_user_tablesビューを用いた不要タプル率の監視、autovacuumパラメータのテーブル個別チューニング、および統計情報の更新による実行計画劣化の予防を実践できます。
3.3 【Phase 3:ライフサイクル・高可用化編】第07回〜第09回
長期的なデータベースライフサイクル管理と、システム無停止・障害耐性を実現する高度運用技術を扱います。
第07回:PostgreSQLのマイナーバージョンアップ実務:更新と切り戻し
- 学習テーマ:同一メジャーバージョン内でのバグ修正・セキュリティパッチ適用(例:18.4から18.6への更新)。
- 現場の重要知見:データディレクトリの再構築が不要でバイナリ更新のみで済む理由(ディスク上データ互換性の維持)、サービス計画停止手順、パッケージ更新失敗時のダウングレード切り戻し手順の策定。
- 主要実機確認コマンド:
# 更新対象パッケージの事前確認とサービス計画停止 dnf check-update postgresql18* systemctl stop postgresql-18 # パッケージ更新の実行と起動確認 dnf update -y postgresql18-server postgresql18 systemctl start postgresql-18 psql -c "SELECT version();" # 万一の障害時のダウングレード切り戻し手順 systemctl stop postgresql-18 dnf downgrade -y postgresql18-server-18.4 postgresql18-18.4 systemctl start postgresql-18 - 習得成果:dnf check-updateによる更新対象確認、事前論理バックアップ取得、dnf downgradeによる迅速なフェイルバックを実機で実証できるようになります。
第08回:PostgreSQLのメジャー更新手順:pg_upgrade実務攻略
- 学習テーマ:メジャーバージョンアップ(例:PostgreSQL 17から18への移行)における内部データフォーマット変更とpg_upgradeの活用。
- 現場の重要知見:論理ダンプ・リストア方式による膨大なダウンタイム発生問題、ハードリンク(–link)方式によるファイル再配置なしの瞬時アップグレード、同一ファイルシステム制約と旧クラスタ破壊リスク。
- 主要実機確認コマンド:
# 事前整合性チェック(非破壊ドライラン) /usr/pgsql-18/bin/pg_upgrade \ -b /usr/pgsql-17/bin -B /usr/pgsql-18/bin \ -d /var/lib/pgsql/17/data -D /var/lib/pgsql/18/data \ --link --check # 実アップグレードの実行(数秒で完了) /usr/pgsql-18/bin/pg_upgrade \ -b /usr/pgsql-17/bin -B /usr/pgsql-18/bin \ -d /var/lib/pgsql/17/data -D /var/lib/pgsql/18/data \ --link # 新クラスタ起動とオプティマイザ統計再収集 systemctl start postgresql-18 /usr/pgsql-18/bin/vacuumdb -U postgres --all --analyze-in-stages - 習得成果:事前整合性チェック(–check)、pg_upgrade_internal.logの診断、更新後の新クラスタ統計収集(vacuumdb –analyze-in-stages)、およびクリーンアップスクリプト(delete_old_cluster.sh)の安全な実行手順を修得できます。
第09回:PostgreSQLの冗長化入門:レプリケーション構築手順
- 学習テーマ:ストリーミングレプリケーションによるPrimaryノード(alma-db01)からStandbyノード(alma-db02)への物理WALリアルタイム転送。
- 現場の重要知見:論理レプリケーションとのアーキテクチャ上の差異、pg_basebackup -Rによるスタンバイ初期化、レプリケーションスロットによる未転送WAL自動保持とディスク溢れリスクのトレードオフ。
- 主要実機確認コマンド:
# Primary側でレプリケーション用ロールとスロットを作成 psql -c "CREATE ROLE repuser WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'rep_secret_pass';" psql -c "SELECT pg_create_physical_replication_slot('standby_slot_01');" # Standby側でベースバックアップ取得と同期接続自動生成 pg_basebackup -h 192.168.2.132 -U repuser -p 5432 \ -D /var/lib/pgsql/18/data -Fp -Xs -c fast -P -R -S standby_slot_01 # Primary側でのレプリケーション状態と遅延バイト数の監視 SELECT client_addr, state, sync_state, pg_wal_lsn_diff(pg_current_wal_lsn(), write_lsn) AS write_lag_bytes, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag_bytes FROM pg_stat_replication; - 習得成果:Primary側pg_stat_replicationビューによる転送遅延バイト数の監視、Standby側リードレプリカ(Read-Onlyクエリ参照)の運用、およびスタンバイ昇格(pg_ctl promote)の手動フェイルオーバー手順を理解できます。
4. 実務トラブルシューティング逆引きインデックス
データベースの運用現場では、エラーログの内容から迅速に原因を特定し、的確な復旧措置をとる能力が求められます。ここでは、本シリーズで詳解している主要なトラブルシューティング事例をエラーメッセージ別に逆引きできるインデックスとしてまとめました。
| エラーメッセージ / 障害事象 | 主な根本原因 | 確認箇所・対処方針 | 解説回 |
|---|---|---|---|
Is the server running on host and accepting TCP/IP connections on port 5432? |
・PostgreSQLサービス未起動 ・ listen_addresses が ‘localhost’ のまま・firewalldでポート5432が未開放 |
・systemctl status postgresql-XX・ postgresql.conf の listen_addresses = '*' 確認・ firewall-cmd --add-service=postgresql --permanent |
第03回 |
FATAL: no pg_hba.conf entry for host "...", user "...", database "..." |
接続元IPアドレス、対象DB、またはユーザー名に合致するルールが pg_hba.conf に存在しない(または評価順序で先に拒否ルールに合致) |
・pg_hba.conf に host all all 接続元IP/32 scram-sha-256 を追加・上から順に評価されるため配置順序を確認し pg_ctl reload |
第03回 |
FATAL: password authentication failed for user "..." |
パスワード不一致、または古いmd5形式とscram-sha-256形式の暗号化方式不整合 | ・\password ユーザー名 でパスワード再設定・ password_encryption = 'scram-sha-256' 設定の整合性確認 |
第03回 |
ERROR: permission denied for schema ... |
テーブル権限(SELECT等)はあるが、親階層であるスキーマの USAGE 権限が付与されていない |
GRANT USAGE ON SCHEMA スキーマ名 TO ロール名; を実行してアクセスを許可 |
第04回 |
ERROR: permission denied for table ... (新規テーブル作成後) |
既存テーブルへのGRANTのみ実行されており、新規作成オブジェクトに対する DEFAULT PRIVILEGES が未設定 |
ALTER DEFAULT PRIVILEGES FOR ROLE テーブル作成ロール IN SCHEMA スキーマ名 GRANT SELECT ON TABLES TO ロール名; を定義 |
第04回 |
pg_restore: error: ARCHIVE ERROR: ... could not execute query: relation "..." already exists |
既存テーブルが存在する環境に対して --clean オプションなしでリストアを実行し、オブジェクト衝突が発生 |
pg_restore --clean --if-exists を指定して安全にドロップ&再作成を実施 |
第05回 |
| テーブルサイズが急激に増大し、SELECTクエリの実行速度が低下(Bloat現象) | 大量のUPDATE/DELETEによる不要行(Dead Tuple)の累積に対し、autovacuumの実行が追いついていない | ・pg_stat_user_tables で n_dead_tup 確認・ autovacuum_vacuum_scale_factor を個別テーブルで引き下げ・手動 VACUUM ANALYZE 実行 |
第06回 |
pg_upgrade: check failed: source and target clusters must be in different directories |
新旧クラスタのデータディレクトリパスが重複、または環境変数の指定ミス | -d 旧データパス -D 新データパス -b 旧binパス -B 新binパス の引数分離を再確認 |
第08回 |
pg_upgrade: error: link option failed: Invalid cross-device link |
--link オプションを指定したが、旧クラスタと新クラスタのデータディレクトリが異なるファイルシステム(マウントポイント)に存在 |
同一パーティション内に新旧ディレクトリを配置するか、--link を外してコピー方式(要ディスク空き容量)で実行 |
第08回 |
| Primaryのディスク容量がWALファイル(pg_wal)で枯渇寸前になる | レプリケーションスロットを作成したが、Standbyノードが長時間停止しており、未転送WALが削除されずに滞留 | ・Standbyノードの復旧を優先 ・停止が長期化する場合は SELECT pg_drop_replication_slot('スロット名'); で解放(同期は切断) |
第09回 |
Standbyノードで更新クエリを実行しようとしてエラー(ERROR: cannot execute ... in a read-only transaction) |
スタンバイインスタンスはデータ保護のため読み取り専用(Read-Only)モードでロックされている | 書き込みトランザクションは必ずPrimaryノード(alma-db01)のIP宛てにルーティング | 第09回 |
5. 本番運用設計基準(パラメーターシート・監視設計)
5.1 推奨初期パラメータ設計の基準値
PostgreSQLを本番環境へ導入する際、デフォルト設定のまま運用を開始すると、サーバーリソースが十分に活用されず性能不足に陥るか、逆に過剰なメモリ確保によりOSのOOM Killerによってプロセスが強制終了される危険があります。以下は、AlmaLinux 10環境(メモリ4GB〜16GB規模のWeb/APシステム)を基準とした推奨パラメータ設計の指針です。
| パラメータ名 | デフォルト値 | 推奨設定基準値 | 設定根拠と運用上の注意点 |
|---|---|---|---|
shared_buffers |
128MB | 搭載物理メモリの25%(例:4GB環境なら1GB) | PostgreSQLのテーブルデータ共有キャッシュ。30%を超えて割り当ててもOSキャッシュとの二重管理で効率が上がりにくいため、25%を基本基準とします。 |
work_mem |
4MB | 16MB〜64MB(接続数に応じて算出) | ソートやハッシュ結合で使用されるプロセス個別メモリ。クエリ内のソート操作ごとに個別消費されるため、max_connections × work_mem が空きメモリを超えないよう慎重に設計します。 |
maintenance_work_mem |
64MB | 搭載物理メモリの5%〜10%(例:256MB〜512MB) | VACUUM、インデックス作成(CREATE INDEX)、外部キー追加等の保守作業で使用。VACUUMの処理速度に直結するため、夜間バッチ窓口に合わせて拡大します。 |
max_connections |
100 | 100〜200(PgBouncer併用時は100以下) | PostgreSQLはプロセスモデルであるため、接続数に比例してメモリを消費します。500を超える大量接続が想定される場合はパラメータを引き上げるのではなく、コネクションプーラー(PgBouncer)を前段に配置します。 |
wal_buffers |
-1 (自動: 共有バッファの3%) | 16MB(自動設定値または固定16MB) | WALデータの書き込みバッファ。16MBが実務上の上限目安とされており、重い更新トランザクション時のディスクI/O競合を緩和します。 |
checkpoint_completion_target |
0.9 | 0.9 | チェックポイント書き込みを次のチェックポイントまでの時間の何割で均等分散して実行するかを指定。I/Oスパイクを平滑化するため0.9を維持します。 |
5.2 必須監視メトリクスと閾値設計
安定したデータベース運用を継続するためには、システム監視ツール(Zabbix、Prometheus + postgres_exporter、Datadog等)を用いて、以下の重要メトリクスを定常監視することが不可欠です。
重点監視メトリクス一覧
- アクティブ接続数(pg_stat_activity)
SELECT count(*) FROM pg_stat_activity WHERE state = 'active';
閾値目安:max_connectionsの80%を超えた場合に警告(Alert)を発報。接続のスタックや接続リークの有無を即座に特定します。 - 長時間トランザクション(Long-Running Queries)
SELECT pid, now() - xact_start AS duration, query FROM pg_stat_activity WHERE state <> 'idle' AND now() - xact_start > interval '5 minutes';
閾値目安:5分以上継続しているトランザクションを検知。autovacuumの進行阻害やテーブルロック待ちの発生を未然に防止します。 - 不要タプル率(Dead Tuple Ratio)
SELECT relname, n_dead_tup * 100 / nullif(n_live_tup + n_dead_tup, 0) AS ratio FROM pg_stat_user_tables;
閾値目安:特定テーブルでDead Tuple率が20%を超えて継続上昇している場合、autovacuumパラメータの個別見直しを行います。 - レプリケーション遅延バイト数(pg_stat_replication)
SELECT client_addr, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes FROM pg_stat_replication;
閾値目安:遅延量が100MB(または時間換算で30秒)を超過した場合に監視通知。ネットワーク帯域逼迫やスタンバイノードの過負荷を調査します。 - WALディレクトリ(pg_wal)のディスク使用率
レプリケーションスロットの停止やアーカイブログ転送詰まりにより、急激にディスクが枯渇する事故を検知するため、ファイルシステム監視で80%警告、90%緊急を設定します。
6. 本シリーズからKindle書籍版(本番クラスタ編)への発展展望
6.1 Patroniとetcdによる自動フェイルオーバーと合意形成
本ブログ連載(第01回〜第09回)では、単一ノードの堅牢な管理から2ノードでの物理ストリーミングレプリケーションまでを網羅しています。しかし、実務の本番運用環境においては、もう一つの大きな壁が存在します。それは「Primaryノードにハードウェア故障やOSカーネルパニックが発生した際、いかに人間の手作業を介さず安全にフェイルオーバー(新プライマリへの昇格)を完結させるか」という点です。
手動運用で最も危険な事故は「スプリットブレイン(Split-Brain)」です。ネットワークの一時的な分断によって両ノードが自身をプライマリと誤認し、双方が別個の書き込みデータを受け付けてしまうと、データの整合性は完全に破壊され、人手による修復は極めて困難になります。
Kindle書籍版『現場で困らない PostgreSQL 本番運用大全 —— 4ノード実機で作る高可用性・チューニング・障害復旧』では、この課題を解決するため、分散KVSである etcd による分散合意形成と、クラスタ管理デーモン Patroni を組み合わせた自動フェイルオーバーアーキテクチャを体系化します。3ノード以上のクォーラム(過半数合意)により、スプリットブレインを防止しながらダウンタイム数十秒での自動昇格を実現する設計手法を展開します。
6.2 PgBouncerとHAProxyによるコネクション管理と負荷分散
もう一つの発展テーマが、接続急増に対する耐性とアクセスルーティングです。第01回で解説する通り、PostgreSQLはプロセス分離モデルを採用しているため、クライアントからの接続数が数百・数千に達するとバックエンドプロセスがメモリを過大に消費し、システム全体のパフォーマンスが急激に低下します。
Kindle書籍版では、軽量コネクションプーラーである PgBouncer を導入し、アプリケーションからの大量接続を少数のデータベース接続へと多重化(トランザクションプーリング)する手法を詳解します。さらに、ロードバランサである HAProxy を組み合わせることで、アプリケーションに対して単一のエンドポイント(VIP / 共通ポート)を提供し、「更新クエリは自動的にPrimaryノードへ、参照クエリは複数台のStandbyノードへ分散」する読み書き分離アーキテクチャの実装手順を解説します。
6.3 4ノード本番エンタープライズクラスタの設計思想
本シリーズの検証環境定義書(environment_setup.md)に記載されている通り、検証基盤にはすでに4ノード(alma-proxy, alma-db01, alma-db02, alma-db03)が準備されています。ブログ編で基礎からレプリケーションまでを確実に修得した読者は、同一の検証インフラをそのまま発展させ、エンタープライズ水準の4ノードフルスタックHAクラスタの構築へと無理なくステップアップできるよう設計されています。
7. まとめ:実務で信頼されるデータベース運用者へ
7.1 本シリーズの受講チェックリスト
全9回の学習を開始するにあたり、または各回の学習を終えた振り返りとして、以下のチェックリストを活用してください。すべての項目に対して「根拠を持って理由と手順を説明できる」状態に到達することが本シリーズのゴールです。
実務運用能力到達度チェックリスト
- Postmasterとバックエンドプロセスの違い、および共有メモリとwork_memの消費構造を説明できるか?
- AppStream版とPGDG公式RPM版のパス構造・バージョン共存性の違いを理解し、環境要件に応じた選定ができるか?
- postgresql.confとpg_hba.confの役割の違いを把握し、SCRAM-SHA-256による安全なアクセス制御を設計できるか?
- データベース・スキーマ・テーブルの3階層権限を理解し、ALTER DEFAULT PRIVILEGESを活用した最小権限運用ができるか?
- pg_dumpのカスタム形式(-Fc)を用いて特定テーブルのみを迅速にリストアする手順を実行できるか?
- MVCCによる不要タプルの蓄積を防ぎ、autovacuumの自動起動閾値を数式に基づいてチューニングできるか?
- マイナーバージョンアップにおいて、事前バックアップからdnf update、ダウングレード切り戻しまでを計画できるか?
- pg_upgradeのハードリンク方式(–link)を用いて、短時間ダウンタイムでメジャー更新を完結できるか?
- ストリーミングレプリケーションを構築し、pg_stat_replicationで遅延監視を行い、リードレプリカを運用できるか?
7.2 次のステップ:第01回アーキテクチャ入門へ
データベース運用を極めるための第一歩は、PostgreSQLがサーバー上でどのようにメモリを確保し、どのようにプロセスを立ち上げてクエリを処理しているかという「内部構造の可視化」から始まります。
まずは以下のリンクから、第01回のアーキテクチャ解説へ進んでください。AlmaLinux 10実機上で実行したプロセスツリーやメモリ確認コマンドのエビデンスとともに、PostgreSQLの動作原理を確実に理解する学習を進めます。
連載第01回はこちら
第01回:PostgreSQLアーキテクチャ入門:プロセス構成とメモリの仕組み
クライアント接続とバックエンドプロセスの関係、共有メモリ(shared_buffers / WAL)と個別メモリ(work_mem / maintenance_work_mem)の境界線を図解と実機ログで論理的に解説します。
【連載目次】PostgreSQL実務運用シリーズ
- 第00回:シリーズ総目次・実機運用ロードマップ(現在の記事)
- 第01回:PostgreSQLアーキテクチャ入門:プロセス構成とメモリの仕組み
- 第02回:PostgreSQLインストール比較:AlmaLinux 10でのAppStreamとPGDG
- 第03回:postgresql.conf基本設定とpg_hba.confアクセス制御の設計
- 第04回:PostgreSQLのロールと権限管理:最小権限で安全に運用する設計
- 第05回:pg_dumpとpg_restore実務入門:カスタム形式と障害復旧
- 第06回:PostgreSQLのVACUUMとANALYZE:肥大化防止と性能維持
- 第07回:PostgreSQLのマイナーバージョンアップ実務:更新と切り戻し
- 第08回:PostgreSQLのメジャー更新手順:pg_upgrade実務攻略
- 第09回:PostgreSQLの冗長化入門:レプリケーション構築手順
