Jika memulai kembali postgres adalah sebuah opsi, maka kemungkinan besar itu akan menyelesaikan masalah dan akan menyelamatkan Anda dari menghabiskan waktu membaca sisa jawaban ini :-)
Periksa pg_stat_activity
lihat, mungkin ada beberapa transaksi lain yang memblokir perubahan skema.
select * from pg_stat_activity
where
wait_event_type is NULL and xact_start is not NULL order by xact_start;
(pg_stat_activity diubah sedikit di setiap rilis pg utama, coba ini untuk versi yang lebih lama):
select * from pg_stat_activity
where
not waiting and xact_start is not NULL order by xact_start;
Baris pertama yang muncul mungkin yang menyebabkan masalah. Ini sering kali merupakan "menganggur dalam transaksi" - ini mungkin menahan kunci, dan jika ini adalah transaksi lama, itu mungkin juga mematikan kinerja. Mungkin programmer lupa untuk memastikan mengakhiri transaksi dengan "commit" atau "rollback", atau mungkin beberapa sesi db macet karena masalah jaringan.
Untuk mengakhiri transaksi dengan pid 1234, gunakan select pg_cancel_backend(1234);
, jika gagal, select pg_terminate_backend(1234)
. Dengan akses shell, perintah yang setara adalah kill -INT 1234
dan kill 1234
. (ingat, kill -9 1234
adalah ide yang sangat buruk).
Ada juga tampilan pg_locks
yang mungkin memberikan beberapa wawasan, meskipun mungkin tidak mudah untuk mendapatkan info berguna darinya. Jika granted
benar, kunci ditahan, ketika granted
salah itu berarti kueri sedang menunggu kunci. Berikut adalah beberapa petunjuk lagi di sini tentang cara mengekstrak info berguna dari pg_locks:http://wiki.postgresql. org/wiki/Lock_Monitoring
Jika semuanya gagal, maka mungkin sudah waktunya untuk mencari solusi sederhana, restart server database itu.