Saya menggunakan Heroku dengan opsi Crane Postgres dan saya menjalankan kueri di database dari mesin lokal saya ketika mesin lokal saya macet. Jika saya lari
select * from pg_stat_activity
salah satu entri memiliki
<IDLE> in transaction
di kolom current_query_text.
Akibatnya, saya tidak bisa menghapus tabel yang sedang ditulis oleh kueri yang dihentikan. Saya telah mencoba menggunakan pg_cancel_backend (N) dan mengembalikan True tetapi sepertinya tidak ada yang terjadi.
Bagaimana cara menghentikan proses ini sehingga saya dapat membatalkan tabel?
postgresql
heroku
alan
sumber
sumber
Jawaban:
Ini adalah jawaban Postgres umum, dan tidak khusus untuk heroku
(Jawaban sederhana-bodoh untuk pertanyaan ini mungkin ... mulai ulang postgresql. Dengan asumsi itu tidak diinginkan atau bukan pilihan ...)
Temukan PID dengan menjalankan sql ini:
(Permintaan mungkin perlu diperbaiki tergantung dari versi postgres - pada akhirnya, cukup pilih * dari pg_stat_activity). Anda akan menemukan pid di kolom pertama (kiri), dan baris pertama (atas) kemungkinan adalah kueri yang ingin Anda akhiri. Saya akan menganggap pid adalah 1234 di bawah ini.
Anda dapat membatalkan kueri melalui SQL (yaitu tanpa akses shell) selama itu milik Anda atau Anda memiliki akses pengguna super:
Itu adalah permintaan "ramah" untuk membatalkan kueri 1234, dan dengan sedikit keberuntungan itu akan hilang setelah beberapa saat. Akhirnya, ini lebih efisien:
Jika Anda memiliki akses shell dan izin root atau postgres, Anda juga dapat melakukannya dari shell. Untuk "membatalkan" seseorang dapat melakukan:
dan untuk "menghentikan", cukup:
TIDAK:
... yang akan sering mengakibatkan seluruh server postgres terbakar, maka Anda juga dapat memulai ulang postgres. Postgres cukup kuat, jadi datanya tidak akan rusak, tetapi saya merekomendasikan untuk tidak menggunakan "kill -9" dalam hal apa pun :-)
"Diam dalam transaksi" yang tahan lama sering kali berarti bahwa transaksi tidak diakhiri dengan "commit" atau "rollback", yang berarti bahwa aplikasi bermasalah atau tidak dirancang dengan benar untuk bekerja dengan database transaksional. "Diam dalam transaksi" yang tahan lama harus dihindari, karena juga dapat menyebabkan masalah kinerja yang besar.
sumber
select version()
. Apakah Anda mendapatkan pesan kesalahan saat menggunakanpg_cancel_backend
?Coba ini:
Lebih lanjut tentang ini dapat Anda temukan di sini . Ini harus menjadi solusi 'bersih' dari masalah ini daripada membunuh proses demi sistem.
sumber
Anda dapat menginstal
heroku-pg-extras
add-on dan menjalankan perintah berikut untuk mendapatkan PID:Kemudian lakukan saja:
CATATAN :
--force
opsi dapat digunakan untuk mengeluarkan pg_terminate_backend yang menjatuhkan seluruh koneksi untuk kueri itu.Jika
heroku pg:locks
tidak ada daftar apapun, cobaheroku pg:ps
.Untuk informasi lebih lanjut, lihat:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
sumber
Kita dapat menggunakan yang berikut ini untuk mencapainya dalam satu kueri:
sumber
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';