PostgreSQL入門:インストールから運用まで

このページでは、強力なオープンソースデータベース「PostgreSQL」のインストールから基本的な運用方法までを解説します。

DBMSの選定

システム開発において、どのデータベース管理システム(DBMS)を選ぶかは非常に重要な決定です。本サイトではPostgreSQLを使用しますが、実際のプロジェクトでは要件に応じて様々なDBMSを比較検討します。

DBMS選定の主な検討項目は以下の通りです。

[選定条件]

  1. 費用: 初期導入費用(ライセンス料)と運用費用(保守、サポート料)を比較します。PostgreSQLのようなOSSは初期費用が掛からない点が魅力です。
  2. 対応OS: Windows環境ではMicrosoft SQL Server、Linux環境ではPostgreSQLやMySQLが広く使われるなど、OSとの親和性も考慮します。
  3. サポート要件: 商用データベース(Oracle, SQL Serverなど)は手厚い公式サポートが受けられます。OSSの場合、コミュニティベースのサポートが中心となりますが、有償のサードパーティサポートも存在します。
  4. 機能・性能要件: トランザクション性能、高可用性(冗長化)、バックアップ・リカバリ機能、セキュリティ要件(監査ログなど)がシステムの要求を満たすか評価します。
  5. 実績と知見: 導入実績が豊富か、社内や市場に知見を持つエンジニアが多いかも重要な判断材料です。

PostgreSQLの主な特徴

PostgreSQLが選ばれる理由となる、いくつかの重要な特徴を紹介します。

  • オープンソース: PostgreSQLライセンス(BSDライセンスに類似)に基づき、商用・非商用を問わず無料で利用・改変・再配布が可能です。
  • 多機能・標準準拠: SQL規格への準拠度が高く、JSONB型のような非構造化データを扱う機能や、豊富な拡張機能(PostGISなど)も魅力です。
  • MVCC(多版型同時実行制御): 読み取り処理と書き込み処理が互いにブロックしない仕組みにより、高い同時実行性能を実現します。
  • 追記型アーキテクチャ: 更新時に新しいデータを追記する方式のため、定期的なメンテナンス(VACUUM)が必要ですが、同時実行性能の向上やポイントインタイムリカバリに貢献します。
  • 活発なコミュニティ: 全世界に開発者とユーザーのコミュニティがあり、日本PostgreSQLユーザ会のように地域コミュニティの活動も活発です。

PostgreSQLのインストール

ここでは、Linux OSにPostgreSQLをインストールする手順を解説します。OSとしては、現在主流のRHELクローン(Rocky Linux, AlmaLinux)やUbuntuが推奨されます。

注意: 元記事のCentOS 7はサポートが終了しているため、ここではRocky Linux 9を例に説明します。コマンドは管理者権限(`root`または`sudo`)で実行してください。

1. PostgreSQL公式リポジトリの追加

# dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

2. 古いモジュールの無効化

# dnf -qy module disable postgresql

3. PostgreSQLサーバーのインストール (バージョン16の例)

# dnf -y install postgresql16-server

※`postgresql16`の部分を`postgresql15`のように変更することで、インストールするメジャーバージョンを指定できます。

4. データベースクラスタの初期化

# /usr/pgsql-16/bin/postgresql-16-setup initdb

5. PostgreSQLサービスの起動と自動起動設定

# systemctl enable --now postgresql-16

6. 動作確認

# su - postgres
$ psql
psql (16.3)
Type "help" for help.

postgres=# \q
$ exit

`postgres=#` というプロンプトが表示されれば、正常にインストールと起動が完了しています。

データベースクラスタの構造

`initdb`コマンドで作成される「データベースクラスタ」は、データベースのデータや設定ファイルを格納するディレクトリ群です。デフォルトでは `/var/lib/pgsql/16/data/` に作成されます。

トラブルシューティング時に重要となる主要なファイルとディレクトリを把握しておきましょう。

  • `postgresql.conf`: サーバ全体の動作を制御するメインの設定ファイル。メモリ割り当てやログ設定などを変更します。
  • `pg_hba.conf`: クライアント認証を設定するファイル。どのIPアドレスからどのユーザーがどの認証方式で接続できるかを定義します。
  • `base/`: 各データベースの実データが格納されるディレクトリ。
  • `pg_wal/`: トランザクションログ(Write-Ahead Log)が格納されるディレクトリ。障害復旧やレプリケーションに不可欠です。
  • `log/`: (設定による)ログファイルが出力されるディレクトリ。

PostgreSQLの基本コマンド (`psql`)

`psql`はPostgreSQL標準の対話型クライアントツールです。SQLの実行だけでなく、`\`(バックスラッシュ)から始まる「メタコマンド」で様々な管理操作が可能です。

[よく使うメタコマンド]

\?
メタコマンドのヘルプを表示
\q
psqlを終了
\l
データベース一覧を表示
\c [DB名]
指定したデータベースに接続
\dt
テーブル一覧を表示
\d [テーブル名]
テーブルの定義詳細を表示
\du
ロール(ユーザー)一覧を表示
\conninfo
現在の接続情報を表示

PostgreSQLのアーキテクチャ概要

PostgreSQLの性能を理解するため、主要なプロセスとメモリ構造について簡単に触れます。

[主要プロセス]

  • Postmaster: 親プロセス。クライアントからの接続要求を受け付け、子プロセス(Postgres)をフォークします。
  • Postgres: バックエンドプロセス。クライアント接続ごとに1つ起動し、クエリの実行を担当します。
  • Writer: 共有バッファの内容をディスクに書き出すプロセス。
  • WAL Writer: WALバッファの内容を永続的なストレージに書き込むプロセス。
  • Autovacuum: 不要領域を自動的に回収・再利用可能にするためのメンテナンスプロセス。

[主要メモリ領域]

  • Shared Buffers: 複数プロセスで共有されるメインメモリ領域。ディスクから読み込んだデータページをキャッシュし、I/Oを削減します。
  • Work Memory: 各バックエンドプロセスが個別に使うメモリ領域。ソートやハッシュ結合などの処理で使用されます。
  • WAL Buffers: トランザクションログを一時的に保持するバッファ。
クライアントがPostmasterに接続し、専用のPostgresプロセスが起動され、共有メモリを介してデータにアクセスする様子を示す図。