PostgreSQL et les connexions en cours
PostgreSQL est un outil génial, si génial qu'il permet d'avoir des connexions entre un service et lui (oui je sais, c'est logique ^^ )
Prérequis
Il est recommandé d'avoir un accès superuser pour effectuer ces actions. Généralement on les executent lorsqu'il y a des problèmes d'accès à la base de donnée (des connexions ouverte mais morte).
Connaitre le nombre de connexion en simultanée sur une base de donnée
Pour connaitre le nombre de connexion à une base de donnée, tapez la commande suivante avec <DBNAME>
votre base de donnée
select datname, usename, pid, application_name, client_addr, client_hostname, client_port, backend_start, query_start, query
from pg_stat_activity
where datname = '<DBNAME>';
Vous devez avoir un retour similaire :
mastodon=# select datname, usename, pid, application_name, client_addr, client_hostname, client_port, backend_start, query_start, query
from pg_stat_activity
where datname = 'mastodon';
datname | usename | pid | application_name | client_addr | client_hostname | client_port | backend_start | query_start | query
----------+----------+-------+------------------------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mastodon | mastodon | 31057 | puma: cluster worker 1: 8526 [www] | 10.10.10.3 | | 49250 | 2020-01-28 17:25:39.587535+01 | 2020-01-28 17:35:04.662738+01 | SELECT "accounts".* FROM "accounts" WHERE "accounts"."uri" = $1 LIMIT $2
mastodon | mastodon | 29827 | puma: cluster worker 3: 8526 [www] | 10.10.10.3 | | 49216 | 2020-01-28 17:24:23.619165+01 | 2020-01-28 17:35:16.13175+01 | SELECT "accounts".* FROM "accounts" WHERE "accounts"."uri" = $1 LIMIT $2
mastodon | mastodon | 3180 | puma: cluster worker 3: 8526 [www] | 10.10.10.3 | | 50088 | 2020-01-28 17:35:12.39345+01 | 2020-01-28 17:35:12.426536+01 | SELECT "status_pins"."status_id" FROM "status_pins" WHERE 1=0 AND "status_pins"."account_id" = $1
mastodon | mastodon | 31061 | sidekiq 5.2.7 www [0 of 50 busy] | 10.10.10.3 | | 49260 | 2020-01-28 17:25:39.714381+01 | 2020-01-28 17:35:16.176494+01 | COMMIT
Couper des connexions
TIMBER !
Pour couper une connexion, rien de plus simple :
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
pid <> pg_backend_pid()
AND pid = '<PID>'
AND datname = '<DBNAME>';
Avec <PID>
le PID que vous souhaitez couper (et que vous avez récupéré plus haut) et <DBNAME>
le nom de votre base de donnée.
La ligne pid <> pg_backend_pid()
permet de ne pas se couper sa propre connexion (mesure de sécurité).
Pour couper toutes les connexions d'une base de donnée :
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
pid <> pg_backend_pid()
AND datname = '<DBNAME>';