Sejauh yang saya mengerti, fakta bahwa permintaan kami sedang menunggu kunci berarti selalu menunggu kunci, dan tidak pernah mengubah apa pun.
Benar - jika Anda melihat bahwa pg_stat_activity.waiting adalah "benar" untuk ALTER TABLE, itu hampir pasti berarti bahwa ia dengan sabar menunggu kunci AKSES EKSKLUSIF pada tabel targetnya, dan pekerjaan nyata (menulis ulang meja jika perlu, mengubah katalog) , indeks pembangunan kembali, dll.) belum dimulai.
Apakah aman bagi kami untuk langsung membatalkan permintaan ALTER TABLE kami? Atau mungkinkah kueri telah memodifikasi sesuatu dan membatalkannya akan membuat database kita dalam keadaan setengah jadi?
Membatalkan pertanyaan (atau, yang setara, memutar kembali transaksi) di PostgreSQL tidak memiliki bahaya kerusakan basis data apa pun yang mungkin membuat Anda takut pada database lain tertentu (misalnya peringatan mengerikan di bagian bawah halaman ini). Itu sebabnya non-superuser, dalam versi terbaru, bebas untuk menggunakan pg_cancel_backend()
dan pg_terminate_backend()
untuk membunuh permintaan mereka sendiri yang berjalan di backend lainnya - mereka aman untuk digunakan tanpa khawatir tentang korupsi basis data. Bagaimanapun, PostgreSQL harus siap untuk menghadapi proses apa pun yang terbunuh misalnya SIGKILL dari pembunuh OOM, server shutdown, dll. Itulah gunanya log WAL .
Anda mungkin juga telah melihat bahwa di PostgreSQL, dimungkinkan untuk melakukan sebagian besar perintah DDL yang bersarang di dalam transaksi (multi-pernyataan), mis.
BEGIN;
ALTER TABLE foo ...;
ALTER TABLE bar ...;
-- more stuff
COMMIT; -- or ROLLBACK; if you've changed your mind
(luar biasa untuk memastikan bahwa migrasi skema masuk secara bersamaan atau tidak sama sekali.) Anda berkata, meskipun:
Kami tidak membungkus ALTER TABLE
transaksi.
Itu bagus untuk satu perintah - dari dokumen ,
PostgreSQL sebenarnya memperlakukan setiap pernyataan SQL sebagai dieksekusi dalam suatu transaksi. Jika Anda tidak mengeluarkan perintah BEGIN, maka setiap pernyataan individu memiliki BEGIN tersirat dan (jika berhasil) KOMIT membungkusnya. Sekelompok pernyataan yang dikelilingi oleh BEGIN dan COMMIT kadang-kadang disebut blok transaksi.
Jadi membatalkan itu ALTER TABLE
, baik melalui pg_cancel_backend()
atau Ctrl-C yang dikeluarkan dari prompt psql mengendalikan, akan memiliki efek yang sama seperti jika Anda telah melakukan
BEGIN;
ALTER TABLE ... ;
ROLLBACK;
(meskipun seperti yang Anda harapkan, membatalkan yang mahal ALTER TABLE
dapat menyelamatkan database dari banyak penggilingan yang tidak perlu jika Anda hanya akan ROLLBACK
melakukannya.)