Instiq
第2章 · 運用管理·v1.0.0·更新 2026/7/12·読了目安 約10分

変更要約: 初版(主題S2・S2.1〜S2.5)

2.1インストールとクラスタ

この節の要点

PostgreSQLを使い始める最初の一歩であるinitdbと、それが作り出すデータベースクラスタの概念・構造を学びます。クラスタ作成時に自動生成される2つのテンプレートデータベースtemplate0template1の役割の違いを押さえます。

PostgreSQLをインストールしただけでは、まだデータベースは1つも存在しません。サーバーが管理するデータ一式を格納する領域そのものを作る作業が最初に必要で、これがデータベースクラスタの初期化です。この土台の構造と、そこに自動的に組み込まれる仕組みを理解することが、以降の運用管理すべての前提になります。

2.1.1initdb とデータベースクラスタ

  • initdb=PostgreSQLのデータベースクラスタを新規作成するコマンド。指定したディレクトリ(-Dオプションや環境変数PGDATAで指定)配下に、設定ファイルや初期システムカタログ一式を書き込みます。既にクラスタが存在するディレクトリに対して再実行するとエラーになります。
  • データベースクラスタ=1つのinitdbが管理するデータベース群の集合体(1つのPostgreSQLサーバープロセスが提供するデータ全体)。ディスク上では単一のディレクトリツリー(データディレクトリ)として存在し、その中に複数の個別データベースが共存します。1つのクラスタ内で複数のデータベースを作成・削除できますが、クラスタ自体は物理的に1つの領域です。

2.1.2テンプレートデータベース

  • template0初期状態のまま凍結された、変更してはいけないテンプレート。文字コード(エンコーディング)や照合順序(ロケール)が異なる新規データベースを作る際など、特殊なケースでのみ参照します。通常は接続やカスタマイズの対象にしません。
  • template1新規データベース作成時の既定のひな形createdbCREATE DATABASEは、特に指定しなければこのtemplate1をコピーして新しいデータベースを作ります。運用上、全データベース共通で使いたい拡張機能や設定をtemplate1に事前に加えておくと、以後作成する全データベースに自動的に反映される、という活用法があります。
試験ポイント

「initdbはデータベースクラスタを新規作成する」「クラスタ=1つのサーバーが管理するデータベース群全体」「template0は凍結・変更禁止/template1が既定のひな形でCREATE DATABASEはこれをコピーする」が最頻出です。template0とtemplate1の役割の取り違えが典型的な誤答選択肢として繰り返し出ます。

実務での初期セットアップの流れを追うと理解が定着します。まずinitdb -D /var/lib/pgsql/dataのようにデータディレクトリを指定してクラスタを初期化します。このとき、認証方式(pg_hba.confの初期内容)や文字コード・ロケールを--auth--encoding--localeといったオプションで指定でき、クラスタ全体の既定値として以後のデータベース作成に影響します。initdb完了後、クラスタには自動的にpostgresという管理用データベースと、template0template1という2つのテンプレートデータベースが作られています。ここで新規に業務用データベースを1つ作りたければ、createdb myappのように実行しますが、これは内部的にtemplate1をコピーしてmyappという名前のデータベースを作る処理です。もし「クラスタ全体とは異なる文字コードの特殊なデータベースを1つだけ作りたい」という要件が出た場合は、通常のtemplate1では既存の設定が引き継がれてしまうため、代わりに凍結されたtemplate0を明示的に指定(createdb -T template0 --encoding=...)してゼロから作り直す、という使い分けが実務で問われます。

項目役割変更してよいか
initdbクラスタを新規作成(作成操作そのもの)
template0凍結された初期テンプレート不可(特殊なcreatedbでのみ参照)
template1既定のひな形(CREATE DATABASEがコピー)可(共通拡張の事前設定などに利用)
注意

ひっかけ: 「新規データベースはtemplate0をコピーして作られる」は誤りです。既定でコピーされるのはtemplate1で、template0は変更してはいけない凍結テンプレートです。また「initdbは既存のクラスタに新しいデータベースを追加するコマンド」も誤り=initdbはクラスタそのものを新規作成するコマンドで、既存クラスタへのデータベース追加はcreatedbCREATE DATABASEの役割です。

initdb によるクラスタ初期化と template0/template1 の関係を示す図。
initdb → クラスタ → createdb(template から複製)

2.1.3この節のまとめ

  • initdb=データベースクラスタを新規作成。1クラスタ=1サーバーが管理するデータベースクラスタ(複数DBの集合体)
  • template0=凍結・変更禁止(特殊エンコーディング等でのみ参照)・template1=既定のひな形(createdb/CREATE DATABASEがコピー、共通拡張の事前設定にも利用)

進捗の記録にはログインが必要です。

理解度チェック

(軽い確認用)

Q1. 新しいサーバーにPostgreSQLをインストールした直後、まだデータベースクラスタが存在しない。クラスタを新規作成するために実行すべきコマンドは?

Q2. createdbやCREATE DATABASEで特に指定せずに新規データベースを作成した場合、その内容の元になるテンプレートデータベースはどれか?

Q3. クラスタ全体の既定と異なる文字コードで、1つだけ特別なデータベースを作りたい。既存のtemplate1をそのまま使うと既存設定が引き継がれてしまうため不都合がある。この場合の正しい対処は?

理解度を確認第2章「運用管理」の問題を解く