Apakah membatalkan proses (AUTO) VACUUM di PostgreSQL membuat semua pekerjaan menjadi sia-sia?


13

Dalam beberapa kesempatan, dan setelah membuat besar-besaran update, insertatau deletedari sebuah meja, saya telah memulai VACUUM FULL ANALYZEuntuk memastikan DB tidak terlalu membengkak. Melakukannya dalam basis data produksi telah membuat saya menemukan bahwa ini bukan ide yang baik, karena saya bisa memblokir tabel untuk jangka waktu yang lama. Jadi, saya membatalkan prosesnya, mungkin mencoba VACUUM(tidak penuh) atau membiarkannya AUTOVACUUMnanti, apa pun yang dapat dilakukannya.

Pertanyaannya adalah: jika saya menghentikan "mid-way" VACUUM atau AUTOVACUUM, apakah semua pemrosesan sudah selesai hilang?

Sebagai contoh, jika VACUUMsudah menemukan 1 M baris mati dan saya menghentikannya, apakah semua informasi ini hilang? Apakah VACUUM bekerja secara transaksional sepenuhnya ("semua atau tidak sama sekali", seperti sejumlah proses PostgreSQL yang sangat baik)?

Jika VACUUM dapat terputus dengan aman tanpa semua pekerjaan hilang, apakah ada cara untuk membuat vacuumpekerjaan secara bertahap? [Berfungsi untuk 100 ms, berhenti, tunggu 10 ms untuk memungkinkan untuk tidak memblokir seluruh dunia ... dan seterusnya]. Saya tahu Anda dapat melakukan sebagian dari ini dengan menyetel parameter autovacuum, tapi saya berpikir untuk mengendalikan ini secara terprogram, untuk dapat melakukannya pada waktu tertentu / dalam kondisi tertentu.


CATATAN: Hentikan / batalkan / matikan sarana proses dalam konteks ini:

  • Jika menggunakan pgAdmin, tekan tombol "Cancel Query".
  • Jika berfungsi secara pemrograman, panggil pg_cancel_backend ().

Saya berasumsi bahwa keduanya setara. Saya belum pernah menggunakan perintah kill level / shell-system.

Jawaban:


8

Pekerjaan yang dilakukan oleh VACUUM FULL yang terputus akan sepenuhnya hilang, karena hanya akan kembali menggunakan versi tabel sebelumnya dan membuang versi tabel yang sedang diproses.

Pekerjaan yang dilakukan oleh VACUUM biasa (tidak-LENGKAP) mungkin tidak sepenuhnya hilang. Itu membersihkan indeks dalam batch, dan setiap batch yang sudah sepenuhnya dibersihkan tidak perlu dibersihkan lagi. Mereka masih perlu diperiksa lagi, tetapi akan ditemukan sudah bersih lain kali. Jadi, Anda dapat menyimpan beberapa tulisan IO yang tidak perlu diulang.


1
Akan suka lebih detail tentang ini, terutama pada autovacuum. Saya memiliki server yang sibuk dengan banyak basis data dan terkadang autovacuum dapat memakan waktu lama. Ketika itu terjadi, membuat indeks baru, misalnya, tidak mungkin karena autovacuum memiliki kunci. Akan ideal dalam beberapa kasus untuk membunuh autovacuum dan menerapkan indeks dan kemudian mudah-mudahan ketika autovacuum berjalan lagi itu tidak harus berjalan selama hampir selama. Adakah cara untuk melihat detail dari apa yang telah dilakukan / dilakukan autovacuum pada tabel dan indeks?
Kurt Koller

3
9.6 memperkenalkan pandangan untuk memantau kemajuan vakum: postgresql.org/docs/current/static/progress-reporting.html . Saya belum bermain-main dengan itu sendiri, jadi tidak tahu seberapa baik itu akan bekerja untuk Anda. Autovacuum harus menyerah pada kunci secara otomatis, kecuali jika itu dilakukan untuk pembungkus. Pengaturan default untuk autovacuum sangat dibatasi, sehingga mungkin tidak berjalan lebih cepat di lain waktu hanya karena sedang dipercepat dengan kecepatan yang sama. Saya secara rutin mengatur vacuum_cost_page_hitdan vacuum_cost_page_misske nol.
jjanes
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.