prosource

Postgre를 떨어뜨리는 방법SQL 데이터베이스에 대한 활성 연결이 있는 경우

probook 2023. 5. 8. 22:18
반응형

Postgre를 떨어뜨리는 방법SQL 데이터베이스에 대한 활성 연결이 있는 경우

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

표준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메일 목록 스레드를 봅니다.

포스트그레에서SQL 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()연결을 끊으려는 데이터베이스의 이름으로 이동합니다.

당신은 원할지도 모릅니다.REVOKECONNECT사용자의 연결을 끊기 전에 데이터베이스 사용자로부터 권한을 부여받습니다. 그렇지 않으면 사용자는 계속 다시 연결하기만 하면 DB를 삭제할 수 없습니다. 설명과 관련된 질문은 데이터베이스에서 다른 모든 사용자를 분리하는 방법참조하십시오.

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

PostgreSQL 13 옵션이 도입되었습니다.

데이터베이스 삭제

Drop Database가 데이터베이스를 삭제합니다...또한 대상 데이터베이스에 연결된 다른 사용자가 있는 경우 아래 설명된 FORCE 옵션을 사용하지 않으면 명령은 실패합니다.

힘.

대상 데이터베이스에 대한 기존 연결을 모두 종료하려고 합니다.준비된 트랜잭션, 활성 논리 복제 슬롯 또는 구독이 대상 데이터베이스에 있는 경우 종료되지 않습니다.

DROP DATABASE db_name WITH (FORCE);

진정해, 진정해피시.

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

sudo service postgresql stop
sudo service postgresql start

psql
DROP DATABASE DB_NAME;

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

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

완전히 확신할 수는 없지만 다음은 모든 세션을 종료할 수 있습니다.

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

물론 해당 데이터베이스에 직접 연결되어 있지 않을 수도 있습니다.

postgresql 버전에 따라 버그가 발생할 수 있으며, 이는 다음과 같습니다.pg_stat_activity삭제된 사용자의 활성 연결을 생략합니다. 내부에도 되지 않습니다.III.

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

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

 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+에서는 변경 사항이 적용됩니다.procpidpid.

postgres 9.2는 이제 procpid가 아니라 column 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 덕분입니다.

PostgreSQL 9.2 이상:

SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'

여기 내 해킹이...=D

# Make sure no one can connect to this database except you!
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "UPDATE pg_database SET datallowconn=false WHERE datname='<DATABASE_NAME>';"

# Drop all existing connections except for yours!
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '<DATABASE_NAME>' AND pid <> pg_backend_pid();"

# Drop database! =D
sudo -u postgres /usr/pgsql-9.4/bin/psql -c "DROP DATABASE <DATABASE_NAME>;"

새 연결을 차단하는 명령(위)을 포함하고 명령을 사용하는 모든 시도가...

REVOKE CONNECT ON DATABASE <DATABASE_NAME> FROM PUBLIC, <USERS_ETC>;

새 연결을 차단하지 마십시오!

@araqnid @GoatWalker 덕분에! =D

https://stackoverflow.com/a/3185413/3223785

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

bg 명령을 입력하여 다른 postgresql 프로세스가 아직 실행 중인지 확인합니다.

그런 다음 dropdbdbname 뒤에 데이터베이스를 삭제합니다.

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

이것은 Linux 명령 프롬프트에서 작동합니다.

내 경우에는 활성 관리자 연결을 포함한 모든 연결을 삭제하는 명령을 실행해야 했습니다.

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()

모든 연결을 종료하고 치명적인 ''오류'' 메시지를 표시합니다.

FATAL: terminating connection due to administrator command SQL state: 57P01

그 후에 데이터베이스를 삭제하는 것이 가능했습니다.

pgAdmin4를 사용하여 로그인하고 대시보드에서 pgAdmin4를 제외한 모든 연결을 끊은 다음 데이터베이스와 속성을 마우스 오른쪽 버튼으로 클릭하여 새 이름을 입력할 수 있었습니다.

언급URL : https://stackoverflow.com/questions/5408156/how-to-drop-a-postgresql-database-if-there-are-active-connections-to-it

반응형