Обсуждение: terminate PG connections
Hello PG Users, I would like to know if there is a "clean" way to terminate running and idle connections inside PG db ? ( I see : pg_cancel_backend (pid) will send the connections to idle stage but not disconnecting from db , if you have > 100 idle connections to db and don't want to use the OS " kill " ) Thank you Isabella -- ----------------------------------------------------------- Isabella A. Ghiurea Isabella.Ghiurea@nrc-cnrc.gc.ca Canadian Astronomy Data Centre | http://www1.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/ National Research Council of Canada, Herzberg Institute of Astrophysics 5071 West Saanich Road, Victoria BC V9E 2E7, Canada Phone: 250 363-3446 fax: 250 363-0045
#!/bin//bash
#
# Script: pgsession
# Author: Rao Kumar raokumar@netwolves.com
# Purpose: Utility to list/kill postgres database user sessions.
# Comments: Execute this script as "postgres" user (user who runs postmaster)
#
# INITIALIZE ENVIRONMENT
# Set up the environmental variables
#
KILL="kill -TERM"
BASENAME=`basename "$0"`
PSQLC="psql -U postgres -d template1 -c "
PSQLTC="psql -U postgres -t -A -d template1 -c "
while [ "$#" -gt 0 ]
do
case "$1" in
--help|-\?)
usage=t
break
;;
-l)
OPT="list"
;;
-k)
OPT="kill"
;;
-f)
force=t
;;
-u)
if [ -z "$2" ]; then
echo "ERROR: Please specify user name"
exit 1
else
user="$2"
fi
shift;;
-p)
if [ -z $2 ]; then
echo "ERROR: Please specify pid"
exit 1
else
pid="$2"
fi
shift;;
*)
if [ "$#" -eq "0" ]; then
echo "$BASENAME: invalid option: $2" 1>&2
echo "Try '$BASENAME --help' for more information." 1>&2
exit 1
fi
;;
esac
shift;
done
if [ "$usage" ]; then
echo "$BASENAME : List/Kill database user sessions"
echo
echo "Usage:"
echo " $BASENAME [OPTION]... [USER]"
echo
echo "Options:"
echo " --h (help) show this help, then exit"
echo " -l (list) list database sessions"
echo " -k (kill) kill/terminate database sessions"
echo " -f (force) force kill (do not ask for confirmation,"
echo " use in conjunction with -k option)"
echo " -u USER specify database user name"
echo " -p PID specify database user process id (pid)"
echo
echo "Examples: "
echo " $BASENAME -l list all sessions"
echo " $BASENAME -l -u <user> list user sessions "
echo " $BASENAME -k kill all sessions"
echo " $BASENAME -k -f force kill all sessions"
echo " $BASENAME -k -u <user> kill user sessions"
echo " $BASENAME -k -p <pid> kill user session with a specific pid"
echo
exit 0
fi
if [ "$OPT" = "list" ]; then
UCTR=`$PSQLTC "select count(*) from pg_stat_activity" `
echo; echo "Database Sessions (all users): $UCTR"
SQL="select procpid as "PID", datname as "Database", "
SQL="$SQL usename as "User" from pg_stat_activity"
if [ ! -z "$user" ]; then
SQL="$SQL where usename = '$user'"
echo "Session List ($user)"
fi
echo "----------------------------------"
$PSQLC "$SQL"
elif [ "$OPT" = "kill" ]; then
SQL="select procpid from pg_stat_activity "
if [ ! -z "$user" ]; then
SQL="$SQL where usename = '$user'"
elif [ ! -z "$pid" ]; then
SQL="$SQL where procpid = '$pid'"
fi
for pid in `$PSQLTC "$SQL" `; do
if [ "$force" ]; then
echo "Killing session (PID:$pid)"
$KILL $pid
else
echo -n "Kill database session (PID:$pid) [y/n] ?:"
read confirm
if [ "$confirm" = "y" ]; then
echo "Killing session (PID:$pid)"
$KILL $pid
fi
fi
done
else
echo "$BASENAME: invalid option: $2" 1>&2
echo "Try '$BASENAME --help' for more information." 1>&2
exit 1
fi
-----Original Message-----
From: pgsql-admin-owner@postgresql.org [mailto:pgsql-admin-owner@postgresql.org] On Behalf Of Isabella Ghiurea
Sent: Tuesday, June 30, 2009 1:23 PM
To: pgsql-admin@postgresql.org
Subject: [ADMIN] terminate PG connections
Hello PG Users,
I would like to know if there is a "clean" way to terminate running
and idle connections inside PG db ?
( I see : pg_cancel_backend (pid) will send the connections to idle
stage but not disconnecting from db , if you have > 100 idle
connections to db and don't want to use the OS " kill " )
Thank you
Isabella
--
-----------------------------------------------------------
Isabella A. Ghiurea
Isabella.Ghiurea@nrc-cnrc.gc.ca
Canadian Astronomy Data Centre | http://www1.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/
National Research Council of Canada, Herzberg Institute of Astrophysics
5071 West Saanich Road, Victoria BC V9E 2E7, Canada
Phone: 250 363-3446 fax: 250 363-0045
--
Sent via pgsql-admin mailing list (pgsql-admin@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-admin
Plugge, Joe R. wrote: > #!/bin//bash > # > # Script: pgsession > # Author: Rao Kumar raokumar@netwolves.com > # Purpose: Utility to list/kill postgres database user sessions. > # Comments: Execute this script as "postgres" user (user who runs postmaster) > [............] Is it safe to kill pg sessions with Postgresql versions < 8.4? This can be read in the 8.4 release: "Add pg_terminate_backend() to safely terminate a backend (the SIGTERM signal works also) (Tom, Bruce) While it's always been possible to SIGTERM a single backend, this was previously considered unsupported; and testing of the case found some bugs that are now fixed." I don't know what "some bugs that are now fixed" means, but I think I read somewhere that killing a session with the command kill was not a god idea. regards -- Rafael Martinez, <r.m.guerrero@usit.uio.no> Center for Information Technology Services University of Oslo, Norway PGP Public Key: http://folk.uio.no/rafael/
On Tue, Jun 30, 2009 at 11:53 PM, Isabella Ghiurea <isabella.ghiurea@nrc-cnrc.gc.ca> wrote:
Hi,
Hello PG Users,
I would like to know if there is a "clean" way to terminate running and idle connections inside PG db ?
( I see : pg_cancel_backend (pid) will send the connections to idle stage but not disconnecting from db , if you have > 100 idle connections to db and don't want to use the OS " kill " )
Thank you
Isabella
--
-----------------------------------------------------------
Isabella A. Ghiurea
Isabella.Ghiurea@nrc-cnrc.gc.ca
Canadian Astronomy Data Centre | http://www1.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/ National Research Council of Canada, Herzberg Institute of Astrophysics 5071 West Saanich Road, Victoria BC V9E 2E7, Canada
Phone: 250 363-3446 fax: 250 363-0045
--
Sent via pgsql-admin mailing list (pgsql-admin@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-admin
Hi,
To kill the process and session you can do like follows:
(1) Edit " pg_hba.conf " file which is in your data directory and at the bottom of the file add a line as follows:
host all all <client IP address/32> reject
(2)And reload the database.
pg_ctl –D <your data directory path> reload
(3)After that run the following command:
$ pg_ctl -D <your data directory path> kill TERM <procpid>
Thanks & Regards,
Raghu