Ответ 1
Объедините pg_terminate_backend
и pg_stat_activity
системный вид.
Есть ли способ заставить клиентов отключиться от PostgreSQL? Я ищу equivlent DB2 force application all
.
Я хотел бы сделать это в своем окне разработки, потому что когда у меня открываются консоли базы данных, я не могу загрузить дамп базы данных. Я должен сначала бросить их.
Объедините pg_terminate_backend
и pg_stat_activity
системный вид.
Объявляет простаивающие процессы в PostgreSQL 8.4:
SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
WHERE current_query LIKE '<IDLE>';
Этот ответ SO прекрасно объясняет (полная цитата из araqnid между горизонтальными правилами, затем меня еще раз):
Чтобы отметить "applogs" базы данных как не принимающие новые соединения:
update pg_database set datallowconn = false where datname = 'applogs';
Другая возможность - отменить доступ к соединению в базе данных для роли (-ов) клиента.
Отключить пользователей из базы данных = убить сервер. Таким образом, чтобы отключить всех других пользователей от базы данных "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 и более поздних версиях.
Я думаю, что это гораздо более полезно, чем ответ Милена А. Радева, который, несмотря на технически то же самое, не приходит с примерами использования и реальными предложениями.
Я отправляю свой ответ, потому что не мог использовать ни одного из них в моем script, сервере 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.
Выполнение суперпользователем и вне самой базы данных проблем работало идеально для меня.
вероятно, следует использовать более тяжелый подход, но:
for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done
Я нашел этот поток в списке рассылки. Он предлагает использовать SIGTERM, чтобы заставить клиентов отключиться.
Не так чисто, как db2 force application all
.