postgres 데이터베이스에서 다른 모든 사용자를 어떻게 분리합니까?


13

데이터베이스에 독점적으로 액세스해야합니다. SQL 명령을 사용하여 postgres 데이터베이스에서 다른 모든 사용자를 "분리"할 수 있습니까? 또는 다른 모든 연결을 닫은 다음 독점 액세스 권한을 얻을 수 있습니다.

이것은 단위 테스트를위한 것이며 테스트는 수동으로 만 실행되므로 위험이 없습니다. 오래된 연결이 끊어 질 경우에만 영향을받습니다.

이러한 unittest 데이터베이스에 연결하는 다른 사용자는 없습니다.

오래된 죽은 연결은 개발에서 비롯됩니다. 작성 중이거나 실패한 테스트가 완전히 종료되지 않은 경우 항상 발생합니다.


프로덕션 시나리오에서 다른 사용자의 연결을 끊은 후에도 다른 사용자를 잠시 동안 잠가 두어야하는 경우 아래 Scott Marlowe의 답변을 참조하십시오. /dba//a/6184/2024


dba에 대한이 비슷한 질문을 참조하십시오 : 서버를 중지하지 않고 특정 데이터베이스에 대한 모든 연결을 삭제하는 방법은 무엇입니까?

답변:


14

postgres 사용자로 데이터베이스에 연결하여 다음을 실행할 수 있습니다.

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )    -- 1. don't terminate your own session
    AND datname =                     -- 2. don't terminate connections to 
    (SELECT datname                   --    other databases in the cluster
       FROM pg_stat_activity
      WHERE procpid = pg_backend_pid( )
    );

갱신 더 좋은 쿼리는 부속를 제거한다 :

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );

2
CONNECT 권한을 취소하는 것을 잊지 마십시오. 그렇지 않으면 사용자는 독점 액세스 권한을 갖기 전에 새 연결을 작성합니다.
Frank Heikens

@ Frank Heikens-잘 잡았습니다. "수동 단위 테스트"를 입력했지만 단위 테스트를 수행하는 개인 외에 다른 사람이 연결하는 경우 "<datname>에서 연결 취소 ..."가 필수적입니다.
gsiems

PostgreSQL 9.2에서는 procpid로 이름이 바뀌 었 pid으므로주의하십시오.
Craig Ringer 5

문제의 사용자와 REVOKE를 수행하는 것 외에도 공개적으로 REVOKE해야했습니다.
David N. Welton

9.3에서 pg_stat_activity.procpid 는 이제 pg_stat_activity.pid 라고 합니다. 그렇지 않으면 A-OK를 사용했습니다.
JL Peyret

4

여기서 문제는 두 가지로, 먼저 해당 사용자의 연결을 끊어야하고, 둘째는 서버에서 사용자를 멀리해야합니다. 일반적으로 pg_hba.conf를 사용하여 특정 컴퓨터 및 / 또는 사용자의 새로운 연결을 거부하고 pg_ctl -m 빠른 중지를 수행합니다 .pg_ctl은 모든 현재 연결을 삭제하기 시작합니다. DDL 변경을 수행하는 슬로건의 경우 이것은 거의 필요하거나 교착 상태가 발생할 수 있습니다.


5
나는 항상 CONNECT를 허용하고 다른 모든 역할에 상속되는 단일 역할을 사용합니다. REVOKE는이 단일 역할에 대해 연결하면 완료됩니다. pg_terminate_backend ()를 사용하여 함수로 래핑하면 현재 연결을 모두 중지해야 할 때 제어 할 수 있습니다.
Frank Heikens
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.