PostgreSQLの初期設定

(2011.5.29) ページを分離、加筆。

PostgreSQLサーバの初期設定について。

データベース格納先, postgresユーザ

(2011.5.29)

PostgreSQLのサーバプログラム (postmasterデーモン) は、独立した複数のデータベースを同時に管理できます。一つのディレクトリ以下に、実体としてのデータが保存されます。サーバが管理する, データベースの集まりを「データベースクラスタ」といいます。

postmasterデーモンを動かすためのUNIXユーザを作ります。通常, "postgres" という名前にします。

バイナリパッケージを利用する場合

Linuxディストリビューション提供のバイナリパッケージを使う場合、"postgres" ユーザは、あらかじめ登録されています。自分で何かする必要はありません。

また、データベースの保存先は、特に変更しない限り、/var/lib/pgsql/data になっています。

ソースコードから導入

ソースコードから自分でインストールした場合は、rootになって、次のようにします。例えば、/var/lib/postgres/data をデータベースの中身の保存 (格納) 先にしてみます。

# mkdir /var/lib/postgres
# mkdir /var/lib/postgres/data
# /usr/sbin/useradd postgres -d /var/lib/postgres
# chown -R postgres /var/lib/postgres

ディレクトリの所有者をpostgres UNIXユーザにします。

initdb

(2011.5.29)

一つのデータベースをどうこうするのでなく、サーバをまっさらにするのがinitdbコマンドです。実行するのは、PostgreSQL の非互換なバージョンアップのときなどだけ、です。

Fedora Linuxでは、ヘルパスクリプトが用意されているので、rootユーザで、次のようにします。

# /etc/rc.d/init.d/postgresql initdb

(2011.12 ここから)
Fedora 16 Linux では SysVスタイルのinit script が廃止され、ほぼ systemd に移行しました。/etc/rc.d/init.d/postgresql スクリプトの代わりに postgresql-setup コマンドを使います。

initdb は次のようにします。

# postgresql-setup initdb

(2011.12 ここまで)

ソースコードからインストールした場合などは、initdb コマンドを使います。postgresユーザになって、例えば、次のようにします。

# su - postgres
$ export PGDATA=/var/lib/postgres/data
$ /usr/local/pgsql/bin/initdb --encoding=EUC-JP --no-locale

initdbコマンドは、環境変数PGDATAで指定されたディレクトリをデータベースクラスタとして初期化する。さらに, initdbコマンドは、内部で、initdbコマンドを実行したUNIXユーザ (postgres) をデータベーススーパーユーザとして登録する。

データベースの文字コードは、日本語EUC(EUC-JP)にしておきます。localeサポートは害が大きいので、切っておきます。 -- (2007.2) 今ならUTF-8にすべき。

データベースクラスタの初期化に成功すると、次のようなメッセージが表示されます。

Success. You can now start the database server using:

    /usr/local/pgsql/bin/postmaster -D /var/lib/postgres/data
or
    /usr/local/pgsql/bin/pg_ctl -D /var/lib/postgres/data -l logfile start

サーバ基本設定

サーバの設定は, /var/lib/pgsql/data/postgresql.conf ファイルを編集します。例えば、bindするIPアドレスを変更する場合は、listen_addresses を '*' に変更する, など。

Fedora 15 Linux (PostgreSQL 9.0) のpostgresql.confの初期設定は、次のようになっています。

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost', '*' = all
                                        # (change requires restart)
#port = 5432                            # (change requires restart)
max_connections = 100                   # (change requires restart)

初期設定では、TCP/IP経由は有効になってないので、port = のコメントアウトを外してやります。

(2014.3)

Fedora 20では, ポート番号については, postgresql.conf ではなく, systemd の設定ファイルである /usr/lib/systemd/system/postgresql.service ファイルで設定します。

次のようになっている箇所を修正します。

# Port number for server to listen on
Environment=PGPORT=5432

# Location of database directory
Environment=PGDATA=/var/lib/pgsql/data

(2014.3 ここまで)

postgresユーザのパスワード

(2013.2.12, 2013.7.17加筆。)

pgAdmin IIIのようなGUIの管理ツールを使う場合, TCP/IP経由で, postgresユーザでデータベースサーバに接続できなければなりません。

"pg_hba.conf" 設定ファイルが次のようになっている前提, すなわちpostgresユーザがパスワードなしで接続できる状態で, コマンドラインからパスワードを変更します。

(pg_hba.confファイルについては PostgreSQLでの認証の設定 を参照。)

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

あらかじめ, systemctl コマンドで postgresql サーバを開始しておく必要があります。

いったんrootになってから, さらにpostgres UNIXユーザになります。

$ su
# su postgres
$ psql template1
psql (9.2.2)
"help" でヘルプを表示します.

template1=# ALTER USER postgres WITH PASSWORD 'パスワード';
ALTER ROLE
template1=# \q

(2014.3)

対話形式でも, パスワードを変更できます。

template1=# \password
Enter new password: パスワードを入力
Enter it again: 同じパスワードを再度入力

(2014.3 ここまで)