Daya padam - Apakah permintaan selesai?

9

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?


sumber
6
Log ... jika Anda mencatat sesuatu. Jika tidak, saya sarankan memulai.
Ben
1
@ Ben - terlambat untuk merekomendasikan UPS dan pemrosesan transaksional juga, saya kira.
1
Jika Anda menggunakan InnoDB, Anda dapat melakukan kode dalam transaksi. dev.mysql.com/doc/refman/5.0/en/commit.html
1
Jika Anda mengaktifkan log permintaan lambat, maka kueri yang lambat mungkin akan berakhir di log kueri lambat.
3
Dan, jika tidak lengkap, apakah Anda memiliki cadangan?

Jawaban:

9

Jika Anda menjalankan dengan log biner diaktifkan ini dapat diperiksa dengan keandalan yang relatif tinggi.

Pertama, untuk melihat apakah log biner memang diaktifkan, jalankan:

SHOW BINARY LOGS;

Jika diaktifkan, Anda harus mendapatkan output seperti ini:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

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 mysqlbinlogutilitas, jalankan, dari baris perintah, sesuatu seperti ini:

mysqlbinlog mysql-bin.000245

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 grepuntuk menemukan kueri Anda:

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

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_binlogparam. Apakah ini 1 ? Maka kueri tidak dalam log biner ==> kueri tidak dikomit. Tapi jika sync_binlogtidak 1 , masih bisa menjadi kesempatan bahwa permintaan telah berkomitmen namun tidak di log biner, sebagai kecelakaan itu mungkin terjadi hanya setelah commitdan 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!

Shlomi Noach
sumber
2
Saya harap Anda tetap tinggal.
jcolebrand
2
@jcolebrand Rolando dapat melakukan beberapa kompetisi di sini :)
Philᵀᴹ