Saya memiliki beberapa tabel yang dipartisi dan memiliki beberapa indeks pada budak yang direplikasi. Setelah menyalin snap shot (diverifikasi aman) ke budak baru dan meningkatkan mysqld dari 5.1.42 ke 5.5.15 dan memulai kembali replikasi, saya mendapatkan InnoDB crash dengan pesan kesalahan "Invalid pointer ..."
Kesalahan ini terjadi di 2 server dengan perangkat keras dan O / S yang berbeda. Setelah berlari:
ALTER TABLE .... COALESCE PARTION n;
masalahnya hilang untuk tabel itu.
Namun, pertanyaan saya lebih besar cakupannya, dan itu adalah "Bagaimana Anda mengidentifikasi tabel InnoDB korupsi?" atau diulang lagi "Bagaimana Anda menilai kesehatan tabel InnoDB?" Apakah "PERIKSA TABEL" satu-satunya alat yang tersedia untuk mengidentifikasi masalah sebelum kecelakaan?
Tidak yakin apakah itu penting, tetapi crash terjadi berjalan: Versi: '5.5.15-55-log' socket: '/opt/mysql.sock' port: 3306 Server Percona (GPL), Rilis rel21.0, Revisi 158
sumber
Jawaban:
Morgan memberi petunjuk dalam komentarnya bahwa InnoDB terus-menerus memeriksa halaman yang rusak dengan melakukan checksum pada halaman yang dibacanya. Jika InnoDB menemukan ketidakcocokan checksum, itu akan
crashmenghentikan server.Jika Anda ingin mempercepat proses itu (alih-alih menunggu InnoDB membaca halaman yang rusak), Anda dapat menggunakan
innochecksum
:Peringatan yang menarik:
Jadi ya, untuk tabel online
CHECK TABLE
mungkin adalah alat (atau seperti yang ditunjukkan dalam jawaban lainmysqlcheck
jika Anda ingin melakukan lebih dari satu database sekaligus).Jika Anda dapat mematikan basis data Anda, Anda dapat memaksanya menggunakan checksum
innochecksum
Anekdotal: Pada tablespace innodb 29GB (dengan
innodb_file_per_table=1
), skrip ini memakan waktu sekitar 2 menitSebagai bonus, karena Anda menjalankan Percona, mereka menerapkan metode baru untuk checksum innodb cepat . Saya tidak pernah menggunakannya, tetapi mungkin mempercepat prosesnya.
sumber
PERINGATAN: sebelum mencoba salah satu instruksi ini, sangat disarankan untuk memverifikasi bahwa ada cadangan yang sehat dari database Anda di tangan, untuk berjaga-jaga. (terima kasih kepada @Nick untuk peringatannya)
Coba gunakan
mysqlcheck
perintah. Di terminal:Perintah ini akan menampilkan daftar semua tabel dan status yang memberi tahu Anda jika ada beberapa jenis korupsi:
Dengan itu di tangan Anda sudah tahu tabel mana yang harus Anda perbaiki. Untuk berjaga-jaga jika Anda ingin memperbaiki semuanya sekaligus:
Lebih lanjut tentang
mysqlcheck
: http://dev.mysql.com/doc/refman/5.0/id/mysqlcheck.htmlCatatan: Anda menandai pertanyaan Anda dengan percona . Saya tidak tahu apa itu, jadi saya mencari di Google. Tampaknya menjadi garpu dari MySQL, tapi saya tidak punya alasan untuk percaya bahwa perintahnya tidak kompatibel (semoga saja).
Seseorang menunjuk saya ke panduan ini yang memiliki instruksi lebih spesifik untuk pemulihan database InnoDB untuk situasi yang lebih kritis di mana seluruh database tidak dimulai: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html
sumber
CHECK TABLE
. Dokumentasi Anda terhubung ke negara-negara: "mysqlcheck
menggunakan pernyataan SQLCHECK TABLE
,REPAIR TABLE
,ANALYZE TABLE
, danOPTIMIZE TABLE
dengan cara yang nyaman bagi pengguna Ini menentukan pernyataan untuk digunakan untuk operasi Anda ingin melakukan, dan kemudian mengirimkan laporan ke server untuk dieksekusi.. " Itu bukan sinonim; itu adalah antarmuka pengguna ke kumpulan pernyataan.Menurut Panduan Studi Sertifikasi MySQL 5.0, Bagian 30.4 :
Silakan baca MySQL Docs di InnoDB Forced Recovery
sumber
Saya ingin tahu apa yang terjadi jika ada yang menggunakan data InnoDB yang dibuat melalui Plugin InnoDB dan kemudian beralih ke versi lain dari InnoDB. Itu bisa membuat kemungkinan halaman rusak di mata mysqld.
Perhatikan apa yang dikatakan oleh Dokumentasi MySQL tentang Format File InnoDB tentang kemungkinan ini:
Saya akan memo data pada budak. Bahkan, saya hanya akan menggunakan kekerasan dengan mendapatkan dump logis (mysqldump) dari data:
anwser asli saya diposting dianggap 'jadul'. Namun, dalam hal ini, saya pasti akan melihat ke dalam format file yang digunakan oleh .ibd dan / atau ibdata1.
sumber