Принудительное отключение клиента с помощью PostgreSQL - PullRequest
30 голосов
/ 07 апреля 2009

Есть ли способ заставить клиентов отключаться от PostgreSQL? Я ищу эквивалент DB2's force application all.

Я бы хотел сделать это на своем блоке разработки, потому что, когда у меня открыты консоли базы данных, я не могу загрузить дамп базы данных. Сначала я должен бросить их.

Ответы [ 6 ]

36 голосов
/ 13 мая 2011

Убивает неактивные процессы в PostgreSQL 8.4:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
   WHERE current_query LIKE '<IDLE>';
20 голосов
/ 07 апреля 2009

Объединение pg_terminate_backend функции и системного представления pg_stat_activity.

5 голосов
/ 31 июля 2014

Этот SO-ответ прекрасно объясняет (полная цитата из araqnid между горизонтальными правилами, затем снова я):


Чтобы пометить «applogs» базы данных как не принимающие новые подключения:

update pg_database set datallowconn = false where datname = 'applogs';

Другой возможностью будет аннулирование доступа «connect» к базе данных для роли (ей) клиента.

Отключить пользователей от базы данных = убить бэкэнд. Таким образом, чтобы отключить всех других пользователей от базы данных «applogs», например:

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();

После того, как вы выполнили оба этих действия, вы единственный пользователь, подключенный к 'applogs'. Хотя на самом деле может быть задержка, прежде чем бэкэнды действительно завершат отключение?


Обновление от MarkJL : действительно, перед завершением отсоединения бэкэндов действительно есть задержка.

Теперь я снова: сказанное, учтите, что столбец procpid был переименован в pid в PostgreSQL 9.2 и более поздних версиях.

Я думаю, что это гораздо более полезно, чем ответ Милена А. Радева, который, хотя технически не совпадает с примерами использования и реальными предложениями.

4 голосов
/ 15 января 2015

Я публикую свой ответ, потому что я не смог использовать ни один из них в своем скрипте, сервер 9.3:

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';"

В следующей строке вы можете делать все, что пожелаете, с помощью my_database_to_alter. Как видите, вы выполняете запрос из базы данных «postgres», которая существует почти в каждой установке postgresql.

Работа с правами суперпользователя и вне базы данных проблем работала идеально для меня.

1 голос
/ 27 июля 2013

возможно, следует использовать более сложный подход, но:

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done
0 голосов
/ 07 апреля 2009

Я нашел эту тему в списке рассылки. Он предлагает использовать SIGTERM для отключения клиентов.

Не так чисто, как db2 force application all.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...