J'ai cette erreur InnoDB dans MySQL 5.0. Mysqld a été arrêté proprement, mais j'ai réussi à perdre ib_logfile0 & ib_logfile1 par la suite. Maintenant, après un démarrage propre, InnoDB a fait sa «récupération après incident». J'ai parcouru l'entreprise innodb_force_recovery = 4, réparé une table MyISAM bloquée, et maintenant la réplication est prête à fonctionner, à part cela. Un grand nombre s'est engagé:
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.
C'est sur un serveur esclave. L'erreur ci-dessus crache par centaines. J'ai trouvé cette réponse: "insérer et supprimer> 64 Go de données, afin que le numéro de séquence du journal soit suffisamment gonflé".
http://forums.mysql.com/read.php?22,50163,50163#msg-50163
Ce nombre magique de 64 Go vient de 4 Go * 16 où le journal de l'innodb de ce type "numéro majeur" devait passer de 0 à 15. Le mien passe de 70 à 111 = 164 Go. Cela prendra 5 jours. Je vais continuer à travailler sur l'accélération de mon script et à l'exécuter en parallèle pour accélérer cela. En attendant, j'espère que quelqu'un d'autre aura une meilleure réponse. C'est idiot.
Réponses:
C'était une situation assez rare. J'espère ne plus jamais y retourner, avec un InnoDB "le numéro de séquence du journal est dans le futur!" Erreur. En raison de mes détails particuliers, la reconstruction / restauration des données de mon serveur était un dernier recours. Quelques astuces pour aider étaient de bonnes idées, mais à la fin, j'ai décidé de continuer à améliorer mon script Perl pour jouer à ce jeu stupide et à faire autant de concerts / heure que possible. Bon sang, c'est un bon test de résistance du système.
N'oubliez pas: l'objectif est d'augmenter un seul compteur ("numéro de séquence de journal") qui est stocké quelque part dans les en-têtes de ib_logfile0 et ib_logfile1 . C'est pour simuler InnoDB afin qu'il ignore une déformation temporelle apparente et continue la vie. Mais personne ne sait comment modifier ce numéro. Ou s'ils le savent, personne ne parle.
Voici mon produit final. YMMV, mais l'utilisation de la fonction REPEAT de mysql pour générer les données en interne est très efficace.
Ma recette suggérée:
while true; do date; junk.pl dataX; done
.Regardez votre LSN grandir, peut-être dans une autre boucle:
Le grand nombre est un INT 32 bits non signé qui se terminera à 4 Go, augmentant le plus petit nombre à chaque fois. Dans ce cas ci-dessus, il est simplement passé de 124 à 125. Votre objectif est caché dans le mysqld.log qui vous a envoyé Google pour cette solution ridicule en premier lieu. Une fois que vous avez franchi cette ligne d'arrivée, c'est tout! Sonnez les cornes! Relâchez les confettis!
la source
Vous avez trois (3) options:
OPTION 01: Effectuer la synchronisation du maître vers l'esclave (temps d'arrêt sur le maître)
reset master;
sur le maître (journaux binaires Zaps)service mysql stop
sur le maîtreservice mysql stop
sur l'esclaveservice mysql start
sur le maîtreservice mysql stop --skip-slave-start
sur l'esclavestart slave;
sur l'esclave et laissez la réplication rattraperOPTION 02: Effectuer la synchronisation du maître vers l'esclave (temps d'arrêt minimal sur le maître)
reset master;
sur le maître (journaux binaires Zaps)service mysql stop
sur l'esclaveservice mysql stop
sur le maîtreservice mysql start
sur le maîtreservice mysql stop --skip-slave-start
sur l'esclavestart slave;
sur l'esclave et laissez la réplication rattraperOPTION 03: utilisez XtraBackup
Cet outil logiciel fera non seulement une copie non importune d'un maître en cours d'exécution, mais créera également pour vous les ib_logfiles correspondants. Vous devrez configurer la réplication
J'ai déjà posté sur StackExchange à ce sujet
J'ai fait ces choses plusieurs fois pour la société d'hébergement Web de mon employeur. Un client avait 3,7 To pour se déplacer et cela a pris environ 16 heures. 64 Go est très petit en comparaison.
la source
RESET SLAVE
est utile, surtout si vous avez accumulé de nombreux Go de journaux de relais. Après le processus rsync et le rétablissement de la réplication, n'oubliez pas que la commande CHANGE MASTER TO effacera également les journaux de relais pour vous également.J'ai découvert qu'il existe peut-être un moyen plus efficace de résoudre ce problème en travaillant sur des tables partitionnées. J'ai dû supprimer des partitions il y a quelques années et j'ai dû en ajouter pour 2014. Presque toutes les partitions signalent cette erreur, donc aussi les anciennes. Accident très méchant.
Donc, tout en laissant tomber l'ancien et en utilisant REORGANIZE de la partition MAXVALUE (la dernière), cela créera de nouveaux fichiers qui sont ok, donc je reçois de moins en moins d'avertissements. En attendant, cela aide à incrémenter le compteur de séquence de journaux, donc je n'ai pas besoin d'insérer de fausses données. J'ai ce qui se passe sur un serveur maître btw ...
Donc ça:
Et ça:
Cela supprimera efficacement chaque partition dans la modification et la recréera avec une copie temporaire du contenu de ce qui s'y trouvait. Vous pouvez le faire par table si vous le souhaitez, mon application permet que cela se produise, donc pas besoin de vous soucier des sauvegardes synchronisées, etc.
Maintenant, pour le reste de la table, puisque je n'ai pas touché toutes les partitions dans le processus, certaines se retrouveront avec l'avertissement de séquence de journal, pour celles qui sont cassées mais couvertes par cette action de réorganisation, je vais probablement exécuter ceci:
ou ça
Donc, cela m'a fait penser, vous pouvez le faire avec des tables simples, ajouter temporairement des partitions par hachage et les supprimer plus tard (ou les conserver, je peux fortement recommander des partitions).
J'utilise cependant mariadb, pas mysql (donc XtraDB)
Peut-être que cela aide quelqu'un. Je le dirige toujours, jusqu'ici tout va bien. Changer d'ENGINE semble faire le travail aussi, donc je le ramène entre MyIsam et eux vers InnoDB.
C'est assez logique, si vous changez ENGINE, la table disparaît de innodb, donc ce ne sera plus un problème.
cela semble fonctionner ici. Je peux confirmer quelques éléments sur les tables partitionnées:
J'ai utilisé les derniers sur plusieurs tables. Les avertissements se produisent lorsqu'il essaie d'ouvrir les fichiers et il y en a une pour chaque définition de partition qu'elle ouvre avec des problèmes de compteur. Presque roulé sur le comptoir aujourd'hui pour les dernières tables. Je pense qu'une fois que tout est traité, il faut vider les journaux binaires.
mise à jour : je peux conclure quelques choses maintenant j'ai réussi à régler ce problème.
la source
USE INFORMATION_SCHEMA; SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` REBUILD PARTITION ALL;") AS MySQLCMD AS MySQLCMD FROM TABLES;
(source: dba.stackexchange.com/questions/35073/… ) et les insérer dans un fichier à exécuter sous la forme d'une série de commandes.