dshimizu/blog/alpha

とりとめのないITブログ

CentOS 7でPostgreSQL 9.2のRPMパッケージをインストールしてsystemdを使って起動する

はじめに

CentOS 7.0へPostgreSQLRPMパッケージをインストールし、systemd経由で起動させるための備忘録です。2014/8/31時点でCentOS 7.0のBaseリポジトリに登録されているPostgreSQLのバージョンは9.2.7-1でした。

PostgreSQLのインストールと起動

環境

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

プラットフォーム さくらのVPS (SSD 1G)
OS CentOS 7.0 x86_64 (64bit)
PostgreSQLRPMパッケージのインストール

PostgreSQLRPMパッケージをインストールします。Baseリポジトリにパッケージが存在するので、yumでインストールします。


% sudo yum install postgresql postgresql-server postgresql-libs postgresql-devel postgresql-contrib
PostgreSQLの起動

起動を試みますが失敗します。


% sudo systemctl start postgresql.service
[sudo] password for shimizu:
Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.

詳細を観るためにstatusを確認しろ、といったメッセージが出ますのでとりあえず確認してみます。PostgreSQLのデータディレクトリがない、といった内容のメッセージが出力されているようです。


% sudo systemctl status postgresql.service
postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
Active: failed (Result: exit-code) since 日 2014-08-31 21:36:51 JST; 16s ago
Process: 6571 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=1/FAILURE)

PostgreSQLのユニットファイル/usr/lib/systemd/system/postgresql.serviceでデータディレクトリに何が指定されているかを確認してみると/var/lib/pgsql/dataが指定されていることがわかります。
データディレクトリの場所を変更したければ、この項目を修正します。ここでは変更せずに進めます。


% cat /usr/lib/systemd/system/postgresql.service
・・・
# Location of database directory
Environment=PGDATA=/var/lib/pgsql/data
・・・

指定されているデータディレクトリを作成します。


% sudo mkdir -p /var/lib/pgsql/data

所有者、所有グループをpostgresへ変更します。


% sudo chown postgres:postgres /var/lib/pgsql/data

postgresユーザへスイッチします。


% sudo -i -u postgres

postgresユーザでデータベースクラスタを初期化します。


-bash-4.2$ initdb -D '/var/lib/pgsql/data'
データベースシステム内のファイルの所有者は"postgres"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタロケール"ja_JP.UTF-8"で初期化されます。
したがってデフォルトのデータベース符号化方式はUTF8に設定されました。
initdb: ロケール"ja_JP.UTF-8"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。

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

警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ン、または、--auth-localおよび--auth-hostを使用することで変更するこ
とができます。

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

postmaster -D /var/lib/pgsql/data
または
pg_ctl -D /var/lib/pgsql/data -l logfile start

これで準備が整いました。postgresユーザからログアウトします。


-bash-4.2$ exit

改めて起動を試みます。


% sudo systemctl start postgresql.service

状態を確認してみます。


% sudo systemctl status postgresql.service
postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
Active: active (running) since 日 2014-08-31 22:07:22 JST; 20s ago
Process: 7027 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
Process: 7021 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 7031 (postgres)
CGroup: /system.slice/postgresql.service
├─7031 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
├─7032 postgres: logger process
├─7034 postgres: checkpointer process
├─7035 postgres: writer process
├─7036 postgres: wal writer process
├─7037 postgres: autovacuum launcher process
└─7038 postgres: stats collector process

8月 31 22:07:22 www4242gi.sakura.ne.jp systemd[1]: Started PostgreSQL database server.

プロセスを確認してみます。


% ps auxfwww | grep postgres
shimizu 7140 0.0 0.0 112656 988 pts/0 S+ 22:47 0:00 \_ grep --color=auto postgres
postgres 7031 0.0 0.5 233264 9464 ? S 22:07 0:00 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
postgres 7032 0.0 0.0 193012 1460 ? Ss 22:07 0:00 \_ postgres: logger process
postgres 7034 0.0 0.0 233264 1668 ? Ss 22:07 0:00 \_ postgres: checkpointer process
postgres 7035 0.0 0.1 233264 1940 ? Ss 22:07 0:00 \_ postgres: writer process
postgres 7036 0.0 0.0 233264 1444 ? Ss 22:07 0:00 \_ postgres: wal writer process
postgres 7037 0.0 0.1 234088 2932 ? Ss 22:07 0:00 \_ postgres: autovacuum launcher process
postgres 7038 0.0 0.0 193008 1672 ? Ss 22:07 0:00 \_ postgres: stats collector process

問題ないようです。

PostgreSQLのデータベースへの接続

データベースにログインしてみます。
※デフォルトのpg_hba.confの設定ではlocalからの接続がtrust(PostgreSQLデータベースサーバに接続できる全てのユーザが、任意のPostgreSQLユーザとしてパスワードなしでログインすることを許可する)設定になっていますので、どのOSユーザからでもログインできるはずです。


% psql -U postgres
psql (9.2.7)
"help" でヘルプを表示します.

postgres=#

問題ないようです。
接続を終了するには、\qを入力します。

おわりに

CentOS 7.0へPostgreSQL 9.2のRPMパッケージをインストールしてからPostgreSQLを起動して接続するまでの基本的な手順を記載しました。systemdはまだよく分かりません。

参考