서버를 중지하지 않고 특정 데이터베이스에 대한 모든 연결을 삭제하는 방법은 무엇입니까?


44

현재 특정 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
오류 : "pg_stat_activity"테이블에 대한 FROM-clause 항목 누락 (psql (9.6.1))
user1767316

4
이것은 더 이상 작동하지 않습니다 .... 위의 오류를 ^ ^
가벼운

인 Szymon Guz 아래의 답변을 참조하십시오
Dfranc3373

조항에서 누락, 작동하지 않습니다
Vipul

77

이와 같은 쿼리가 도움이 될 것입니다 (데이터베이스 이름이 '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;

이로 인해 클라이언트 앱에 문제가 발생할 수 있습니다. 트랜잭션 사용으로 인해 데이터가 실제로 중단되지 않아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.