Terminates active and idle PostgreSQL backends
Did you encountered long-running queries locking down your entire company system because of a massive lock on the database? Or a scatterbrained developper connected to the production database with an open transaction leading to a production outage? Never? Really? Either you have very good policies and that's awesome, or you don't work in databases at all.
With pgterminate
, you shouldn't be paged at night because some queries has locked down production for too long. It looks after "active" and "idle" connections and terminate them. As simple as that.
pgterminate
name is derived frompg_terminate_backend
function, it terminates backends.- backends are called sessions in
pgterminate
. cancel
option terminate current query of active sessions instead of ending the whole backend. Idle sessions are terminated even with this option enabled becausepg_cancel_backend
function has no effect on them.active
sessions are backends inactive
state for more thanactive-timeout
seconds.idle
sessions are backends inidle
,idle in transaction
oridle in transaction (abort)
state for more thanidle-timeout
seconds.- at least one of
active-timeout
andidle-timeout
parameter is required, both can be used. pgterminate
relies onlibpq
for PostgreSQL connection. Whenhost
is ommited, connection via unix socket is used. Whenuser
is ommited, the unix user is used. And so on.- time parameters, like
connect-timeout
,active-timeout
,idle-timeout
andinterval
, are represented in seconds. They accept float value except forconnect-timeout
which is an integer. - if you want
pgterminate
to terminate any session, ensure it has SUPERUSER privileges. Since 9.6, grantpg_signal_backend
role for terminating all sessions except superusers.
pgterminate
handles the following OS signals:
SIGINT
,SIGTERM
to gracefully terminates the infinite loopSIGHUP
to reload configuration file and re-open log file if used (handy for logrotate)
There's two ways to configure pgterminate
:
- command-line arguments
- configuration file with
-config
command-line argument
Configuration file options override command-line arguments
Create binary:
make
Create release tarball:
make release
Cleanup:
make clean
Connect to a remote instance and prompt for password:
pgterminate -host 10.0.0.1 -port 5432 -user test -prompt-password -database test
Use a configuration file:
pgterminate -config config.yaml
Use both configuration file and command-line arguments:
pgterminate -config config.yaml -interval 0.25 -active-timeout 10 -idle-timeout 300
Print usage:
pgterminate -help
pgterminate
is able to include or exclude from being terminated:
- users
- databases
The following arguments can be used called multiple times:
-include-user
-exclude-user
-include-database
-exclude-database
Example:
pgterminate -include-user user1 -include-user user2
Or in configuration file (mind the plural form):
include-users:
user1
user2
Regexes can be configured:
pgterminate -include-users-regex "(user1|user2)"
Or in configuration file:
include-users-regex: "(user1|user2)"
Include filters are applied before exclude filters. If a user or a database is
both in the include and exclude filters, the user or database will be ignored
by pgterminate
.
LISTEN queries are asynchronous. Sessions are set to "idle" state even if they are waiting for messages to be sent to the queue. pgterminate
can exclude sessions in that state by looking at the last known query starting with "LISTEN", with the exclude-listeners
parameter.
The following placeholders are available to format log messages using log-format
option:
%p
: pid%u
: username%d
: database name%r
: client (host:port)%s
: state%m
: state duration%q
: query%a
: application name
pgterminate
is released under The Unlicense license. Code is under public domain.