PostgreSQL : 명령 줄을 통해 PostgreSQL 데이터베이스 삭제 [닫기]


321

데이터베이스를 삭제하고 명령 줄을 통해 새 데이터베이스를 만들려고합니다.

를 사용하여 로그인 psql -U username한 다음을 수행 한 다음을 수행 \connect template1합니다 DROP DATABASE databasename;.

나는 오류를 얻는다

다른 사용자가 데이터베이스 데이터베이스 이름에 액세스하고 있습니다.

Apache를 종료하고 다시 시도했지만 여전히이 오류가 발생합니다. 내가 뭔가 잘못하고 있습니까?


2
dropdb databasename명령 행에서 명령을 실행하면 어떻게됩니까 ?
Dylan Markow

1
"오류 : 현재 열려있는 데이터베이스를 삭제할 수 없습니다"
iman453

4
사용 psql -U <user> -c "drop database protodb"(데이터베이스 이름없이)
사용자

3
그러면 postgres가 다시 시작되고 모든 사람의 연결이 끊어집니다. sudo service postgresql restart 다음을 수행하십시오. dropdb -h localhost -p 5432 -U "youruser" "testdb" ""에주의하여 특수 문자가 문제없이 입력되도록하십시오.
unom

drop database <dataabase_name>;쉼표를 잊지 마십시오.
Sandip Subedi 2016 년

답변:


455

명령 행에서 dropdb 명령을 실행할 수 있습니다 .

dropdb 'database name'

삭제하려면 수퍼 유저 또는 데이터베이스 소유자 여야합니다.

pg_stat_activity보기를 확인하여 모든 유휴 프로세스를 포함하여 데이터베이스에 대해 현재 어떤 유형의 활동이 발생하고 있는지 확인할 수 있습니다.

SELECT * FROM pg_stat_activity WHERE datname='database name';

3
dropuser명령을 사용 하여 사용자도 제거하고 있습니다.
pl1nk

6
버전 9에 대해서는 도움이되지 않습니다. 열린 연결에 대한 오류가 계속 나타납니다.
Pavel Vlasov

4
그러면 postgres가 다시 시작되고 모든 사람의 연결이 끊어집니다. sudo service postgresql restart 다음을 수행하십시오. dropdb -h localhost -p 5432 -U "youruser" "testdb" ""에주의하여 특수 문자가 문제없이 입력되도록하십시오.
unom

1
postgres 사용자 사용 : sudo -u postgres dropdb '데이터베이스 이름'
leszek.hanusz

\l가지고있는 모든 데이터베이스를 볼 수 있습니다.
Sandip Subedi 2016 년

115

이것은 나를 위해 일했다 :

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';

PostgreSQL을 위해 이전의 9.2 교체 pid와 함께procpid

DROP DATABASE "YourDatabase";

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/


12
작동하도록 약간 변경해야했습니다.select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
mrt

column "procpid" does not exist
Amazon

흠. 이 명령을 실행했지만 "SSL 연결이 예기치 않게 닫혔습니다. [...] 재설정 시도 중 : 성공했습니다." 앤앤, 돌아 왔어
mlissner

67

이 시도. 데이터베이스가 지정되지 않았습니다. "서버에서"실행됩니다.

psql -U postgres -c "drop database databasename"

그래도 문제가 해결되지 않으면 postgres가 고아의 준비된 진술을 붙잡는 데 문제가있는 것으로 보입니다.
정리하려면 다음과 같이하십시오 :

SELECT * FROM pg_prepared_xacts;

그런 다음 모든 ID에 대해 다음을 실행하십시오.

ROLLBACK PREPARED '<id>';

데이터베이스에 익숙하지 않아서 어리석은 질문 일 수 있지만 어디에서 입력해야합니까? 데이터베이스에 바로 로그인하기 전에? 그리고 databasename을 내 데이터베이스 이름으로 바꿔야합니까?
iman453

@ iman453 : 쉘 / 명령 줄에서 바로 실행합니다.
mu는

2
postgresql에 대해서는 "서버에서만"과 같은 것은 없습니다. 데이터베이스에 연결해야합니다. 이 경우 postgres 데이터베이스에 연결됩니다. postgres 데이터베이스는 이와 같은 경우에만 거의 있습니다. 준비된 트랜잭션에 대한 좋은 지적이지만이 경우 문제라는 오류 메시지가 표시됩니다.
Scott Marlowe

1
미안 보헤미안이지만, 당신은 틀린 사람입니다. 다음은 명령 행에서 createdb를 실행하는 동안 pg_stat_activity입니다. postgres = # select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | 데이터베이스 생성 테스트; | f | 2011-08-19 16 : 18 : 26.918933-06 | 2011-08-19 16 : 18 : 26.918933-06 | 2011-08-19 16 : 18 : 26.916578-06 | | -1 이것은 다른 터미널의 명령 줄에서 createdb를 실행하는 동안 발생합니다. 첫 번째 필드는 내가 만든 b 스크립트가 연결된 DB입니다
Scott Marlowe

1
이것이 최고의 답변이 아닌 이유는 무엇입니까?
Henley Chiu

16

사용자가 연결되었다는 메시지가 표시되면 "select * from pg_stat_activity;" 말하다? 자신 이외의 다른 사용자가 이제 연결 되었습니까? 그렇다면 pg_hba.conf 파일을 편집하여 다른 사용자의 연결을 거부하거나 pg 데이터베이스에 액세스하는 모든 앱을 종료하여 삭제할 수 있습니다. 프로덕션에서이 문제가 발생하는 경우가 있습니다. pg_hba.conf를 다음과 같이 두 줄로 설정하십시오 :

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

그리고 pgsql에게 리로드 또는 재시작 (즉, sudo /etc/init.d/postgresql 리로드 또는 pg_ctl 리로드)을 지시하면 이제 컴퓨터에 연결하는 유일한 방법은 로컬 소켓을 통하는 것입니다. 나는 당신이 리눅스에 있다고 가정합니다. 그렇지 않으면 첫 번째 줄의 로컬 / 아이디 이외의 다른 호스트, 호스트 ... yourusername으로 조정해야 할 수도 있습니다.

이제 다음을 수행 할 수 있어야합니다.

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