Saya perlu menulis skrip yang akan menjatuhkan database PostgreSQL. Mungkin ada banyak koneksi untuk itu, tetapi skrip harus mengabaikannya.
DROP DATABASE db_name
Kueri standar tidak berfungsi ketika ada koneksi terbuka.
Bagaimana saya bisa menyelesaikan masalah?
postgresql
Roman Prykhodchenko
sumber
sumber
Jawaban:
Ini akan menjatuhkan koneksi yang ada kecuali untuk Anda:
Permintaan
pg_stat_activity
dan dapatkan nilai-nilai pid yang ingin Anda bunuh, kemudian berikanSELECT pg_terminate_backend(pid int)
kepada mereka.PostgreSQL 9.2 dan di atasnya:
PostgreSQL 9.1 dan di bawah ini:
Setelah Anda memutuskan semua orang, Anda harus memutuskan dan mengeluarkan perintah DROP DATABASE dari koneksi dari database lain alias bukan yang Anda coba jatuhkan.
Perhatikan pengubahan nama
procpid
kolom menjadipid
. Lihat utas milis ini .sumber
; drop database TARGET_DB;
bekerja dengan baik dalam kasus saya untuk memastikan db hilang pada saat hal-hal mulai mencoba kembali.dropdb --force
.Di PostgreSQL 9.2 dan di atasnya, untuk memutuskan segalanya kecuali sesi Anda dari basis data yang terhubung dengan Anda:
Di versi yang lebih lama itu sama, hanya berubah
pid
menjadiprocpid
. Untuk memutuskan sambungan dari database yang berbeda, cukup ubahcurrent_database()
ke nama database yang ingin Anda putuskan pengguna.Anda mungkin ingin
REVOKE
yangCONNECT
benar dari pengguna database sebelum memutuskan hubungan pengguna, jika tidak pengguna hanya akan terus menghubungkan kembali dan Anda tidak akan pernah mendapatkan kesempatan untuk menjatuhkan DB. Lihat komentar ini dan pertanyaan yang terkait dengannya, Bagaimana cara melepaskan semua pengguna lain dari basis data .Jika Anda hanya ingin memutuskan pengguna yang menganggur, lihat pertanyaan ini .
sumber
Anda bisa mematikan semua koneksi sebelum menjatuhkan basis data menggunakan
pg_terminate_backend(int)
fungsi.Anda bisa menjalankan semua backends menggunakan tampilan sistem
pg_stat_activity
Saya tidak sepenuhnya yakin, tetapi yang berikut mungkin akan membunuh semua sesi:
Tentu saja Anda mungkin tidak terhubung sendiri ke database itu
sumber
Bergantung pada versi postgresql Anda, Anda mungkin mengalami bug, yang membuat Anda
pg_stat_activity
menghilangkan koneksi aktif dari pengguna yang terputus. Koneksi ini juga tidak ditampilkan di dalam pgAdminIII.Jika Anda melakukan pengujian otomatis (di mana Anda juga membuat pengguna) ini mungkin skenario yang memungkinkan.
Dalam hal ini, Anda perlu kembali ke kueri seperti:
CATATAN: Dalam 9.2+ Anda harus mengubahnya
procpid
kepid
.sumber
procpid
kepid
snippet ini berfungsi pada 9.3.Saya perhatikan bahwa postgres 9.2 sekarang memanggil pid kolom daripada procpid.
Saya cenderung menyebutnya dari shell:
Semoga bermanfaat. Terima kasih kepada @JustBob untuk sql.
sumber
Saya baru saja me-restart layanan di Ubuntu untuk memutuskan klien yang terhubung.
sumber
Di Prompt perintah Linux, saya akan menghentikan semua proses postgresql yang berjalan dengan mengikat perintah ini sudo /etc/init.d/postgresql restart
ketik perintah bg untuk memeriksa apakah proses postgresql lain masih berjalan
lalu diikuti oleh dropdb dbname untuk drop database
Ini berfungsi untuk saya di command prompt linux
sumber
PostgreSQL 9.2 dan di atasnya:
SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'
sumber
Ini hack saya ... = D
Saya meletakkan jawaban ini karena menyertakan perintah (di atas) untuk memblokir koneksi baru dan karena setiap upaya dengan perintah ...
... jangan bekerja untuk memblokir koneksi baru!
Terima kasih kepada @araqnid @GoatWalker! = D
https://stackoverflow.com/a/3185413/3223785
sumber
PostgreSQL 13 yang akan datang akan memperkenalkan
FORCE
opsi.sumber
Dalam kasus saya, saya harus menjalankan perintah untuk menjatuhkan semua koneksi termasuk koneksi administrator aktif saya
yang menghentikan semua koneksi dan menunjukkan kepada saya pesan 'kesalahan' fatal:
FATAL: terminating connection due to administrator command SQL state: 57P01
Setelah itu dimungkinkan untuk drop database
sumber
Tidak ada yang bekerja untuk saya kecuali, saya loggin menggunakan pgAdmin4 dan di Dashboard saya memutus semua koneksi kecuali pgAdmin4 dan kemudian dapat mengubah nama dengan menjilat kanan pada database dan properti dan mengetik nama baru.
sumber