mirror of
https://abf.rosa.ru/djam/postgresql-pgpool-II.git
synced 2025-02-22 22:52:47 +00:00
285 lines
7.4 KiB
Bash
Executable file
285 lines
7.4 KiB
Bash
Executable file
#!/bin/sh
|
|
# Author: Per Øyvind Karlsen <peroyvind@mandriva.org>
|
|
# (c) 2010 - Linus AS (http://www.linus.no)
|
|
# Inspired by Fedora init script by Devrim GUNDUZ <devrim@CommandPrompt.com>
|
|
#
|
|
# chkconfig: 345 95 33
|
|
# pidfile: /var/run/pgpool/pgpool.pid
|
|
|
|
### BEGIN INIT INFO
|
|
# Provides: pgpool
|
|
# Required-Start: $local_fs $network
|
|
# Required-Stop: $local_fs $network
|
|
# Default-Start: 3 4 5
|
|
# Default-Stop: 0 1 2 6
|
|
# Short-Description: PostgreSQL pgpool-II daemon
|
|
# Description: pgpool-II is a connection pooling/replication server for PostgreSQL.
|
|
### END INIT INFO
|
|
|
|
. /etc/init.d/functions
|
|
|
|
# Get config.
|
|
. /etc/sysconfig/network
|
|
|
|
PGDATA=/var/lib/pgsql/data
|
|
|
|
if [ -r /etc/sysconfig/postgresl ]; then
|
|
. /etc/sysconfig/postgresql
|
|
fi
|
|
|
|
# Set defaults for configuration variables
|
|
PGPOOLDAEMON=/usr/bin/pgpool
|
|
PGPOOLCONF=/etc/pgpool-II/pgpool.conf
|
|
PGPOOLDATA=/usr/share/pgpool-II
|
|
|
|
PGDBUSER=pgpool
|
|
PGDBNAME=pgpool
|
|
NAME=pgpool-II
|
|
BASEBIN="$(basename $PGPOOLDAEMON)"
|
|
LOCK_FILE="/var/lock/subsys/${BASEBIN}"
|
|
PID_FILE="/var/run/pgpool/${BASEBIN}.pid"
|
|
LOG_FILE="/var/log/postgres/pgpool"
|
|
|
|
STOP_MODE="fast"
|
|
|
|
PCP_PORT=9898
|
|
PCP_USER=pgpool
|
|
PCP_PASS=recovery
|
|
PCP_TIMEOUT=10
|
|
PCP_HOSTNAME='' # local unix sockets
|
|
|
|
if [ -r /etc/sysconfig/pgpool ]; then
|
|
. /etc/sysconfig/pgpool
|
|
fi
|
|
|
|
if [ ! -x "$PGPOOLDAEMON" ]; then
|
|
[ "$1" = "stop" ] && exit 0
|
|
gprintf "%s needs to exist and be executable\n" "$PGPOOLDAEMON"
|
|
exit 5
|
|
fi
|
|
|
|
# Check whether the config file exists or not
|
|
if [ ! -r "$PGPOOLCONF" ]; then
|
|
[ "$1" = "stop" ] && exit 0
|
|
gprintf "%s needs to exist and be readable\n" "$PGPOOLCONF"
|
|
exit 6
|
|
fi
|
|
|
|
RETVAL=0
|
|
|
|
init(){
|
|
gprintf "Checking for postgresql '%s' user: " ${PGDBUSER}
|
|
psql -U ${PGDBUSER} postgres -c ''&> /dev/null
|
|
RETVAL=$?
|
|
if [[ "$RETVAL" = 0 ]]; then
|
|
success
|
|
elif [[ "$RETVAL" = 1 ]]; then
|
|
gprintf "'Postgresql user '%s' already exists, but unable to access" ${PGDBUSER}
|
|
failed
|
|
elif [[ "$RETVAL" = 2 ]]; then
|
|
gprintf "creating%s" "..."
|
|
createuser -U postgres --superuser --no-createdb --no-password ${PGDBUSER} &> /dev/null && passed
|
|
[[ ! $? ]] && failure
|
|
else
|
|
success
|
|
fi
|
|
echo
|
|
|
|
gprintf "Checking for postgresql '%s' database: " ${PGDBUSER}
|
|
psql -U ${PGDBUSER} ${PGDBNAME} -c '' &> /dev/null
|
|
RETVAL=$?
|
|
if [[ "$RETVAL" = 0 ]]; then
|
|
success
|
|
echo
|
|
elif [[ "$RETVAL" = 1 ]]; then
|
|
gprintf "'%s' %s already exists, but unable to access it" "${PGDBNAME}" "database" && warning
|
|
[[ ! $? ]] && failure
|
|
echo
|
|
elif [[ "$RETVAL" = 2 ]]; then
|
|
gprintf "preparing%s" "..."
|
|
echo
|
|
gprintf "Installing %s '%s': %s" "${NAME}" "recovery tunction" "..."
|
|
psql -U postgres template1 -f /usr/share/postgresql/contrib/pgpool-recovery.sql &> /dev/null && passed
|
|
[[ ! $? ]] && failure
|
|
echo
|
|
gprintf "Installing %s '%s': %s" "${NAME}" "regclass tunction" "..."
|
|
psql -U postgres template1 -f /usr/share/postgresql/contrib/pgpool-regclass.sql &> /dev/null && passed
|
|
[[ ! $? ]] && failure
|
|
echo
|
|
gprintf "Initializing '%s' %s: %s" "pgpool_lock_table" "lobj_lock_table table" "..."
|
|
psql -U postgres template1 -c 'CREATE TABLE public.pgpool_lock_table (); GRANT ALL ON public.pgpool_lock_table TO PUBLIC;' &> /dev/null && passed
|
|
[[ ! $? ]] && failure
|
|
echo
|
|
gprintf "Creating '%s' %s: %s" "${PGDBNAME}" "database" "..."
|
|
createdb -U ${PGDBUSER} -O ${PGDBUSER} ${PGDBNAME} -T template1 && passed
|
|
[[ ! $? ]] && failure
|
|
echo
|
|
gprintf "Installing postgresql '%s' database function: %s" "dblink" "..."
|
|
psql -U ${PGDBUSER} -f /usr/share/postgresql/contrib/dblink.sql &> /dev/null && passed
|
|
[[ ! $? ]] && failure
|
|
echo
|
|
gprintf "Initializing '%s': %s" "${NAME} system db" "..."
|
|
psql -U ${PGDBUSER} -f /usr/share/pgpool-II/system_db.sql ${PGDBNAME} &> /dev/null && passed
|
|
[[ ! $? ]] && failure
|
|
echo
|
|
else
|
|
success
|
|
fi
|
|
for i in archive_command copy-base-backup pgpool_recovery pgpool_recovery_pitr pgpool_remote_start; do
|
|
[ ! -e ${PGDATA}/${i} ] && su postgres -c "ln -s ${PGPOOLDATA}/${i} ${PGDATA}/${i}"
|
|
done
|
|
}
|
|
|
|
uninstall() {
|
|
rh_status_q && stop
|
|
psql -U ${PGDBUSER} ${PGDBNAME} -f /usr/share/postgresql/contrib/uninstall_dblink.sql &> /dev/null
|
|
psql -U postgres postgres -c 'DROP FUNCTION pgpool_recovery (text, text, text);' &> /dev/null
|
|
psql -U postgres postgres -c 'DROP FUNCTION pgpool_remote_start (text, text);' &> /dev/null
|
|
psql -U postgres postgres -c 'DROP FUNCTION pgpool_switch_xlog (text, text);' &> /dev/null
|
|
psql -U postgres postgres -c 'DROP FUNCTION pgpool_regclass (text, text);' &> /dev/null
|
|
psql -U postgres postgres -c 'DROP TABLE public.pgpool_lock_table;' &> /dev/null
|
|
|
|
dropdb -U ${PGDBUSER} ${PGDBNAME}
|
|
dropuser -U postgres ${PGDBUSER}
|
|
}
|
|
|
|
start(){
|
|
service postgresql status &> /dev/null && init
|
|
gprintf "Starting %s service: " "${NAME}"
|
|
daemon --check ${PGPOOLDAEMON} --pidfile ${PID_FILE} --user postgres "${PGPOOLDAEMON} -f ${PGPOOLCONF} -l ${LOG_FILE} ${CLEAR_CACHE} ${PGPOOLOPTS}"
|
|
RETVAL=$?
|
|
echo
|
|
[ $RETVAL -eq 0 ] && touch $LOCK_FILE
|
|
return $RETVAL
|
|
}
|
|
|
|
stop(){
|
|
gprintf "Shutting down %s service: " "${NAME}"
|
|
daemon --user postgres "${PGPOOLDAEMON} -m ${STOP_MODE} stop 2> /dev/null"
|
|
RETVAL=$?
|
|
echo
|
|
[ $RETVAL -eq 0 ] && rm -f $LOCK_FILE
|
|
return $RETVAL
|
|
}
|
|
|
|
reload(){
|
|
gprintf "Reloading %s: " "${NAME}"
|
|
rh_status_q
|
|
|
|
if [ $RETVAL -eq 0 ]; then
|
|
$PGPOOLDAEMON reload
|
|
RETVAL=$?
|
|
else
|
|
rh_status
|
|
fi
|
|
if [ $RETVAL -eq 0 ]; then
|
|
success
|
|
else
|
|
failure
|
|
fi
|
|
echo
|
|
return $RETVAL
|
|
}
|
|
|
|
rh_status() {
|
|
status -p $PID_FILE $PGPOOLDAEMON
|
|
RETVAL=$?
|
|
return $RETVAL
|
|
}
|
|
|
|
rh_status_q() {
|
|
rh_status >/dev/null 2>&1
|
|
return $?
|
|
}
|
|
|
|
extendedstatus() {
|
|
rh_status || exit 0
|
|
echo
|
|
NODE_COUNT=$(pcp_node_count "${PCP_TIMEOUT}" "${PCP_HOSTNAME}" "${PCP_PORT}" "${PCP_USER}" "${PCP_PASS}")
|
|
gprintf "Total node count:\t %s\n" $NODE_COUNT
|
|
echo
|
|
gprintf "Host\t\t\t\t Status\t Load Balance Weight\n"
|
|
for i in $(seq 0 $(($NODE_COUNT-1))); do
|
|
NODES_INFO=$(pcp_node_info "${PCP_TIMEOUT}" "${PCP_HOSTNAME}" "${PCP_PORT}" "${PCP_USER}" "${PCP_PASS}" $i)
|
|
[ "${NODES_INFO:0:1}" = " " ] && SOCKET="unix-socket"
|
|
gprintf "%s:%s\t\t %s\t %s\n" $SOCKET $NODES_INFO
|
|
unset SOCKET
|
|
done
|
|
echo
|
|
gprintf "Active child process states:\n"
|
|
gprintf "PID\t Database\t User\t Started\t Created\t Version\t Connection-reuse counter\n"
|
|
IDLE_PROCS=""
|
|
for i in $(pcp_proc_count "${PCP_TIMEOUT}" "${PCP_HOSTNAME}" "${PCP_PORT}" "${PCP_USER}" "${PCP_PASS}"); do
|
|
PROC_INFO=$(pcp_proc_info "${PCP_TIMEOUT}" "${PCP_HOSTNAME}" "${PCP_PORT}" "${PCP_USER}" "${PCP_PASS}" "$i")
|
|
if [ "$(echo $PROC_INFO |wc -c)" -eq 1 ]; then
|
|
IDLE_PROCS="${IDLE_PROCS}$i "
|
|
else
|
|
gprintf "%s:\t %s\t\t %s\t %s\t %s\t %s.%s\t\t %s\n" $i $PROC_INFO
|
|
fi
|
|
done
|
|
echo
|
|
gprintf "Idle child processes:\n%s\n" "$IDLE_PROCS"
|
|
echo
|
|
rh_status_q
|
|
}
|
|
|
|
ACTION="$1"
|
|
|
|
while [ "$#" -ne 0 ]; do
|
|
shift
|
|
case "$1" in
|
|
clear|clear-cache)
|
|
CLEAR_CACHE="-c"
|
|
;;
|
|
smart|fast|immediate)
|
|
STOP_MODE="$1"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# See how we were called.
|
|
case "$ACTION" in
|
|
start)
|
|
rh_status_q && exit 0
|
|
start
|
|
;;
|
|
stop)
|
|
stop
|
|
;;
|
|
status)
|
|
rh_status
|
|
;;
|
|
extendedstatus)
|
|
extendedstatus
|
|
;;
|
|
restart)
|
|
stop
|
|
start
|
|
;;
|
|
reload|force-reload)
|
|
reload
|
|
;;
|
|
condrestart|try-restart)
|
|
rh_status_q || exit 0
|
|
stop
|
|
start
|
|
;;
|
|
condstop)
|
|
rh_status_q || exit 0
|
|
stop
|
|
;;
|
|
init)
|
|
init
|
|
;;
|
|
uninstall)
|
|
uninstall
|
|
;;
|
|
*)
|
|
gprintf "Usage: %s {start|status|extendedstatus|restart|condrestart|condstop|reload|force-reload}\n" $0
|
|
gprintf "Stop: %s {stop|restart|condrestart|condstop} [smart|fast|immediate]\n" $0
|
|
gprintf "Start: %s {start|restart|condrestart} [clear-cache]\n" $0
|
|
RETVAL=2
|
|
;;
|
|
esac
|
|
|
|
exit $RETVAL
|