Как отбросить все подключения к конкретной базе данных, не останавливая сервер?

dba.stackexchange https://dba.stackexchange.com/questions/16426

  •  22-10-2019
  •  | 
  •  

Вопрос

Я хочу отказаться от всех соединений (сеансов), которые в настоящее время открываются в конкретную базу данных PostgreSQL, но без перезапуска сервера или отключения подключений с другими базами данных.

Как я могу это сделать?

Это было полезно?

Решение

Вот мой ответ на Очень похожий вопрос на 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');

Другие советы

Подобный запрос должен помочь (при условии, что база данных называется «DB»):

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

pid раньше назывался procpid, поэтому, если вы используете версию Postgres старше 9,2, вы можете попробовать следующее:

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

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

Это также может быть полезно для REVOKE CONNECT ON DATABASE FROM PUBLIC или что -то подобное, а затем GRANT это позже.

Это можно использовать для «освобождения» базы данных из клиентских соединений, чтобы вы, например, могли переименовать:

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;

Имейте в виду, что это может привести к проблематичному поведению для ваших клиентских приложений. Данные фактические не должны быть образованы из -за использования транзакций.

$ ps aux | grep DATABASE_NAME

51191 postgres: user DATABASE_NAME [local] idle

Затем убей процесс

$ kill 51191
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top