Kami memulai ALTER TABLE
kueri beberapa jam yang lalu dan hanya baru-baru ini menyadari (via pg_stat_activity
) bahwa ia menunggu di kunci. Kami menemukan kueri lain yang menahan kunci di atas meja yang ingin kami ubah, dan tidak membiarkannya pergi.
Kueri kami adalah kueri "sederhana" (mengubah tipe data kolom), tetapi itu berjalan pada tabel besar.
Alih-alih membunuh proses yang menahan kunci, kami telah memutuskan kami lebih memilih untuk membunuh ALTER TABLE
.
Kami tidak membungkus ALTER TABLE
transaksi.
Sejauh yang saya mengerti, fakta bahwa permintaan kami sedang menunggu kunci berarti selalu menunggu kunci, dan tidak pernah mengubah apa pun.
Apakah ini benar? Apakah aman bagi kami untuk langsung membatalkan ALTER TABLE
permintaan kami ? Atau mungkinkah kueri telah memodifikasi sesuatu dan membatalkannya akan membuat database kita dalam keadaan setengah jadi?
PS: Rencananya adalah membatalkannya menggunakan SELECT pg_cancel_backend(pid);
. Jika ini adalah ide yang buruk, tolong beri tahu saya.
sumber
Jawaban:
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.
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()
danpg_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.
(luar biasa untuk memastikan bahwa migrasi skema masuk secara bersamaan atau tidak sama sekali.) Anda berkata, meskipun:
Itu bagus untuk satu perintah - dari dokumen ,
Jadi membatalkan itu
ALTER TABLE
, baik melaluipg_cancel_backend()
atau Ctrl-C yang dikeluarkan dari prompt psql mengendalikan, akan memiliki efek yang sama seperti jika Anda telah melakukan(meskipun seperti yang Anda harapkan, membatalkan yang mahal
ALTER TABLE
dapat menyelamatkan database dari banyak penggilingan yang tidak perlu jika Anda hanya akanROLLBACK
melakukannya.)sumber
Untuk menguraikan jawaban Josh yang benar dan luar biasa:
Iya.
Itu akan aman bahkan jika itu di tengah penulisan ulang tabel .
Jika Anda menginginkannya, Anda bisa mematikan seluruh server PostgreSQL, atau bahkan mesin yang dihidupkan, nyalakan kembali, dan semuanya akan baik-baik saja. DDL di PostgreSQL bersifat transaksional dan aman untuk macet.
Operasi DDL dicatat melalui WAL dan dijamin dapat dibatalkan atau diselesaikan setelah pemulihan setelah macet atau dibatalkan.
sumber