PostgreSQL: Drop database PostgreSQL melalui baris perintah [ditutup]

321

Saya mencoba untuk menjatuhkan database saya dan membuat yang baru melalui baris perintah.

Saya masuk menggunakan psql -U usernamedan kemudian melakukan \connect template1, diikuti oleh a DROP DATABASE databasename;.

Saya mendapatkan kesalahan

databasename database sedang diakses oleh pengguna lain

Saya mematikan Apache dan mencoba ini lagi tapi saya masih mendapatkan kesalahan ini. Apakah saya melakukan sesuatu yang salah?

iman453
sumber
2
Apa yang terjadi jika Anda menjalankan dropdb databasenameperintah dari baris perintah?
Dylan Markow
1
Ia mengatakan "GALAT: tidak bisa drop database yang saat ini terbuka"
iman453
4
Gunakan psql -U <user> -c "drop database protodb"(tanpa nama basis data)
pengguna
3
Ini akan me-restart postgres dan memutus semua orang: sudo service postgresql restart Kemudian lakukan: dropdb -h localhost -p 5432 -U "youruser" "testdb" Perhatikan "" untuk memastikan karakter khusus masuk tanpa hambatan.
unom
drop database <dataabase_name>;Jangan lupakan koma.
Sandip Subedi

Jawaban:

455

Anda dapat menjalankan perintah dropdb dari baris perintah:

dropdb 'database name'

Perhatikan bahwa Anda harus menjadi pengguna super atau pemilik basis data untuk dapat menjatuhkannya.

Anda juga dapat memeriksa tampilan pg_stat_activity untuk melihat jenis aktivitas apa yang sedang berlangsung terhadap database Anda, termasuk semua proses idle.

SELECT * FROM pg_stat_activity WHERE datname='database name';
csano
sumber
3
Saya menggunakan dropuserperintah untuk menghapus juga pengguna.
pl1nk
6
Tidak membantu menjawab seperti untuk versi 9. Kesalahan tentang koneksi terbuka masih muncul.
Pavel Vlasov
4
Ini akan me-restart postgres dan memutus semua orang: sudo service postgresql restart Kemudian lakukan: dropdb -h localhost -p 5432 -U "youruser" "testdb" Perhatikan "" untuk memastikan karakter khusus masuk tanpa hambatan.
unom
1
menggunakan pengguna postgres: sudo -u postgres dropdb 'database name'
leszek.hanusz
\luntuk melihat semua database yang Anda miliki.
Sandip Subedi
115

Ini bekerja untuk saya:

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

untuk postgresql lebih awal dari 9,2 ganti piddenganprocpid

DROP DATABASE "YourDatabase";

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

Eugene
sumber
12
Harus mengubahnya sedikit agar berfungsi:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
mrt
column "procpid" does not existuntuk amazon RDS postgres 9.6 misalnya
anon58192932
Hm Jalankan ini, tetapi langsung terhubung kembali, setelah mengatakan, "Koneksi SSL ditutup secara tak terduga [...] berusaha mengatur ulang: Berhasil." Annnd, aku kembali.
mlissner
67

Coba ini. Catatan tidak ada database yang ditentukan - hanya berjalan "di server"

psql -U postgres -c "drop database databasename"

Jika itu tidak berhasil, saya telah melihat masalah dengan postgres memegang pernyataan siap yatim.
Untuk membersihkannya, lakukan ini:

SELECT * FROM pg_prepared_xacts;

lalu untuk setiap id yang Anda lihat, jalankan ini:

ROLLBACK PREPARED '<id>';
Bohemian
sumber
Maaf saya baru di database, jadi ini mungkin pertanyaan bodoh, tapi di mana saya mengetik ini? Sebelum masuk ke dalam database, kan? Dan saya harus mengganti databasename dengan nama database saya kan?
iman453
@ iman453: Anda menjalankan itu langsung dari shell / command-line Anda.
mu terlalu pendek
2
Tidak ada yang namanya "just on the server" untuk postgresql. Anda harus terhubung ke database. Dalam hal ini Anda akan terhubung ke database postgres yang cukup banyak hanya untuk kasus-kasus seperti ini. Dan poin yang bagus tentang transaksi yang disiapkan, tetapi dalam hal ini Anda harus mendapatkan pesan kesalahan yang mengatakan bahwa itu masalahnya.
Scott Marlowe
1
Maaf Bohemian, tapi kaulah yang salah. Inilah pg_stat_activity saat menjalankan createb dari baris perintah: postgres = # select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | BUAT tes DATABASE; | 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 Perhatikan bahwa ini terjadi saat menjalankan createb dari baris perintah di terminal lain. Bidang pertama itu adalah db yang terhubung dengan skrip createb saya
Scott Marlowe
1
Mengapa ini bukan yang teratas, jawaban # 1?
Henley Chiu
16

Ketika dikatakan pengguna terhubung, apa yang query "pilih * dari pg_stat_activity;" mengatakan? Apakah pengguna lain selain Anda sekarang terhubung? Jika demikian, Anda mungkin harus mengedit file pg_hba.conf Anda untuk menolak koneksi dari pengguna lain, atau mematikan aplikasi apa pun yang mengakses database pg agar dapat menjatuhkannya. Saya punya masalah ini kadang-kadang dalam produksi. Set pg_hba.conf untuk memiliki dua baris seperti ini:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

dan beri tahu pgsql untuk memuat ulang atau memulai kembali (yaitu sudo /etc/init.d/postgresql memuat ulang atau pg_ctl memuat ulang) dan sekarang satu-satunya cara untuk terhubung ke mesin Anda adalah melalui soket lokal. Saya berasumsi Anda menggunakan linux. Jika tidak, ini mungkin perlu disesuaikan dengan sesuatu selain lokal / ident pada baris pertama itu, ke sesuatu seperti host ... nama pengguna Anda.

Sekarang Anda harus dapat melakukan:

psql postgres
drop database mydatabase;
Scott Marlowe
sumber