昨日、plproxy とかを試す際に、1台の CentOS マシンで複数の PostgreSQL を立ち上げたので、その時の方法をメモ。環境は、CentOS 5.2 に PostgreSQL 8.3.7 の RPM が入った状態。
基本的には、デフォルトの設定からポート番号とデータディレクトリを変更してやれば、複数の PostgreSQL が起動できる。具体的には、起動スクリプトの設定を変更してやれば良い。 まずは、デフォルトの起動スクリプトをコピーしてやる。
# cd /etc/init.d/ # cp -a postgresql postgresql.5433
コピーした起動スクリプトの以下の部分を変更してやる。今回は 5433 ポートで立ち上げようとしている。PGDATA へ指定するディレクトリ名は何でもいいんだけど、考えるのが面倒なのでポート番号をそのまま付加してやっている。
# Set defaults for configuration variables PGENGINE=/usr/bin PGPORT=5433 PGDATA=/var/lib/pgsql.5433/data if [ -f "$PGDATA/PG_VERSION" ] && [ -d "$PGDATA/base/template1" ] then echo "Using old-style directory structure" else PGDATA=/var/lib/pgsql.5433/data fi PGLOG=/var/lib/pgsql.5433/pgstartup.log
起動する、、、前にデータディレクトリの初期化をしてやる。
# /etc/init.d/postgresql.5433 initdb
初期化が終わったら、今度こそ起動してやる。
# /etc/init.d/postgresql.5433 start
起動状態を見てみる。デフォルトの PostgreSQL(ポート番号 5432)も同時に起動している状態では、次のように2つの postmaster が存在しているはず。
# ps ax | grep postmaster | grep -v grep 2300 ? S 0:00 /usr/bin/postmaster -p 5433 -D /var/lib/pgsql.5433/data 15403 ? S 0:01 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
接続テストをしてみる。
# su - postgres $ psql -p 5433 template1 Welcome to psql 8.3.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit template1=#
接続ができれば、デフォルトの 5432 ではなく 5433 ポートで起動できている。他にも同時に立ち上げたければ、5433 ではなく他のポート番号を使ってやれば良い。
ただし、この状態では、TCP/IP ではなく、UNIX ドメインソケットでの接続である。これは、設定ファイルの postgresql.conf のデフォルトがそうなっているためで、TCP/IP で接続したければ、設定ファイルを変更して PostgreSQL を再起動すれば良い。
最後に(お好みに応じて)OS 起動時に自動的に立ち上がるように設定しておく。
# chkconfig --add postgresql.5433 # chkconfig postgresql.5433 on
設定はこんな感じになる。
# chkconfig --list | grep postgres postgresql 0:off 1:off 2:on 3:on 4:on 5:on 6:off postgresql.5433 0:off 1:off 2:on 3:on 4:on 5:on 6:off
この状態であれば、OS 起動時にポート 5432 と 5433 の2つの PostgreSQL が自動的に起動する。