Saya mendapatkan kesalahan InnoDB ini di MySQL 5.0. Mysqld dihentikan dengan bersih, tetapi saya berhasil kehilangan ib_logfile0 & ib_logfile1 sesudahnya. Sekarang setelah startup yang bersih, InnoDB telah melakukan "crash recovery". Saya telah melalui bisnis innodb_force_recovery = 4, memperbaiki tabel MyISAM yang hang, dan sekarang replikasi siap untuk dijalankan, terlepas dari ini. Jumlah besar yang disetujui:
111116 15:49:36 InnoDB: Error: page 393457 log sequence number 111 561,760,232
InnoDB: is in the future! Current system log sequence number 70 3,946,969,851.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: for more information.
Ini ada di server slave. Kesalahan di atas memuntahkan ratusan. Saya menemukan jawaban ini: "masukkan dan hapus data senilai> 64 GB, sehingga nomor urut log menjadi cukup besar".
http://forums.mysql.com/read.php?22,50163,50163#msg-50163
Angka ajaib 64GB itu berasal dari 4GB * 16 di mana innodb orang itu mencatat "angka utama" yang diperlukan untuk meningkat dari 0 menjadi 15. Tambang berjalan dari 70 menjadi 111 = 164 GB. Ini akan memakan waktu 5 hari. Saya akan terus berupaya mempercepat skrip saya, dan menjalankannya secara paralel untuk mempercepat skrip ini. Sementara itu, saya berharap orang lain memiliki jawaban yang lebih baik. Ini konyol.
Jawaban:
Ini adalah situasi yang sangat langka. Saya berharap untuk tidak pernah berakhir di sana lagi, dengan InnoDB "nomor urut log di masa depan!" kesalahan. Karena detail khusus saya, membangun kembali / memulihkan data server saya adalah pilihan terakhir. Beberapa kecurangan dalam membantu itu adalah ide yang bagus, tetapi pada akhirnya, saya memutuskan untuk terus meningkatkan skrip Perl saya untuk memainkan permainan konyol ini dan melakukan sebanyak mungkin pertunjukan / jam. Apa-apaan, ini adalah tes stres sistem yang baik.
Ingat: tujuannya adalah untuk meningkatkan penghitung tunggal ("nomor urut log") yang disimpan di suatu tempat di header ib_logfile0 dan ib_logfile1 . Ini untuk memalsukan InnoDB sehingga akan mengabaikan waktu yang jelas dan melanjutkan hidup. Tapi tidak ada yang tahu cara mengedit nomor itu. Atau jika mereka tahu, tidak ada yang berbicara.
Ini produk akhir saya. YMMV, tetapi menggunakan fungsi REPEAT mysql untuk menghasilkan data secara internal sangat efisien.
Resep yang saya sarankan:
while true; do date; junk.pl dataX; done
.Lihat LSN Anda tumbuh, mungkin di loop lain:
Jumlah besar adalah 32-bit INT unsigned yang akan membungkus di 4GB, meningkatkan lebih kecil jumlah setiap kali. Dalam kasus di atas, itu baru saja bergulir dari 124 menjadi 125. Tujuan Anda tersembunyi di mysqld.log yang mengirimi Anda Google untuk solusi konyol ini sejak awal. Setelah Anda melewati garis finish, itu saja! Tiuplah klakson! Lepaskan confetti!
sumber
Anda memiliki tiga (3) opsi:
OPSI 01: Lakukan rsync Master to Slave (Downtime on the Master)
reset master;
pada master (Zaps Binary Logs)service mysql stop
di masterservice mysql stop
di slaveservice mysql start
di masterservice mysql stop --skip-slave-start
pada budakstart slave;
pada slave dan biarkan replikasi menyusulOPSI 02: Lakukan rsync Master to Slave (Minimal Downtime pada Master)
reset master;
pada master (Zaps Binary Logs)service mysql stop
di budakservice mysql stop
di masterservice mysql start
di masterservice mysql stop --skip-slave-start
pada budakstart slave;
pada slave dan biarkan replikasi menyusulOPSI 03: Gunakan XtraBackup
Alat perangkat lunak ini tidak hanya akan membuat salinan master berjalan yang tidak mengganggu, tetapi juga akan membuat ib_logfiles yang sesuai untuk Anda. Anda harus mengatur replikasi
Saya telah memposting ke StackExchange sebelumnya tentang hal ini
Saya telah melakukan hal ini berkali-kali untuk perusahaan hosting web majikan saya. Satu klien memiliki 3.7TB untuk bergerak dan butuh sekitar 16 jam. 64GB sangat kecil dibandingkan.
sumber
RESET SLAVE
berguna, terutama jika Anda telah menumpuk banyak log relai GB. Setelah proses rsync dan pembangunan kembali replikasi, harap ingat perintah CHANGE MASTER TO TO juga akan menghapus log relai untuk Anda juga.Saya menemukan mungkin ada cara yang lebih keren untuk menyelesaikan masalah ini dengan bekerja pada tabel yang dipartisi. Saya perlu menghapus partisi dari beberapa tahun yang lalu, dan harus menambahkan beberapa untuk 2014. Hampir semua partisi melaporkan kesalahan ini, begitu juga yang lama. Kecelakaan yang sangat buruk.
Jadi sementara DROPPING lama dan menggunakan REORGANISASI dari partisi MAXVALUE (yang terakhir), itu akan membuat file baru yang ok, jadi saya mendapatkan semakin sedikit peringatan. Sementara itu, ini membantu menambah penghitung urutan log, jadi saya tidak perlu memasukkan data palsu. Saya memiliki ini terjadi pada server master btw ...
Jadi ini:
Dan ini:
Itu akan secara efektif menjatuhkan setiap partisi dalam perubahan dan membuatnya kembali dengan salinan temporer dari konten yang ada di sana. Anda dapat melakukan ini per tabel jika Anda mau, aplikasi saya memungkinkan hal itu terjadi, jadi tidak perlu khawatir tentang cadangan yang disinkronkan dll.
Sekarang untuk sisa tabel, karena saya belum menyentuh semua partisi dalam proses beberapa akan dibiarkan dengan peringatan urutan log, untuk orang-orang yang rusak tapi dan ditutupi oleh tindakan reorganisasi ini saya mungkin akan menjalankan ini:
atau itu
Jadi, itu membuat saya berpikir, Anda bisa melakukan ini dengan tabel vanilla biasa, menambahkan sementara partisi dengan hash dan kemudian menghapusnya (atau menyimpannya, saya sangat merekomendasikan partisi).
Saya menggunakan mariadb, bukan mysql (jadi XtraDB)
Mungkin ini membantu seseorang. Saya masih menjalankannya, sejauh ini sangat bagus. Mengubah ENGINE sepertinya melakukan pekerjaan itu juga, jadi saya membawanya kembali / maju antara MyIsam dan mereka kembali ke InnoDB.
Ini cukup logis, jika Anda mengubah ENGINE, tabel menghilang dari innodb, jadi itu tidak akan menjadi masalah lagi.
sepertinya bekerja di sini. Saya dapat mengkonfirmasi beberapa hal di tabel yang dipartisi:
Saya menggunakan yang terakhir di beberapa tabel. Peringatan terjadi ketika mencoba membuka file dan ada satu untuk setiap definisi partisi yang dibuka dengan masalah counter. Hampir terguling meja hari ini untuk tabel terakhir. Saya pikir setelah itu semua diproses kita perlu membersihkan log biner.
pembaruan : Saya dapat menyimpulkan beberapa hal sekarang saya berhasil menyelesaikan masalah ini.
sumber
USE INFORMATION_SCHEMA; SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` REBUILD PARTITION ALL;") AS MySQLCMD AS MySQLCMD FROM TABLES;
(sumber: dba.stackexchange.com/questions/35073/… ) dan mem -tee-nya ke file yang akan dieksekusi sebagai serangkaian perintah.