[postgresql] 활성화 된 PostgreSQL 데이터베이스가 있다면 어떻게 삭제합니까?

PostgreSQL 데이터베이스를 삭제하는 스크립트를 작성해야합니다. 많은 연결이있을 수 있지만 스크립트는이를 무시해야합니다.

DROP DATABASE db_name열린 연결이 있으면 표준 쿼리가 작동하지 않습니다.

문제를 어떻게 해결할 수 있습니까?



답변

이렇게하면 기존 연결을 제외하고 기존 연결이 끊어집니다.

pg_stat_activity죽이고 자하는 pid 값을 쿼리 하여 얻은 다음 발행하십시오 SELECT pg_terminate_backend(pid int).

PostgreSQL 9.2 이상 :

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB
  AND pid <> pg_backend_pid();

PostgreSQL 9.1 이하 :

SELECT pg_terminate_backend(pg_stat_activity.procpid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB
  AND procpid <> pg_backend_pid();

모든 사람을 연결 해제하면 연결을 끊으려는 데이터베이스가 아닌 다른 데이터베이스의 연결에서 DROP DATABASE 명령을 연결 해제하고 발행해야합니다.

procpid열 이름을로 바꿉니다 pid. 이 메일 링리스트 스레드를 참조하십시오 .


답변

PostgreSQL 9.2 이상에서, 연결된 데이터베이스에서 세션을 제외한 모든 것을 연결 해제하려면 :

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

이전 버전에서는 동일합니다. 변경하십시오. pid 합니다 procpid.로 하십시오 . 다른 데이터베이스 current_database()에서 연결을 끊으려면 사용자를 연결 해제하려는 데이터베이스 이름으로 변경 하십시오.

당신은 할 수 있습니다 , 사용자를 분리하기 전에 데이터베이스의 사용자의 권리, 그렇지 않으면 사용자는 다시 연결을 계속하고 당신은 DB를 드롭 할 수있는 기회를 얻을 수 없을거야. 이 주석 과 관련된 질문 , 데이터베이스에서 다른 모든 사용자를 분리하는 방법을 참조하십시오 .REVOKECONNECT

유휴 사용자의 연결을 끊으려면 이 질문을 참조하십시오 .


답변

pg_terminate_backend(int)함수를 사용하여 데이터베이스를 삭제하기 전에 모든 연결을 종료 할 수 있습니다.

시스템보기를 사용하여 실행중인 모든 백엔드를 얻을 수 있습니다. pg_stat_activity

나는 확실하지 않지만 다음은 아마도 모든 세션을 죽일 것입니다.

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'doomed_database'

물론 당신은 그 데이터베이스에 자신을 연결하지 못할 수 있습니다


답변

postgresql 버전에 따라 버그가 발생할 수 있습니다. pg_stat_activity 하여 삭제 된 사용자의 활성 연결이 생략 될 수 있습니다. 이 연결은 pgAdminIII 내부에도 표시되지 않습니다.

자동 테스트를 수행하는 경우 (사용자도 작성) 이는 가능한 시나리오 일 수 있습니다.

이 경우 다음과 같은 쿼리로 되돌려 야합니다.

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

참고 : 9.2 이상에서는로 변경 procpid되었습니다 pid.


답변

postgres 9.2는 이제 procpid가 아닌 pid 열을 호출합니다.

쉘에서 호출하는 경향이 있습니다.

#!/usr/bin/env bash
# kill all connections to the postgres server
if [ -n "$1" ] ; then
  where="where pg_stat_activity.datname = '$1'"
  echo "killing all connections to database '$1'"
else
  echo "killing all connections to database"
fi

cat <<-EOF | psql -U postgres -d postgres
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
${where}
EOF

도움이 되길 바랍니다. SQL을위한 @JustBob에게 감사드립니다.


답변

우분투에서 서비스를 다시 시작하여 연결된 클라이언트의 연결을 끊습니다.

sudo service postgresql stop
sudo service postgresql start

psql
DROP DATABASE DB_NAME;


답변

Linux 명령 프롬프트에서 먼저 sudo /etc/init.d/postgresql restart 명령을 입력하여 실행중인 모든 postgresql 프로세스를 중지합니다.

다른 postgresql 프로세스가 여전히 실행 중인지 확인하려면 bg 명령을 입력하십시오.

그런 다음 dropdb dbname 다음에 데이터베이스를 삭제하십시오.

sudo /etc/init.d/postgresql restart
bg
dropdb dbname

이것은 리눅스 명령 프롬프트에서 나를 위해 작동합니다.