Apakah ada cara untuk memeriksa dan melihat apakah permintaan selesai? Saya menjalankan 3 permintaan pembaruan berjalan sangat lama (+/- 25 jam masing-masing) ketika saya pergi keluar untuk liburan minggu lalu. Sayangnya, di suatu tempat selama seminggu listrik padam dan mesin yang menjalankan MYSQL dimatikan. Apakah ada cara untuk memeriksa dan melihat mana dari 3 (atau ketiganya) pertanyaan yang diselesaikan?
Saya tahu saya bisa memeriksa untuk melihat apakah data telah diperbarui, tetapi NULL diharapkan dengan eksekusi yang benar dan lengkap dan ada 48 juta baris data untuk dibaca. Adakah pikiran?
Jawaban:
Jika Anda menjalankan dengan log biner diaktifkan ini dapat diperiksa dengan keandalan yang relatif tinggi.
Pertama, untuk melihat apakah log biner memang diaktifkan, jalankan:
Jika diaktifkan, Anda harus mendapatkan output seperti ini:
Kalau tidak, Anda akan mendapatkan pesan kesalahan.
Sekarang, jika log biner diaktifkan, maka komit yang berhasil juga ditulis ke log biner. Saya mengatakan "komit", tetapi kebenarannya adalah operasi yang berhasil, bahkan pada tabel non transaksional seperti MyISAM, ditulis di sana. Tapi, jujur saja, untuk memiliki kepastian tentang hasil dari pertanyaan Anda, saya berharap demi Anda menggunakan mesin transaksional seperti InnoDB, atau Anda tidak dapat memastikan apa pun.
OK, jadi anggaplah sekarang bahwa Anda memiliki log biner dihidupkan, dan bahwa tabel Anda bersifat transaksional (semoga InnoDB), maka penyelesaian kueri Anda yang berhasil diharapkan akan ditulis ke log biner.
Anda sekarang harus memburu log biner yang relevan dan mencari kueri di sana. Jika Anda menemukan kueri - bagus! Jika tidak - kemungkinan besar tidak ada di sana. Saya akan menjelaskan segera.
Log biner mana yang berisi kueri Anda? Lihatlah file log biner sendiri, biasanya di direktori data Anda. Cari cap waktu mereka. Ketika kekuatan muncul, log biner baru telah dibuat. Temukan. Pertanyaan Anda kemungkinan besar ada di log biner sebelum itu. Ini dugaan. Bisa juga satu sebelum itu, dll. Tapi itu dugaan bagus.
Sekarang, menggunakan
mysqlbinlog
utilitas, jalankan, dari baris perintah, sesuatu seperti ini:Ganti nama file dengan yang Anda duga berisi kueri.
Ini akan menampilkan semua permintaan dalam file log biner ini menjadi output standar. Di Unix, gunakan
grep
untuk menemukan kueri Anda:Di Windows, semoga berhasil. Buka dengan notepad ++ atau apalah dan cari secara manual.
Apakah ada kueri di sana? Besar - Anda tahu itu telah dilakukan.
Apakah kueri tidak ada di sana? Perlu memeriksa
sync_binlog
param. Apakah ini 1 ? Maka kueri tidak dalam log biner ==> kueri tidak dikomit. Tapi jikasync_binlog
tidak 1 , masih bisa menjadi kesempatan bahwa permintaan telah berkomitmen namun tidak di log biner, sebagai kecelakaan itu mungkin terjadi hanya setelahcommit
dan sebelum log biner memerah ke disk. Anda kemudian harus kembali ke cara lain.Yaitu: (dan mudah-mudahan, sekali lagi, Anda menggunakan InnoDB): cari satu baris yang dapat mengidentifikasi hasil kueri. Dengan InnoDB Anda mendapatkan "semua atau tidak sama sekali". Jika Anda dapat memastikan bahwa satu baris dipengaruhi oleh kueri - Anda dapat yakin bahwa kueri telah selesai.
sunting: tentu saja, jika log lambat diaktifkan, Anda dapat mengharapkan permintaan panjang tersebut untuk dicatat di sana setelah selesai juga ...
Semoga berhasil!
sumber