小技プログラミング

CentOSにPostgreSQL9.3をインストール

PostgreSQL9.3のインストールと初期化を行い、基本的な設定をして利用可能な状態までの流れです。

【環境】
CentOS 5.10 x86_64

1.libossp-uuidライブラリをインストール

postgresql93-contribの依存関係でlibossp-uuid.so.15ライブラリが必要になるためuuidを事前にインストールしておきます。

EPELリポジトリを追加

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

明示的に指定されない限り利用しないように無効化設定します。
全てenabled=1⇒enabled=0に変更します。

# sed -i -e "s/enabled=1/enabled=0/" /etc/yum.repos.d/epel.repo

無効化を確認

# cat /etc/yum.repos.d/epel.repo|grep enabled
enabled=0
enabled=0
enabled=0

uuidをインストール

# yum install --enablerepo=epel uuid

2.PostgreSQL9.3のインストールと初期化

PGDGリポジトリを追加

# rpm -Uvh http://yum.postgresql.org/9.3/redhat/rhel-5.10-x86_64/pgdg-centos93-9.3-1.noarch.rpm

明示的に指定されない限り利用しないように無効化設定します。
全てenabled=1⇒enabled=0に変更します。

# sed -i -e "s/enabled=1/enabled=0/" /etc/yum.repos.d/pgdg-93-centos.repo

無効化を確認

# cat /etc/yum.repos.d/pgdg-93-centos.repo|grep enabled
enabled=0
enabled=0

PostgreSQL9.3インストール

# yum install --enablerepo=pgdg93 postgresql93*

PostgreSQLの初期化
初期化時にロケール、エンコーディング設定も行います

# sudo su - postgres
$ /usr/pgsql-9.3/bin/initdb --encoding=UTF8 --no-locale

--encodingでPosgreSQL全体で使用するデフォルト文字コードを指定しておきます。
--no-localeはCロケールを使用することを意味します。--locale=Cと指定しても同じです。
これをやっておかないとソート等で不都合が生じる可能性があります。

一旦postgresユーザを抜けてサービスを起動します

$ exit
# /etc/rc.d/init.d/postgresql-9.3 start

サービス自動起動設定

# chkconfig postgresql-9.3 on

ロケール確認
再度postgresユーザになりロケールの設定を確認します。
ロケールCの場合setting欄に C と表示されます。

# sudo su - postgres
-bash-4.1$ psql
postgres=# SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
    name     | setting |  context
-------------+---------+-----------
 lc_collate  | C       | internal
 lc_ctype    | C       | internal
 lc_messages | C       | superuser
 lc_monetary | C       | user
 lc_numeric  | C       | user
 lc_time     | C       | user

文字コード確認
UTF8でデータベースが作成されている場合、pg_encoding_to_char欄 が UTF8 の表示になります。

postgres=# SELECT datname, pg_encoding_to_char(encoding) FROM pg_database;
  datname  | pg_encoding_to_char
-----------+---------------------
 template1 | UTF8
 template0 | UTF8
 postgres  | UTF8

postgresユーザのパスワード設定

postgres=# alter role postgres with password 'パスワードを入力';

psqlの終了

postgres=# \q

postgresユーザ終了

-bash-4.1$ exit

3.postgresql.confの設定

必要に応じてpostgresql.confの設定を変更します。

# vi /var/lib/pgsql/9.3/data/postgresql.conf

○利用可能な全てのIPインタフェースのネットワーク経由接続を許可
listen_addresses = '*' # what IP address(es) to listen on;

○データベースサーバに同時接続する最大数を変更
max_connections = 250

○共有メモリバッファ用メモリ量の変更
shared_buffers = 1024MB

○一時ディスクファイルに書き込む前に、内部並べ替えとハッシュテーブル操作が使用するメモリ容量
work_mem = 16MB

○WALデータ用の共有メモリ内のバッファ数
wal_buffers = -1

○ランダムディスクページをシークするためにディスクにかける時間
random_page_cost = 2.0

○PostgreSQL が使用するバッファ領域の大きさの推定値
※搭載メモリの1/2に設定することが通常の保守的な設定。
effective_cache_size = 2048MB

○ログファイル作成ディレクトリ
log_directory = '/var/log/pgsql'

○スロークエリ出力設定
log_min_duration_statement = 3s

○ログの出力内容を設定
log_line_prefix = '%t,%h,%u,%d,%l,'

○自動VACUUMログ設定(指定時間以上実行された活動をログに残す。-1は無効設定)
log_autovacuum_min_duration = 1min

○自動VACUUM操作に使用されるコスト限界値
autovacuum_vacuum_cost_limit = 200

ログディレクトリが無ければ作成

# mkdir /var/log/pgsql

所有者、グループを変更

# chown postgres:postgres /var/log/pgsql

4.PostgreSQL認証設定

PostgreSQLへログイン時の認証設定を必要に応じて変更します。
ここではWEBサーバのIPを192.168.1.111と仮定して設定しています。

# vi /var/lib/pgsql/9.3/data/pg_hba.conf

# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
# ローカルUnixドメインソケット接続を無条件許可
local all all trust

# IPv4 local connections:
# IPv4ループバックアドレス及び192.168.1.111からのアクセスをpassword認証で許可
host all all 127.0.0.1/32 password
host all all 192.168.1.111/32 password

# IPv6 local connections:
# IPv6ループバックアドレスアクセスをpassword認証で許可
host all all ::1/128 password

PostgreSQLサービス再起動(設定内容をリロード)

# /etc/rc.d/init.d/postgresql-9.3 restart

5.ファイアウォール設定

postgreSQLポート開放
iptablesを編集して5432ポートへのアクセスを許可します。

# vi /etc/sysconfig/iptables

-A INPUT -p tcp -m tcp -s 192.168.1.111 --dport 5432 -j ACCEPT

iptables再起動

# /etc/rc.d/init.d/iptables restart

PostgreSQL接続確認
WEBサーバとDBサーバが別の場合の接続確認です。
WEBサーバより以下コマンドで接続して、DB一覧が表示される事を確認します。

# psql -h <DBサーバのIP> -p 5432 -U postgres
User name: postgres
Password: パスワード入力
postgres=# \l

(psqlコマンド接続オプション)

-h, --host=ホスト名 データベースサーバーのホストまたはソケットのディレクトリ(デフォルト: "ローカルソケット")
-p, --port=ポート番号 データベースサーバーのポート番号(デフォルト: "5432")
-U, --username=ユーザー名 データベースのユーザ名(デフォルト: "root")
-w, --no-password パスワード入力を要求しない
-W, --password パスワードプロンプトを強制表示する(本来は自動的に表示されるはずです)

その他のオプションについては# psql --helpを実行して参照してください。