OSS Fan ~OSSでLinuxサーバ構築~

作成日: 2013/07/28
更新日: 2016/07/04

OSSでLinuxサーバ構築

PostgreSQL 9.0をRHEL 5.9へインストールして初期設定

トップページOSSでLinuxサーバ構築 > PostgreSQL 9.0をRHEL 5.9へインストールして初期設定
このエントリーをはてなブックマークに追加

構成

想定環境

PostgreSQL 9.0構成

サーバ構成

OSバージョン

Red Hat Enterprise Linux 5.9 x86_64

パッケージ一覧

postgresql90-9.0.13-1PGDG.rhel5.x86_64.rpm
postgresql90-libs-9.0.13-1PGDG.rhel5.x86_64.rpm
postgresql90-server-9.0.13-1PGDG.rhel5.x86_64.rpm

サーバ構築

インストール

 PostgreSQLサーバに必要なパッケージを3つインストールします。 RHEL5.9同梱のPostgreSQLパッケージはバージョン8.xと古いので、 コミュニティで公開されているバージョン9.0のパッケージを利用します。 ファイルをダウンロードして /tmp/postgresql90/ に配置し、以下のコマンドを実行します。

# cd /tmp/postgresql90/
# ls -l
total 7372
-rw-r--r-- 1 root root 1629751 Jul 23 23:33 postgresql90-9.0.13-1PGDG.rhel5.x86_64.rpm
-rw-r--r-- 1 root root  225569 Jul 23 23:32 postgresql90-libs-9.0.13-1PGDG.rhel5.x86_64.rpm
-rw-r--r-- 1 root root 5666723 Jul 23 23:33 postgresql90-server-9.0.13-1PGDG.rhel5.x86_64.rpm
# rpm -ihv ./postgresql90-*
warning: ./postgresql90-9.0.13-1PGDG.rhel5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 442df0f8
Preparing...                ########################################### [100%]
   1:postgresql90-libs      ########################################### [ 33%]
   2:postgresql90           ########################################### [ 67%]
   3:postgresql90-server    ########################################### [100%]

設定

(1) postgresユーザの環境変数設定

 環境変数としてPostgreSQLのコマンドへのパスとデータベースクラスタを設定します。

# cd /var/lib/pgsql/
# vi .bash_profile
ファイル名:/var/lib/pgsql/.bash_profile
※ファイルの末尾に追加※
export PATH=$PATH:/usr/pgsql-9.0/bin
export PGDATA=/data/pgdata1

(2) データベースクラスタ用ディレクトリ($PGDATA)作成

 インストールしたRPMパッケージで初期設定されているデータベースクラスタは /var/lib/pgsql/9.0/data/ となっています。 このままでも良いのですが、ディレクトリ階層が深くて分かりづらいため /data/pgdata1/ に変更します。 ディレクトリを作成して必要なパーミッションを設定します。 データベースクラスタ用のディレクトリは管理者ユーザのpostgresユーザのみが参照、更新できるようにします。

# cd /
# mkdir -m 777 /data
# su - postgres
-bash-3.2$ cd /data/
-bash-3.2$ mkdir -m 700 pgdata1

(3) データベースクラスタ作成

 指定したデータベースクラスタ用ディレクトリ内にデータベースクラスタを作成します。 initdbコマンドを使用しますが、必ず管理者ユーザであるpostgresユーザで実行してください。 エンコーディングは UTF8、ロケールは設定しません。 PostgreSQLでロケールを選択した場合、検索性能に問題が出る(性能が低下する?)らしく、 ロケールを選択しないことが推奨とされています。

-bash-3.2$ initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1 --auth=ident
データベースシステム内のファイルの所有者は"postgres"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタはロケールCで初期化されます。
デフォルトのテキスト検索設定はenglishに設定されました。

ディレクトリ/data/pgdata1の権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 32MB
設定ファイルを作成しています ... ok
/data/pgdata1/base/1にtemplate1データベースを作成しています ... ok
pg_authidを初期化しています ... ok
依存関係を初期化しています ... ok
システムビューを作成しています ... ok
システムオブジェクトの定義をロードしています ... ok
変換を作成しています ... ok
ディレクトリを作成しています ... ok
組み込みオブジェクトに権限を設定しています ... ok
情報スキーマを作成しています ... ok
PL/pgSQL サーバサイド言語をロードしています ... ok
template1データベースをバキュームしています ... ok
template1からtemplate0へコピーしています ... ok
template1からpostgresへコピーしています ... ok

成功しました。以下を使用してデータベースサーバを起動することができます。

    postmaster -D /data/pgdata1
または
    pg_ctl -D /data/pgdata1 -l logfile start

 initdb コマンドの --auth=ident オプションは pg_hba.conf の認証設定初期値を決めるものです。 後続の設定手順で書き換えてしまうため指定してもあまり意味がありません。 ただ、省略した場合は認証方式が trust (認証なし)となっているため、 pg_hba.conf の設定を忘れた場合の保険の意味で指定しています。

(4) リッスンアドレスとログ出力設定の変更

 ここではPostgreSQLインスタンスがリッスンするIPアドレスと ログ出力に関する設定を行います。

 初期設定では localhost(127.0.0.1)のみでリッスンする設定になっています。 そのため、他のサーバからTCP/IP接続することができません。 ローカルからもリモートからもTCP/IP接続できるように、 このサーバが持つ全てのIPアドレスでリッスンする設定とします。

 ログの出力先は /data/pgdata1/pg_log/ ディレクトリ内とします。 ログファイル名は postgresql-20130728.log のように ログファイルが作成された年月日を付与します。 ログファイルは7日間経過後に自動でローテーションされ、 新しいログファイルに出力が切り替わるようにします。 一定のファイルサイズに達した際にローテーションされる 機能は使用しません。あくまで日数経過後にローテーションします。 ログファイルには標準では発生したイベントの内容のみが記録されます。 ただ、これでは後から見たときに分かりづらいので、 イベントが発生した年月日時分秒とプロセスIDが出力されるように設定します。 ログメッセージの形式は以下のようになります。

【ログメッセージの出力例】
2013-07-28 02:08:16 JST [3972] LOG: database system was shut down at 2013-07-24 23:49:33 JST
2013-07-28 02:08:16 JST [3975] LOG: autovacuum launcher started

 データベースクラスタ内の postgresql.conf ファイルを設定します。

-bash-3.2$ cd /data/pgdata1/
-bash-3.2$ vi postgresql.conf
ファイル名:/data/pgdata1/postgresql.conf
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
   ↓変更
listen_addresses = '*'                  # what IP address(es) to listen on;

※変更なし※
#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------
log_destination = 'stderr'              # Valid values are combinations of
logging_collector = on                  # Enable capturing of stderr and csvlog
log_directory = 'pg_log'                # directory where log files are written,

log_filename = 'postgresql-%a.log'      # log file name pattern,
   ↓変更
log_filename = 'postgresql-%Y%m%d.log'  # log file name pattern,

※変更なし※
log_truncate_on_rotation = on           # If on, an existing log file of the

log_rotation_age = 1d                   # Automatic rotation of logfiles will
   ↓変更
log_rotation_age = 7d                   # Automatic rotation of logfiles will

※変更なし※
log_rotation_size = 0                   # Automatic rotation of logfiles will

#log_line_prefix = ''                   # special values:
   ↓変更
log_line_prefix = '%t [%p] '            # special values:

(5) スーパーユーザのパスワード設定

 データベースクラスタ作成時点では、スーパーユーザ(データベースユーザ) postgres のパスワードが 設定されていません。一度PostgreSQLのインスタンスを起動してパスワードを設定します。 パスワードを設定する前にクライアント認証を設定すると、ログインできなくなってしまいますので要注意です。 パスワード設定後は再度インスタンスを停止します。 以下では postgres ユーザのパスワードを postgres に設定します。

-bash-3.2$ pg_ctl start -D /data/pgdata1 -w
サーバの起動完了を待っています.....完了
サーバ起動完了
-bash-3.2$ psql
psql (9.0.13)
"help" でヘルプを表示します.

postgres=# alter role postgres with password 'postgres';
ALTER ROLE
postgres-# \q
-bash-3.2$ pg_ctl stop -D /data/pgdata1 -m fast
サーバ停止処理の完了を待っています....完了
サーバは停止しました

(6) クライアント認証の設定

 クライアントからPostgreSQLに接続する際の認証設定を行います。 デフォルトで設定されている内容は全てコメントアウトし、必要な設定をファイルの末尾に追加します。 設定する認証ルールは以下の通りとします。

  • postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 パスワードの入力を求めない。
  • postgresユーザ(管理者ユーザ)以外のユーザ(一般ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 PostgreSQLユーザ名とパスワードで認証する。パスワードはMD5で暗号化して送信する。
  • ユーザに関係なくTCP/IP接続(リモート接続)を行った場合は、PostgreSQLユーザ名とパスワードで認証する。 PostgreSQLが稼働するサーバと同一のネットワークセグメント(192.168.0.0/24)からの接続のみ許可する。 パスワードはMD5で暗号化して送信する。
-bash-3.2$ cd /data/pgdata1/
-bash-3.2$ vi pg_hba.conf
ファイル名:/data/pgdata1/pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     ident
   ↓変更
# "local" is for Unix domain socket connections only
#local   all             all                                     ident ※コメントアウト

# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
   ↓変更
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident ※コメントアウト

# IPv6 local connections:
host    all             all             ::1/128                 ident
   ↓変更
# IPv6 local connections:
#host    all             all             ::1/128                 ident ※コメントアウト

※ファイルの末尾に追加※
local    all             postgres                               ident
local    all             all                                    md5
host     all             all             192.168.0.0/24         md5

 以上で設定は終了です。

(7) インスタンス起動

 PostgreSQLのインスタンスを起動します。 起動には pg_ctl コマンドを使用します。

■pg_ctl コマンドのオプション
オプション説明
startインスタンスを起動します。
-D <データベースクラスタ>データベースクラスタのディレクトリ名を指定する。省略した場合は $PGDATA 環境変数に設定されているディレクトリが使用される。
-wウェイトオプション。通常起動コマンドを実行すると、コマンドはすぐに正常終了し、起動処理はバックグラウンドで実行されます。このオプションを付けると、インスタンスの起動を待って、起動完了後にコマンドが終了します。
-bash-3.2$ pg_ctl start -D /data/pgdata1 -w
サーバの起動完了を待っています.....完了
サーバ起動完了

動作テスト

(1) インスタンス起動

 PostgreSQLのインスタンスが起動していない場合は起動します。

-bash-3.2$ pg_ctl start -D /data/pgdata1 -w
サーバの起動完了を待っています.....完了
サーバ起動完了

(2) プロセス起動確認

 PostgreSQLのプロセスが起動していることを確認します。 今回の設定ではマスタサーバプロセス1つとワーカプロセス5つが起動します。

-bash-3.2$ ps -ef | grep postgres
(前略)
                                                ↓マスタサーバプロセス(1つ)
postgres  3970     1  0 02:08 pts/0    00:00:00 /usr/pgsql-9.0/bin/postgres -D /data/pgdata1
                                                ↓ワーカプロセス(5つ)
postgres  3971  3970  0 02:08 ?        00:00:00 postgres: logger process
postgres  3973  3970  0 02:08 ?        00:00:00 postgres: writer process
postgres  3974  3970  0 02:08 ?        00:00:00 postgres: wal writer process
postgres  3975  3970  0 02:08 ?        00:00:00 postgres: autovacuum launcher process
postgres  3976  3970  0 02:08 ?        00:00:00 postgres: stats collector process
(後略)

(3) ログ出力確認

 設定したログファイルに起動ログが出力されていることを確認します。

-bash-3.2$ tail /data/pgdata1/pg_log/postgresql-20130728.log
2013-07-28 02:08:16 JST [3972] LOG:  database system was shut down at 2013-07-24 23:49:33 JST
2013-07-28 02:08:16 JST [3975] LOG:  autovacuum launcher started
2013-07-28 02:08:16 JST [3970] LOG:  database system is ready to accept connections

(4) SQL実行確認

 psqlコマンドで、SQLを実行できることを確認します。

-bash-3.2$ psql
psql (9.0.13)
"help" でヘルプを表示します.

postgres=# select now();
              now
-------------------------------
 2013-07-28 02:40:51.761354+09
(1 行)

postgres=# select oid, datname from pg_database;
  oid  |  datname
-------+-----------
     1 | template1
 11818 | template0
 11826 | postgres
(3 行)

postgres=# \q
-bash-3.2$

(5) インスタンス停止

 PostgreSQLのインスタンスを停止します。起動と同様に、停止にも pg_ctl コマンドを使用します。 コマンドのオプションの意味は起動の場合と同じです。

-bash-3.2$ pg_ctl stop -D /data/pgdata1 -m fast
サーバ停止処理の完了を待っています....完了
サーバは停止しました

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会

■■■ 当サイトは Internet Explorer 11 と Mozilla Firefox 43 で動作確認済みです。 ■■■