Як скинути всі підключення до певної бази даних, не зупиняючи сервер?


45

Я хочу відмовитись від усіх з'єднань (сеансів), які зараз відкриті до певної бази даних PostgreSQL, але без перезавантаження сервера або відключення з'єднань з іншими базами даних.

Як я можу це зробити?


Я десь прочитав, що ви можете використовувати lowth.com/cutter, щоб досягти цього.

Відповіді:


22

Ось моя відповідь на дуже схоже запитання щодо StackOverflow.

Залежно від вашої версії postgresql, ви можете зіткнутися з помилкою, яка змушує pg_stat_activityопускати активні з'єднання від скасованих користувачів. Ці з'єднання також не відображаються всередині pgAdminIII.

Якщо ви робите автоматичне тестування (в якому ви також створюєте користувачів), це може бути ймовірним сценарієм.

У цьому випадку вам потрібно повернутися до запитів, таких як:

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');

8
ПОМИЛКА: відсутній запис із пункту FROM для таблиці "pg_stat_activity" (psql (9.6.1))
користувач1767316

4
це більше не працює .... отримати вищезгадану помилку ^
легкий

Дивіться відповідь нижче від Szymon Guz
Dfranc3373

Відсутня з Клаузу, не працює
Vipul

78

Цей запит повинен допомогти (припустимо, що база даних має ім'я 'db'):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

pidколись називали procpid, тож якщо ви використовуєте версію поштових знаків старші 9,2, ви можете спробувати наступне:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

Однак ви повинні бути супер-користувачем, щоб відключити інших користувачів.

Також це може бути корисним REVOKE CONNECT ON DATABASE FROM PUBLICчи чимось подібним, а потім - GRANTзгодом.


3

Це можна використовувати для "звільнення" бази даних від клієнтських з'єднань, так що ви, наприклад, можете перейменувати її:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;

Майте на увазі, що це може спричинити проблематичну поведінку для ваших клієнтських програм. Дані фактично не повинні бути зірвані через використання транзакцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.