6 サーバアプリケーション(解説)

サイト: LinuC Open Network
コース: 井上先生用コース
ブック: 6 サーバアプリケーション(解説)
印刷者: ゲストユーザ
日付: 2024年 09月 17日(火曜日) 05:06

説明

この章では、PostgreSQLのサーバアプリケーションと関連するコマンドついて解説します。

6.1 データベースの初期化とサーバの起動
6.2 設定ファイルとパラメータ

6.1 データベースの初期化とサーバの起動

PostgreSQLのサーバは、データベースクラスタと呼ばれるデータベースの集合体を管理します。データベースクラスタを構成するディレクトリには、共有カタログテーブル、postgresデータベース、テンプレートデータベース、ユーザが作成したデータベースなどが格納されます。PostgreSQLサーバは、initdbコマンドでデータベースクラスタの初期化を行った後に、pg_ctlコマンドで起動します。

initdbコマンド

initdbは、データベース管理者がOSのシェルから起動します。起動方法は以下の通りです。

initdb [オプション ...] ディレクトリ
  • ディレクトリは、データベースクラスタを格納するディレクトリのパスです。コマンドを起動しているユーザが所有する空のディレクトリか、新たに作成可能なディレクトリでなければなりません。
  • オプションは、データベースクラスタのオプションを指定できます。主なものを以下に示します。
オプション 省略値 説明
--username= (-U) OSのユーザ名 スーパーユーザの名前
慣習的にpostgresを使用
--encoding= (-E) ロケールに依存 デフォルトの文字コード
--locale= OSのロケール デフォルトのロケール
--version (-V)   initdbのバージョンを表示して終了
--help (-?)   initdbに関するヘルプを表示して終了


例えば、postgresユーザが/var/lib/pgsql/newdbディレクトリにデータベースクラスタを作成する場合は、以下のように指定します。

initdb -E utf8 /var/lib/pgsql/newdb


PostgreSQLをインストールした直後のデータベースクラスタの初期化は、postgresql-setup --initdbを使用してください。また、initdbはpg_ctl initdb経由でも呼び出すことができます。

pg_ctlコマンド

pg_ctlはデータベースクラスタの初期化とデータベースサーバ(postgres)の起動、停止を行います。使用方法は以下の通りです。なお、PostgreSQLのデフォルトのデーベースサーバは、/usr/lib/systemd/system/postgresql.service としてOSに登録されています。通常はこれを起動するため、後述するsystemctlコマンドを使用します。

pg_ctl サブコマンド [-D ディレクトリ] [サブコマンドのパラメータ]
  • ディレクトリは、データベースクラスタを格納するディレクトリのパスです。省略時は、環境変数PGDATAの値が使用されます。
  • サブコマンドは、pg_ctlの動作を指定します。以下のものが指定できます。
サブコマンド サブコマンドのパラメータ 説明
init[db] -o オプション 新しいデータベースクラスタを作成(initdbコマンドを起動)
start --log= (-l) ログファイル名 新しいサーバをバックグラウンドで起動
stop --mode= (-m) 停止方法 起動しているサーバを停止
restart --mode= (-m) 停止方法 起動しているサーバを再起動(stop + start)
reload   サーバにSIGHUPシグナルを送り、設定ファイルの再読み込みを実行
status   サーバが起動しているかどうかを確認

他のコマンドと同様に、--version または --help を指定してバージョンまたはヘルプの表示もできます。

例えば、postgresユーザが/var/lib/pgsql/newdbディレクトリに作成したデータベースクラスタでサーバを起動する場合は、以下のように指定します。

pg_ctl start -D /var/lib/pgsql/newdb

ログの出力先はデフォルトのファイルになります。

以下は起動しているサーバを停止するpg_ctlコマンドです。

pg_ctl stop -D /var/lib/pgsql/newdb -m smart

停止方法 smart によって、すべてのクライアントからの接続が切断された後にサーバを停止します。

systemctlコマンド

systemctlはデータベースサーバ(postgres)の起動、停止を行います。使用方法は以下の通りです。

systemctl サブコマンド サービス名
  • サービス名は、PostgreSQLサービスの名前です。通常は、postgresqlで登録されています。
  • サブコマンドは、systemctlの動作を指定します。以下のものが指定できます。
サブコマンド 説明
start サーバをバックグラウンドで起動
stop 起動しているサーバを停止
restart 起動しているサーバを再起動(stop + start)
reload サーバにSIGHUPシグナルを送り、設定ファイルの再読み込みを実行
status サーバが起動しているかどうかを確認
enable サーバの自動起動を有効
disable サーバの自動起動を無効

syetemctl status以外のサブコマンドは、OSのroot権限で実行してください。

6.2 設定ファイルとパラメータ

PostgreSQLのサーバは、起動時に各種のパラメータが記述された設定ファイルを読み込みます。一部のパラメータは、起動後に一時的に変更できます。この節では、重要な設定ファイルであるpostgresql.confとpg_hba.conf、パラメータの設定と表示を行うSQL文であるSETとSHOWについて説明します。

postgresql.conf

postgresql.confファイルは、PostgreSQLサーバの動作に必要な各種パラメータの設定を行うファイルです。ファイルはテキストファイルで、以下の方法でパラメータを記述します。

  • 1行毎に1つのパラメータを指定する
  • パラメータの名前と値は、空白または等号で区切る
  • ハッシュ記号(#)は、以降行末までコメントであることを意味する
  • 単純でない識別子、または数値でないパラメータ値は一重引用符で括る
  • 数値の単位は以下を使用する
    大きさ: B(バイト)、kB(キロバイト)、MB(メガバイト)、GB(ギガバイト)、TB(テラバイト)
    時間: us(マイクロ秒)、ms(ミリ秒)、s(秒)、min(分)、h(時間)、d(日数)

設定できる主なパラメータを以下に示します。

パラメータ 省略値 説明
data_directory ConfigDir データベースクラスタのディレクトリ
listen_addresses localhost サーバが監視するIPアドレス(*は全てのホスト)
port 5432 サーバが監視するポート番号
max_connections 100 データベースサーバに同時接続できる最大数
authentication_timeout 1min クライアント認証を完了するまでの最大時間
password_encryption scram-sha-256 パスワードを暗号化するアルゴリズム
shared_buffers 128MB 共有メモリバッファのために使用するメモリ量
temp_buffers 8MB 一時バッファの最大メモリ量
wal_level replica WALに書かれる情報量(minimal<replica<logical)
log_destination stderr サーバメッセージのログ出力先
autovacuum on 自動バキューム機能を有効にするかどうか
datestyle ISO, YMD 日付・時刻の入力・表示形式
timezone Asia/Tokyo 表示用およびタイムスタンプ解釈用の時間帯


実際のpostgresql.confファイルの一部を以下に示します。

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
#port = 5432                            # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
#unix_socket_directories = '/var/run/postgresql, /tmp'  # comma-separated list of directories
                                        # (change requires restart)

'change requires restart'と記載されているパラメータを変更したときは、サーバのreloadではなく、restartが必要です。

pg_hba.conf

pg_hba.confファイルは、クライアントの認証方法を設定します。ファイルは単純なテキストファイルで、以下の方法で認証方法を記述します。

  • 1行毎に1つの認証方法を指定する
  • 認証方法は原則として、接続方式、データベース、ユーザ、ホスト、認証方法の組み合わせで指定する
  • ファイルの先頭から条件を判定していき、最初に条件が合致した認証方法でクライアントを認証する
  • ハッシュ記号(#)は、以降行末までコメントであることを意味する

設定できる主なパラメータを以下に示します。

パラメータ 意味 設定可能な値
TYPE 接続方式 local | host | hostssl
DATABASE データベース名 all | 名前
USER ユーザ名 all | 名前
ADDRESS IPアドレス all | 0.0.0.0/0 | CIDR表記アドレス
METHOD 認証方法 peer | ident | scram-sha-256 | trust


postgresql.confファイルの例を以下に示します。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             postgres                                peer
# IPv4 local connections:
host    ossdb           all             127.0.0.1/32            scram-sha-256
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

上記の例で、IPv4のローカル接続の場合、ossdbデータベースではscram-sha-256で暗号化されたパスワード認証が行われ、それ以外のデータベースではOSのユーザ名によるident認証が行われます。

SET文

SET文は、postgresql.confファイル等で設定されている実行時のパラメータを一時的に変更します。形式は以下の通りです。

SET [SESSION | LOCAL] パラメータ名 {TO | =} {値 | DEFAULT}
  • SESSIONは現行セッション内での変更、LOCALは現行トランザクション内での変更となります。省略時はSESSIONです。
  • パラメータ名は、変更するパラメータの名前です。SET文では変更できないパラメータもあります。
  • 値は、変更後のパラメータの値です。DEFAULTはSET文実行前の値に再設定します。

例えば、以下のSET文は日付のスタイルを伝統的なSQL形式変更します。

SET datestyle TO sql;

伝統的なSQL形式では、月/日/年 の表示になります。

SHOW文

SHOW文は、postgresql.confファイル等で設定されている実行時のパラメータを表示します。形式は以下の通りです。

SHOW {パラメータ名 | ALL}
  • パラメータ名は、表示するパラメータの名前です。ALLを指定するとすべてのパラメータが表示されます。

例えば、以下のSHOW文は現在のタイムゾーンを表示します。

SHOW timezone;