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()
연결을 끊으려는 데이터베이스의 이름으로 이동합니다.
당신은 원할지도 모릅니다.REVOKE
그CONNECT
사용자의 연결을 끊기 전에 데이터베이스 사용자로부터 권한을 부여받습니다. 그렇지 않으면 사용자는 계속 다시 연결하기만 하면 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+에서는 변경 사항이 적용됩니다.procpid
pid
.
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
'prosource' 카테고리의 다른 글
Excel VBA에서 "!="와 동등한 것은 무엇입니까? (0) | 2023.05.08 |
---|---|
READ를 탐지하는 방법_COMMITED_SNAPHOT를 사용하도록 설정하시겠습니까? (0) | 2023.05.08 |
Xcode 10.2 업데이트 문제 빌드 시스템 오류 -1: 파일 목록의 내용을 로드할 수 없습니다: 입력/출력 xcfilelist (0) | 2023.05.08 |
jQuery를 사용하여 여러 이벤트에서 동일한 기능을 트리거하려면 어떻게 해야 합니까? (0) | 2023.05.08 |
경고:순환 종속성 내부에서 모듈 내보내기의 존재하지 않는 속성 'MongoError' 액세스 (0) | 2023.05.08 |