インストールと標準付属ツールの要点
内容の確認日: 2026-10-29
この分野は出題範囲の S2.1 (インストール方法) と S2.2 (標準付属ツールの使い方) に当たり、50 問中およそ 7 問 (S2.1 が 2 問・S2.2 が 5 問) が出題されます。
コマンドのオプションの文字 (-D・-E・-m など) を問う問題が多いのが特徴です。オプションを丸暗記するより、「何を指定するオプションか」を英語の長い名前 (--pgdata・--encoding・--mode) と結び付けて覚えると忘れにくくなります。
initdb とデータベースクラスタ
initdb は データベースクラスタ (1 つのサーバーが管理するデータベースの集まりと、設定ファイル・WAL などを置くディレクトリ) を作ります。場所は -D (--pgdata) で指定し、省略すると環境変数 PGDATA が使われます。
・-E (--encoding): 新しいデータベースの既定のエンコーディング
・--locale: 既定のロケール (--no-locale は --locale=C と同じ)
・-U (--username): データベースのスーパーユーザーの名前。省略すると、initdb を実行した OS のユーザー名になる
・-W (--pwprompt): スーパーユーザーのパスワードを入力させる
・-k (--data-checksums): データページのチェックサムを有効にする
・-X (--waldir): WAL のディレクトリを別の場所に置く
initdb は OS の root では実行できず、指定するディレクトリは存在しないか空である必要があります。作られたクラスタには、base (データベースごとのファイル)・global (クラスタ全体で共有するカタログ)・pg_wal (WAL)・postgresql.conf・pg_hba.conf などが置かれます。
テンプレートデータベース
initdb は postgres・template0・template1 の 3 つのデータベースを作ります。CREATE DATABASE (createdb) は、指定がなければ template1 を複製して新しいデータベースを作ります。template1 に作ったテーブルや拡張は、その後に作るデータベースに引き継がれます (既存のデータベースは変わりません)。
template0 は初期状態のまま保つためのテンプレートで、接続はできません (datallowconn が偽)。template1 と違うエンコーディングやロケールのデータベースは、template0 から作る必要があります。
SELECT datname, datistemplate, datallowconn FROM pg_database WHERE datname LIKE 'template%' ORDER BY datname;psql -A -t -P null=NULL -f example.sql template0|t|f template1|t|t
CREATE DATABASE legacy TEMPLATE template1 ENCODING 'SQL_ASCII';psql -A -t -P null=NULL -f example.sql
エラー (SQLSTATE 22023)
template1 のエンコーディングが UTF8 なので、違うエンコーディングを指定するとエラーになります (SQLSTATE 22023。メッセージのヒントで template0 を使うよう案内されます)。
pg_ctl でのサーバーの操作
pg_ctl のサブコマンドは init・start・stop・restart・reload・status・promote・logrotate・kill です。start の -l はサーバーのログを書くファイル、-o は postgres に渡すオプションです。
stop (と restart) の停止モードは -m で指定します。
・smart: 新しい接続を受け付けず、既存のクライアントがすべて切断してから停止する
・fast (既定): 実行中のトランザクションをロールバックして接続を切り、正常に停止する
・immediate: 後始末をせずに即座に終了する。次の起動時にクラッシュリカバリ (WAL の再生) が行われる。コミット済みのデータは失われない
reload は設定ファイルを読み直させる (SIGHUP を送る) だけで、接続は切れません。max_connections のような起動時にしか決められない項目は、restart が必要です。promote はスタンバイサーバーをプライマリに昇格させます。
createuser・createdb・dropdb・dropuser
これらはサーバーに接続して CREATE ROLE・CREATE DATABASE などの SQL を実行するラッパーなので、サーバーが起動している必要があります。
・createuser: -s スーパーユーザー、-d データベースを作れる、-r ロールを作れる、-P パスワードを入力させる、-L ログインできない (既定はログインできる)
・createdb: -O 所有者、-T テンプレート、-E エンコーディング。-U は接続に使うロールで、所有者ではない
・dropdb: 接続中のセッションがあると削除できない (13 からは --force で接続を切って削除できる)
・dropuser: 所有するオブジェクトがあるロールは削除できない
psql とメタコマンド
psql の主なオプションは -h (ホスト)・-p (ポート)・-U (ロール)・-d (データベース)・-c (コマンドを 1 つ実行して終了)・-f (ファイルの SQL を実行)・-l (データベースの一覧を表示して終了) です。
\ で始まるメタコマンドは psql 自身が解釈し、セミコロンなしで改行で実行されます。
・一覧: \l データベース、\du ロール、\dn スキーマ、\dt テーブル、\d テーブル名 列の定義
・操作: \c 接続先の切り替え、\i ファイルの実行、\o 結果をファイルへ、\x 拡張表示、\timing 実行時間の表示、\q 終了
\set は psql の変数を設定し、SQL の中の :変数名 を値に置き換えてからサーバーに送ります。文字列として埋め込むときは :'変数名' と書きます。
\set x 10\set name aliceSELECT :x * 2, :'name';psql -A -t -P null=NULL -f example.sql 20|alice
そのほかの付属ツール
・pg_isready: サーバーが接続を受け付けているかを調べる。終了ステータスは 0 受け付けている、1 拒否している (起動中など)、2 応答がない、3 確認しなかった (引数の誤りなど)
・pg_controldata: 制御ファイル (global/pg_control) の内容 (クラスタの状態・最後のチェックポイントの位置など) を表示する。サーバーが停止していても使える
・pg_config: インストールの情報 (プログラムのディレクトリ・ビルド時のオプション・バージョン) を表示する
・pg_resetwal: WAL と制御ファイルの情報を初期化する。WAL の破損で起動できないときの最後の手段で、実行後はデータの整合性が保証されない。サーバーを停止して実行する
試験でよくある引っかけ
initdbの-Uを省略したときスーパーユーザーの名前は、
postgresではなくinitdbを実行した OS のユーザー名になります。template0に接続できないtemplate0は接続できませんが、CREATE DATABASE ... TEMPLATE template0の複製元には指定できます。pg_ctl stopの既定のモード既定は
smartではなくfastです。smartはクライアントの切断を待ちます。immediateでもデータは失われないコミット済みの内容は WAL にあり、次の起動時のリカバリで戻ります。
pg_resetwalを使う場面ではありません。createdbの-Uと-O-Uは接続に使うロール、-Oは作るデータベースの所有者です。psql -lと\lどちらもデータベースの一覧です。ロールの一覧は
\du、テーブルの一覧は\dtです。pg_controldataとpg_config前者はデータベースクラスタの制御ファイル、後者はインストールの情報を表示します。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- LPI-Japan「OSS-DB Silver」(出題範囲)
- PostgreSQL 14 文書「initdb」
- PostgreSQL 14 文書「テンプレートデータベース」
- PostgreSQL 14 文書「pg_ctl」
- PostgreSQL 14 文書「psql」
コード例は、PostgreSQL 14 で実際に実行して結果を確認しています。