[pgsql-jp: 41681] Re: 複数のインスタンスを一台のサーバで起動させたい

mitani mitani @ sraw.co.jp
2014年 6月 16日 (月) 15:27:41 JST


三谷@広島です。

起動停止スクリプトのパラメータでinitdbをされたのですね。

このスクリプトではDBクラスタは環境変数($PGDATA)固定になっているようですので、
このままでは、1つしかDBクラスタが作成できないようです。

DBクラスタを作成するユーザで以下のコマンドを叩いてみてはどうでしょうか。
/usr/pgsql-9.2/bin/initdb -D '書込み権限のあるDBクラスタのパス'

作成したDBクラスタの下にpostgresql.confという設定ファイルが出来ますので、
その中の
#port = 5432
の部分を編集してポート番号を変更してください。
port = '任意のポート番号'

DBサーバの起動は
/usr/pgsql-9.2/bin/pg_ctl start -p '指定したポート番号' -D '作成したDBクラスタのパス'

DBサーバの停止は
/usr/pgsql-9.2/bin/pg_ctl stop -D '作成したDBクラスタのパス'

で行うことができます。

DBクラスタは一度作成しておけば、毎回作り直す必要はないので、
DBサーバの起動、停止だけをスクリプトに追加しておいてもよいかもしれません。

お試しください。

--


On Mon, 16 Jun 2014 13:29:47 +0900
"Sinji Onuma" <oonumas @ comsystechno.co.jp> wrote:

> その通りですね
> 
> 
> 以下の手順で実行しています。
> 
> 1.rpmをインストール
> 2.postgresをインストール
>      #yum install postgresql92-server
>      #yum install postgresql92-devel
>      #yum install postgresql92-contrib
> 
> 3.データベースの初期化
>     # /etc/rc.d/init.d/postgresql-9.2 initdb
> 4.設定変更
>      #vi /var/lib/pgsql/9.2/data/postgresql.conf
> 
> =======================================================================
> #listen_addresses = 'localhost'        # what IP address(es) to listen on;
> listen_addresses = '*'            # what IP address(es) to listen on;
> 
> 
> 
> #log_line_prefix = ''            # special values:
> log_line_prefix = '%t %u %d'         # special values:
> 
> ========================================================================
> 
> 5、通信ポートを開ける
> #vi  /etc/sysconfig/iptables
> 以下を追加する
> =================================================
> -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
> -A INPUT -p tcp -m state --state NEW -m tcp --dport 3690 -j ACCEPT
> -A INPUT -p udp -m state --state NEW -m udp --dport 3690 -j ACCEPT
> -A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
> -A INPUT -p tcp -m state --state NEW -m tcp --dport 8089 -j ACCEPT
> -A INPUT -p udp -m state --state NEW -m udp --dport 8089 -j ACCEPT
> -A INPUT -p tcp -m state --state NEW -m tcp --dport 8443 -j ACCEPT
> -A FORWARD -j REJECT --reject-with icmp-host-prohibited
> -A INPUT -p tcp -m tcp --dport 5432 -j ACCEPT
> =================================================
> 修正後、再起動する
> #/etc/rc.d/init.d/iptables restart
> 
> 6,接続出来るクライアントの設定
> #vi /var/lib/pgsql/9.2/data/pg_hba.conf
> 以下を追加する
> =========================================
> host all all 0.0.0.0/0 trust
> =========================================
> 
> ※※ここまでは、問題なく確認済みです。
> 
> 
> 7.新規ユーザ「postgres2」を作成
> 8.以下のコマンドで、ディレクトリ、権限を修正
> # mkdir /home/postgres2/pgsql/9.2/data
> # chown -R postgres2:postgres2 /home/postgres2/pgsql/9.2/data
> # chmod 700 /home/postgres2/pgsql/9.2/data
> 
> 9. init.d スクリプトの作成
> 
> # cd /etc/init.d
> # cp -ip postgresql-9.2 postgresql2-9.2
> 
> postgresql2-9.2のスクリプトを修正
> ===================================================
> #!/bin/sh
> #
> # postgresql    This is the init script for starting up the PostgreSQL
> #               server.
> #
> # chkconfig: - 64 36
> # description: PostgreSQL database server.
> # processname: postmaster
> # pidfile="/var/run/${NAME}.pid"
> 
> # This script is slightly unusual in that the name of the daemon 
> (postmaster)
> # is not the same as the name of the subsystem (postgresql)
> 
> # Version 9.0 Devrim Gunduz <devrim @ gunduz.org>
> # Get rid of duplicate PGDATA assignment.
> # Ensure pgstartup.log gets the right ownership/permissions during initdb
> 
> # Version 9.1 Devrim Gunduz <devrim @ gunduz.org>
> # Update for 9.1
> # Add an option to initdb to specify locale (default is $LANG):
> # service postgresql initdb tr_TR.UTF-8
> 
> # Version 9.2 Devrim Gunduz <devrim @ gunduz.org>
> # Update for 9.2
> 
> # Version 9.2.1 Devrim Gunduz <devrim @ gunduz.org>
> # Fix version number in initdb warning message, per Jose Pedro Oliveira.
> # Add new functionality: Upgrade from previous version.
> # Usage: service postgresql-9.2 upgrade
> 
> # Version 9.2.3 Devrim Gunduz <devrim @ gunduz.org>
> # Fix longstanding bug: Enable pidfile and lockfile variables to be defined
> # in sysconfig file.
> # Use $pidfile in status().
> 
> # Version 9.2.4 Devrim Gunduz <devrim @ gunduz.org>
> # Fix pid file name in init script, so that it is more suitable for
> # multiple postmasters. Per suggestion from Andrew Dunstan. Fixes #92.
> 
> # Version 9.2.5 Devrim Gunduz <devrim @ gunduz.org>
> # Remove extra whitespace in upgrade() code, per report from Igor Poteryaev.
> 
> # Version 9.2.6 Devrim Gunduz <devrim @ gunduz.org>
> # Add process name to the status() call. Patch from Darrin Smart
> 
> # PGVERSION is the full package version, e.g., 9.2.0
> # Note: the specfile inserts the correct value during package build
> PGVERSION=9.2.8
> # PGMAJORVERSION is major version, e.g., 9.2 (this should match PG_VERSION)
> PGMAJORVERSION=`echo "$PGVERSION" | sed 's/^\([0-9]*\.[0-9]*\).*$/\1/'`
> PGPREVMAJORVERSION=9.1
> 
> # Source function library.
> INITD=/etc/rc.d/init.d
> . $INITD/functions
> 
> # Get function listing for cross-distribution logic.
> TYPESET=`typeset -f|grep "declare"`
> 
> # Get network config.
> . /etc/sysconfig/network
> 
> # Find the name of the script
> NAME=`basename $0`
> if [ ${NAME:0:1} = "S" -o ${NAME:0:1} = "K" ]
> then
>     NAME=${NAME:3}
> fi
> 
> # For SELinux we need to use 'runuser' not 'su'
> if [ -x /sbin/runuser ]
> then
>     SU=runuser
> else
>     SU=su
> fi
> 
> # Define variable for locale parameter:
> LOCALEPARAMETER=$2
> 
> # Set defaults for configuration variables
> PGENGINE=/usr/pgsql-9.2/bin
> PGPORT=5432
> PGDATA=/var/lib/pgsql/9.2/data
> PGLOG=/var/lib/pgsql/9.2/pgstartup.log
> # Log file for pg_upgrade
> PGUPLOG=/var/lib/pgsql/$PGMAJORVERSION/pgupgrade.log
> 
> lockfile="/var/lock/subsys/${NAME}"
> pidfile="/var/run/${NAME}.pid"
> 
> # Override defaults from /etc/sysconfig/pgsql if file is present
> [ -f /etc/sysconfig/pgsql/${NAME} ] && . /etc/sysconfig/pgsql/${NAME}
> 
> export PGDATA
> export PGPORT
> 
> [ -f "$PGENGINE/postmaster" ] || exit 1
> 
> script_result=0
> 
> start(){
>     [ -x "$PGENGINE/postmaster" ] || exit 5
> 
>     PSQL_START=$"Starting ${NAME} service: "
> 
>     # Make sure startup-time log file is valid
>     if [ ! -e "$PGLOG" -a ! -h "$PGLOG" ]
>     then
>         touch "$PGLOG" || exit 1
>         chown postgres2:postgres "$PGLOG"
>         chmod go-rwx "$PGLOG"
>         [ -x /sbin/restorecon ] && /sbin/restorecon "$PGLOG"
>     fi
> 
>     # Check for the PGDATA structure
>     if [ -f "$PGDATA/PG_VERSION" ] && [ -d "$PGDATA/base" ]
>     then
>         # Check version of existing PGDATA
> 
>         if [ x`cat "$PGDATA/PG_VERSION"` != x"$PGMAJORVERSION" ]
>         then
>             SYSDOCDIR="(Your System's documentation directory)"
>             if [ -d "/usr/doc/postgresql-$PGVERSION" ]
>             then
>                 SYSDOCDIR=/usr/doc
>             fi
>             if [ -d "/usr/share/doc/postgresql-$PGVERSION" ]
>             then
>                 SYSDOCDIR=/usr/share/doc
>             fi
>             if [ -d "/usr/doc/packages/postgresql-$PGVERSION" ]
>             then
>                 SYSDOCDIR=/usr/doc/packages
>             fi
>             if [ -d "/usr/share/doc/packages/postgresql-$PGVERSION" ]
>             then
>                 SYSDOCDIR=/usr/share/doc/packages
>             fi
>             echo
>             echo $"An old version of the database format was found."
>             echo $"You need to upgrade the data format before using 
> PostgreSQL."
>             echo $"See $SYSDOCDIR/postgresql-$PGVERSION/README.rpm-dist for 
> more information."
>             exit 1
>         fi
>     else
>         # No existing PGDATA! Warn the user to initdb it.
> 
>         echo
>         echo "$PGDATA is missing. Use \"service postgresql-$PGMAJORVERSION 
> initdb\" to initialize the cluster first."
>         echo_failure
>         echo
>         exit 1
>      fi
> 
>     echo -n "$PSQL_START"
> #    $SU -l postgres -c "$PGENGINE/postmaster -p '$PGPORT' -D '$PGDATA' 
> ${PGOPTS} &" >> "$PGLOG" 2>&1 < /dev/null
>     $SU -l postgres2 -c "$PGENGINE/postmaster -p '$PGPORT' -D '$PGDATA' 
> ${PGOPTS} &" >> "$PGLOG" 2>&1 < /dev/null #ユーザ変更
>     sleep 2
>     pid=`head -n 1 "$PGDATA/postmaster.pid" 2>/dev/null`
>     if [ "x$pid" != x ]
>     then
>         success "$PSQL_START"
>         touch "$lockfile"
>         echo $pid > "$pidfile"
>         echo
>     else
>         failure "$PSQL_START"
>         echo
>         script_result=1
>     fi
> }
> 
> stop(){
>     echo -n $"Stopping ${NAME} service: "
>     if [ -e "$lockfile" ]
>     then
> #      $SU -l postgres -c "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" > 
> /dev/null 2>&1 < /dev/null
>         $SU -l postgres2 -c "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" 
>  > /dev/null 2>&1 < /dev/null #ユーザ変更
>         ret=$?
>         if [ $ret -eq 0 ]
>         then
>             echo_success
>             rm -f "$pidfile"
>             rm -f "$lockfile"
>         else
>             echo_failure
>             script_result=1
>         fi
>         else
>             # not running; per LSB standards this is "ok"
>             echo_success
>         fi
>         echo
> }
> 
> restart(){
>     stop
>     start
> }
> 
> initdb(){
>    echo "init"
>             # If the locale name is specified just after the initdb 
> parameter, use it:
>             if [ -z $LOCALEPARAMETER ]
>             then
>                 LOCALE=`echo $LANG`
>             else
>                 LOCALE=`echo $LOCALEPARAMETER`
>             fi
>                 LOCALESTRING="--locale=$LOCALE"
> echo "init1 $PGDATA/PG_VERSION"
>         if [ -f "$PGDATA/PG_VERSION" ]
>         then
>             echo "Data directory is not empty!"
>             echo_failure
>         else
>             echo -n $"Initializing database: "
>             if [ ! -e "$PGDATA" -a ! -h "$PGDATA" ]
>             then
>                 mkdir -p "$PGDATA" || exit 1
> #                chown postgres:postgres "$PGDATA"
>                 chown postgres2:postgres "$PGDATA"  #ユーザ変更
>                 chmod go-rwx "$PGDATA"
>             fi
>             # Clean up SELinux tagging for PGDATA
>             [ -x /sbin/restorecon ] && /sbin/restorecon "$PGDATA"
> 
>             # Make sure the startup-time log file is OK, too
> echo "init2"
>             if [ ! -e "$PGLOG" -a ! -h "$PGLOG" ]
>             then
>                 touch "$PGLOG" || exit 1
> #                chown postgres:postgres "$PGLOG"
>                 chown postgres2:postgres "$PGLOG" #ユーザ変更
>                 chmod go-rwx "$PGLOG"
>                 [ -x /sbin/restorecon ] && /sbin/restorecon "$PGLOG"
>             fi
> echo "init3"
>             # Initialize the database
> #        $SU -l postgres2 -c 
> "$PGENGINE/initdb --pgdata='$PGDATA' --auth='ident' $LOCALESTRING" >> 
> "$PGLOG" 2>&1 < /dev/null
>             $SU -l postgres -c 
> "$PGENGINE/initdb --pgdata='$PGDATA' --auth='ident' $LOCALESTRING" >> 
> "$PGLOG" 2>&1 < /dev/null   #ユーザ変更
> 
>             # Create directory for postmaster log
>             mkdir "$PGDATA/pg_log"
> #  chown postgres:postgres "$PGDATA/pg_log"
>             chown postgres2:postgres "$PGDATA/pg_log" #ユーザ変更
>             chmod go-rwx "$PGDATA/pg_log"
> 
>             [ -f "$PGDATA/PG_VERSION" ] && echo_success
>             [ ! -f "$PGDATA/PG_VERSION" ] && echo_failure
>             echo
>         fi
> }
> 
> upgrade(){
> 
> # The second parameter is the new database version, i.e. $PGMAJORVERSION in 
> this case.
> # Use  "postgresql-$PGMAJORVERSION" service, if not specified.
> INIT_SCRIPT="$2"
> if [ x"$INIT_SCRIPT" = x ]
> then
>     INIT_SCRIPT=postgresql-$PGMAJORVERSION
> fi
> 
> # The third parameter is the old database version, i.e. $PGPREVMAJORVERSION 
> in this case.
> # Use  "postgresql-$PGPREVMAJORVERSION" service, if not specified.
> OLD_INIT_SCRIPT="$3"
> if [ x"$OLD_INIT_SCRIPT" = x ]
> then
>     OLD_INIT_SCRIPT=postgresql-$PGPREVMAJORVERSION
> fi
> 
> # Find the init script of the new version:
> if [ ! -f "/etc/init.d/${INIT_SCRIPT}" ]
> then
>      echo "Could not find init script /etc/init.d/${INIT_SCRIPT}"
> fi
> 
> # Find the init script of the old version
> if [ ! -f "/etc/init.d/${OLD_INIT_SCRIPT}" ]
> then
>     echo "Could not find init script /etc/init.d/${OLD_INIT_SCRIPT}"
>     echo "Please install postgresql91-server RPM first."
>     exit
> fi
> 
> # Get port number and data directory of the old instance from the init 
> script
> OLDPGDATA=` sed -n 's/^PGDATA=//p' 
> /etc/init.d/postgresql-$PGPREVMAJORVERSION`
> OLDPGPORT=`sed -n 's/^PGPORT=//p' 
> /etc/init.d/postgresql-$PGPREVMAJORVERSION`
> 
> # Get port number and data directory of the new instance from the init 
> script
> NEWPGDATA=` sed -n 's/^PGDATA=//p' /etc/init.d/postgresql-$PGMAJORVERSION`
> NEWPGPORT=`sed -n 's/^PGPORT=//p' /etc/init.d/postgresql-$PGMAJORVERSION`
> 
> if [ ! -x "$PGENGINE/pg_upgrade" ]
>     then
>     echo
>     echo $"Please install the postgresql92-contrib RPM for pg_upgrade 
> command."
>     echo
>         exit 5
> fi
> 
> # Perform initdb on the new server
> /sbin/service postgresql-$PGMAJORVERSION initdb
> RETVAL=$?
> if [ $RETVAL -ne 0 ]
>   then
>     echo "initdb failed!"
>     exit 1
> fi
> 
> # Check the clusters first, without changing any data:
> #su -l postgres -c "$PGENGINE/pg_upgrade -b 
> /usr/pgsql-$PGPREVMAJORVERSION/bin/ -B $PGENGINE/ -d $OLDPGDATA -D 
> $NEWPGDATA -p $OLDPGPORT -P $NEWPGPORT -c"
> su -l postgres2 -c "$PGENGINE/pg_upgrade -b 
> /usr/pgsql-$PGPREVMAJORVERSION/bin/ -B $PGENGINE/ -d $OLDPGDATA -D 
> $NEWPGDATA -p $OLDPGPORT -P $NEWPGPORT -c"  #ユーザ変更
> RETVAL=$?
> if [ $RETVAL -eq 0 ]
>   then
>     echo "Clusters checked successfully, proceeding with upgrade from 
> $PGPREVMAJORVERSION to $PGMAJORVERSION"
>     echo "Stopping old cluster"
>     /sbin/service $OLD_INIT_SCRIPT stop
> 
>     # Set up log file for pg_upgrade
>     rm -f "$PGUPLOG"
>     touch "$PGUPLOG" || exit 1
> # chown postgres2:postgres "$PGUPLOG"
>     chown postgres2:postgres "$PGUPLOG" #ユーザ変更
>     chmod go-rwx "$PGUPLOG"
>     [ -x /sbin/restorecon ] && /sbin/restorecon "$PGUPLOG"
> 
>     echo "Performing upgrade"
> #    su -l postgres -c "$PGENGINE/pg_upgrade \
>     su -l postgres2 -c "$PGENGINE/pg_upgrade \  #ユーザ変更
>         -b /usr/pgsql-$PGPREVMAJORVERSION/bin/ -B $PGENGINE/ \
>         -d $OLDPGDATA -D $NEWPGDATA \
>         -p $OLDPGPORT -P $NEWPGPORT" >> "$PGUPLOG" 2>&1 < /dev/null
>   else
>     echo "Cluster check failed. Please see the output above."
>     exit 1
> fi
>     echo
> 
> exit 0
> }
> 
> 
> condrestart(){
>     [ -e "$lockfile" ] && restart || :
> }
> 
> reload(){
>     $SU -l postgres2 -c "$PGENGINE/pg_ctl reload -D '$PGDATA' -s" > 
> /dev/null 2>&1 < /dev/null
> }
> 
> # See how we were called.
> case "$1" in
>   start)
>     start
>     ;;
>   stop)
>     stop
>     ;;
>   status)
>     status -p $pidfile $NAME
>     script_result=$?
>     ;;
>   restart)
>     restart
>     ;;
>   initdb)
>     initdb
>     ;;
>   upgrade)
>     upgrade
>     ;;
>   condrestart|try-restart)
>     condrestart
>     ;;
>   reload)
>     reload
>     ;;
>   force-reload)
>     restart
>     ;;
>   *)
>     echo $"Usage: $0 
> {start|stop|status|restart|upgrade|condrestart|try-restart|reload|force-reload|initdb}"
>     exit 2
> esac
> 
> exit $script_result
> ===================================================
> 
> 10. PGDATA, PGPORT の指定
> 
> # vi /etc/sysconfig/pgsql/postgresql2-9.2
> ===================================================
> PGDATA=/home/postgres2/pgsql/9.2/data
> PGPORT=5433
> ===================================================
> 11.データベースの初期化
> /etc/rc.d/init.d/postgresql2-9.2 initdb
> 
> 上記のコマンドを実行後、失敗と表示されてしまい修正方法が見つかっていない状況です。
> 
> 
> 
> -----Original Message----- 
> From: mitani
> Sent: Monday, June 16, 2014 11:37 AM
> To: pgsql-jp @ ml.postgresql.jp
> Subject: [pgsql-jp: 41679] Re: 複数のインスタンスを一台のサーバで起動させたい 
> 
> 
> 三谷@広島です。
> 
> お試しになった手順(コマンドなど)とエラーの内容を付けて頂けると
> 具体的なアドバイスが貰えると思いますが、いかがでしょうか。
> 
> --
> 
> On Mon, 16 Jun 2014 11:30:37 +0900
> "大沼 慎二" <oonumas @ comsystechno.co.jp> wrote:
> 
> > 大沼と申します。
> >
> > 複数インスタンスを1台のサーバで
> > 稼動させるケースについて教えてください。
> > 以前のスレッドでもありましたが、
> > http://ml.postgresql.jp/pipermail/pgsql-jp/2012-October/016191.html
> >
> > initdbをする時に、エラーとなってしまいいろいろと試しているのですが
> > うまくいきません
> >
> > 方法を教えていただけないでしょうか、よろしくお願いします。
> >

-- 
mitani <mitani @ sraw.co.jp>


pgsql-jp メーリングリストの案内