dshimizu/blog/alpha

とりとめのないITブログ

CentOS 6.4へPostgreSQL 9.3のRPMパッケージをインストールする

はじめに

2013年9月9日にオープンソースRDBであるPostgreSQLの最新版となる「PostgreSQL 9.3」が正式にリリースされましたので、CentOS 6.4環境へインストールしてみました。

以下ではCentOS 6.4環境へのPostgreSQL 9.3のインストールからデータベースへ接続するまでを記載しています。

PostgreSQL 9.3のインストール

環境

インストール環境は以下です

プラットフォーム さくらのVPS SSD 1Gモデル
OS CentOS 6.4 x86_64 (64bit)
事前準備

事前に必要なパッケージをインストールします。libossp-uuid.so.16というライブラリが必要になりますので、そのライブラリが含まれるuuidのパッケージをインストールします。
他にも必要なパッケージがあるかもしれませんが、その際は必要なものをインストールします。


# yum install uuid
インストール

スーパーユーザにスイッチします。


$ su -
パスワード:

pgdgリポジトリ(PostgreSQL Yum Repository)をインストールしても良いのですが、リポジトリの管理も手間なので、以下のようにRPMコマンド実行時にRPMファイルのURLを直接指定する形でインストールします。¥で改行していますが、一行で記載いただいて構いません。


# rpm -ihv http://yum.postgresql.org/9.3/redhat/rhel-6.4-x86_64/postgresql93-9.3.0-1PGDG.rhel6.x86_64.rpm \
http://yum.postgresql.org/9.3/redhat/rhel-6.4-x86_64/postgresql93-server-9.3.0-1PGDG.rhel6.x86_64.rpm \
http://yum.postgresql.org/9.3/redhat/rhel-6.4-x86_64/postgresql93-libs-9.3.0-1PGDG.rhel6.x86_64.rpm \
http://yum.postgresql.org/9.3/redhat/rhel-6.4-x86_64/postgresql93-contrib-9.3.0-1PGDG.rhel6.x86_64.rpm \
http://yum.postgresql.org/9.3/redhat/rhel-6.4-x86_64/postgresql93-devel-9.3.0-1PGDG.rhel6.x86_64.rpm

インストールはこれだけで完了です。

起動してみます。


# service postgresql-9.3 start

/var/lib/pgsql/9.3/data is missing. Use "service postgresql-9.3 initdb" to initialize the cluster first.
[FAILED]

データベースクラスタを初期化しろ、と怒られてしまいました。
PostgreSQLを使用できる状態にするには、データベースクラスタ(データベースを格納する領域)を初期化する必要があり、それを実行していないためです。

メッセージにある通りinitdbを実行します。


# service postgresql-9.3 initdb --encoding=UTF8 --no-locale
Initializing database: [ OK ]

指定しているオプションの意味は以下です。データベース作成先ディレクトリ(デフォルト:/var/lib/pgsql/9.3/data)等もここで指定できます。各オプションに関しては必ずしもここで指定する必要がないものもありますので、環境に合わせて指定してください。

  • --encoding: データベースのデフォルトの文字エンコーディングを設定するオプション。ここでは文字エンコーディングUTF-8を指定している。
  • --no-localeは、ロケールを使用しないことを設定するオプション。localeでは文字列処理やメッセージ等を変更できる。--no-localeは--locale=Cと同じことを指し、C ロケール以外を設定すると性能へ影響する可能性もある。

ロケール(--locale)とエンコーディング(--encoding)は同じ値を設定する必要がありますが、encoding=SQL_ASCIIとする場合、またはlocale=C(--no-locale)とする場合は例外です。

これでPostgreSQLを使用できる状態となりました。
再度、起動処理を実行してみます。


# service postgresql-9.3 start
Starting postgresql-9.3 service: [ OK ]

各プロセスが起動していることが分かります。


# ps auxf | grep postgre | grep -v grep
postgres 21428 0.0 0.7 224856 13840 ? S 16:48 0:00 /usr/pgsql-9.3/bin/postmaster -p 5432 -D /var/lib/pgsql/9.3/data
postgres 21430 0.0 0.0 80480 1180 ? Ss 16:48 0:00 \_ postgres: logger process
postgres 21432 0.0 0.0 224856 1432 ? Ss 16:48 0:00 \_ postgres: checkpointer process
postgres 21433 0.0 0.1 224856 2268 ? Ss 16:48 0:00 \_ postgres: writer process
postgres 21434 0.0 0.0 224856 1412 ? Ss 16:48 0:00 \_ postgres: wal writer process
postgres 21435 0.0 0.1 225716 2616 ? Ss 16:48 0:00 \_ postgres: autovacuum launcher process
postgres 21436 0.0 0.0 80612 1488 ? Ss 16:48 0:00 \_ postgres: stats collector process

では、接続してみます。初期ではPostgreSQL側に"postgres"という名前のユーザ、"postgres"という名前のデータベースがありますのでそれに接続してみます、


# psql -U postgres -d postgres
psql: FATAL: Peer authentication failed for user "postgres"

接続できませんでした。これはPostgreSQLのクライアント認証設定が影響しています。

上記の接続はローカルからの接続だったため、-hでホストを指定しなかったので、Unixドメインソケット経由の通信となります。
設定ファイルを見ると、Unixドメインソケット経由での接続時の認証方式はデフォルトではpeerとなっており、OSユーザと接続先DBのユーザと一致していなければ接続できません。
上記の接続の仕方ですと、OS上でpostgresユーザになっていると接続先データベースのユーザと一致しますので接続できます。RPMパッケージをインストールした際に自動的にOS上にpostgresユーザが作成されます。


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

# "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

この状態も手間なので、ローカルの全てのユーザがUnixドメインソケット経由で任意のデータベースに接続することを許可しておきます。
セキュリティを考えるとtrustでは無くmd5などにした方が良いかと思いますが、ここでは考慮しません。


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

# "local" is for Unix domain socket connections only
local all all trust # <- 変更
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident

設定変更後、PostgreSQLを再起動します。


# service postgresql-9.3 restart
Stopping postgresql-9.3 service: [ OK ]
Starting postgresql-9.3 service: [ OK ]

再度接続を試します。


# psql -U postgres -d postgres
psql (9.3.0)
Type "help" for help.

postgres=#

接続できました。
接続を終了するには、\qコマンドを実行します。

以上が、インストールからデータベースへ接続するまでの手順です。
ここでは細かいところまで記載していませんが、引き続き設定を行っていくにあたって、実行ファイルやライブラリへのPATH指定が.bashrcへ必要になったりなど追加の設定が必要になる知れません。

おわりに

ここではPostgreSQL 9.3をインストールしてからデータベースへ接続するまでの基本的な手順を記載しました。
PostgreSQL 9.3ではマテリアライズドビューや1秒以内での高速フェイルオーバー機能、レプリケーション機能改善など、大規模なシステム環境向けの機能追加や耐障害性の強化等がなされているようで、これからもさらに使われていく機会は増えていきそうです。