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:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(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:
select pg_cancel_backend(1234);
Itu adalah permintaan "ramah" untuk membatalkan kueri 1234, dan dengan sedikit keberuntungan itu akan hilang setelah beberapa saat. Akhirnya, ini lebih efisien:
select pg_terminate_backend(1234);
Jika Anda memiliki akses shell dan izin root atau postgres, Anda juga dapat melakukannya dari shell. Untuk "membatalkan" seseorang dapat melakukan:
kill -INT 1234
dan untuk "menghentikan", cukup:
kill 1234
TIDAK:
kill -9 1234
... 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.