PostgreSQL: Upuść bazę danych PostgreSQL za pomocą wiersza poleceń [zamknięte]

321

Próbuję usunąć moją bazę danych i utworzyć nową za pomocą wiersza polecenia.

Loguję się za pomocą, psql -U usernamea następnie robię \connect template1, a następnie DROP DATABASE databasename;.

Dostaję błąd

baza danych nazwa bazy danych jest dostępna dla innych użytkowników

Zamknąłem Apache i spróbowałem ponownie, ale wciąż pojawia się ten błąd. czy robię coś źle?

iman453
źródło
2
Co się stanie, jeśli uruchomisz dropdb databasenamepolecenie z wiersza poleceń?
Dylan Markow
1
Mówi: „BŁĄD: nie można usunąć aktualnie otwartej bazy danych”
iman453
4
Użyj psql -U <user> -c "drop database protodb"(bez nazwy bazy danych)
użytkownik
3
Spowoduje to zrestartowanie postgres i rozłączenie wszystkich: usługa sudo postgresql restart Następnie wykonaj: dropdb -h localhost -p 5432 -U „youruser” „testdb” Zwróć uwagę na „”, aby upewnić się, że znaki specjalne wejdą bez przeszkód.
unom
drop database <dataabase_name>;Nie zapomnij o przecinku.
Sandip Subedi

Odpowiedzi:

455

Możesz uruchomić polecenie dropdb z wiersza poleceń:

dropdb 'database name'

Pamiętaj, że musisz być superużytkownikiem lub właścicielem bazy danych, aby móc go upuścić.

Możesz także sprawdzić widok pg_stat_activity, aby zobaczyć, jaki rodzaj aktywności ma obecnie miejsce w bazie danych, w tym wszystkie bezczynne procesy.

SELECT * FROM pg_stat_activity WHERE datname='database name';
csano
źródło
3
Używam dropuserpolecenia, aby usunąć również użytkownika.
pl1nk
6
Nie pomocna odpowiedź jak w wersji 9. Błąd dotyczący otwartych połączeń nadal pojawia się.
Pavel Vlasov
4
Spowoduje to zrestartowanie postgres i rozłączenie wszystkich: usługa sudo postgresql restart Następnie wykonaj: dropdb -h localhost -p 5432 -U „youruser” „testdb” Zwróć uwagę na „”, aby upewnić się, że znaki specjalne wejdą bez przeszkód.
unom
1
za pomocą użytkownika postgres: sudo -u postgres dropdb 'nazwa bazy danych'
leszek.hanusz
\laby zobaczyć wszystkie bazy danych, które masz.
Sandip Subedi
115

To działało dla mnie:

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

PostgreSQL 9.2 zastąpić wcześniej niż pidzprocpid

DROP DATABASE "YourDatabase";

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

Eugene
źródło
12
Musiałem to trochę zmienić, aby działało:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
mr
column "procpid" does not existdla amazon RDS postgres instancja 9.6
anon58192932
Hm Uruchomiłem to, ale natychmiast połączyło się ponownie, mówiąc: „Połączenie SSL nieoczekiwanie [...] próbowało się zresetować: Udało się”. Annnd, wróciłem.
mlissner,
67

Spróbuj tego. Uwaga: nie określono bazy danych - po prostu działa ona „na serwerze”

psql -U postgres -c "drop database databasename"

Jeśli to nie zadziała, zauważyłem problem z postgresami trzymającymi się osieroconych przygotowanych wypowiedzi.
Aby je wyczyścić, wykonaj następujące czynności:

SELECT * FROM pg_prepared_xacts;

następnie dla każdego identyfikatora, który widzisz, uruchom to:

ROLLBACK PREPARED '<id>';
Czeski
źródło
Przepraszam, jestem nowy w bazach danych, więc jest to prawdopodobnie głupie pytanie, ale gdzie mam to wpisać? Przed zalogowaniem się do bazy danych, prawda? I powinienem zastąpić nazwę bazy danych nazwą mojej bazy danych, prawda?
iman453
@ iman453: Uruchomiłbyś to bezpośrednio ze swojej powłoki / wiersza poleceń.
mu jest za krótki
2
Dla postgresql nie ma czegoś takiego jak „tylko na serwerze”. Musisz połączyć się z bazą danych. W takim przypadku będziesz się łączyć z bazą danych postgres, która jest tam prawie tylko dla takich przypadków. I dobra uwaga na przygotowane transakcje, ale w takim przypadku powinieneś otrzymać komunikat o błędzie informujący, że to jest problem.
Scott Marlowe,
1
Przepraszam, czeski, ale to ty się mylisz. Oto pg_stat_activity podczas działania createb z wiersza poleceń: postgres = # select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | Test UTWÓRZ BAZA DANYCH; | 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 Zauważ, że dzieje się tak podczas uruchamiania utworzonegobz wiersza poleceń w innym terminalu. To pierwsze pole to db, z którym był połączony mój skrypt utworzonyb
Scott Marlowe
1
Dlaczego nie jest to najlepsza odpowiedź nr 1?
Henley Chiu
16

Kiedy mówi, że użytkownicy są połączeni, co oznacza zapytanie „wybierz * z pg_stat_activity;” mówić? Czy inni użytkownicy oprócz ciebie są teraz połączeni? Jeśli tak, być może będziesz musiał edytować plik pg_hba.conf, aby odrzucić połączenia od innych użytkowników lub zamknąć dowolną aplikację uzyskującą dostęp do bazy danych pg, aby móc ją usunąć. Czasami mam ten problem przy produkcji. Ustaw pg_hba.conf, aby miał dwa takie wiersze:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

i powiedz pgsql, aby przeładował lub zrestartował (tj. albo sudo /etc/init.d/postgresql reload lub pg_ctl reload), a teraz jedynym sposobem na połączenie się z maszyną jest użycie lokalnych gniazd. Zakładam, że jesteś na Linuksie. Jeśli nie, może to wymagać dostosowania do czegoś innego niż local / ident w pierwszym wierszu, do czegoś takiego jak host ... twoja nazwa użytkownika.

Teraz powinieneś być w stanie zrobić:

psql postgres
drop database mydatabase;
Scott Marlowe
źródło