Ich habe diesen InnoDB-Fehler in MySQL 5.0. Mysqld wurde sauber gestoppt, aber ich konnte danach ib_logfile0 & ib_logfile1 verlieren. Nach einem sauberen Start hat InnoDB nun seine "Absturzwiederherstellung" durchgeführt. Ich habe das Geschäft mit innodb_force_recovery = 4 durchgearbeitet, eine hängengebliebene MyISAM-Tabelle repariert, und abgesehen davon ist die Replikation jetzt einsatzbereit. Große Zahlen verpflichtet:
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.
Dies ist auf einem Slave-Server. Der obige Fehler spuckt zu Hunderten aus. Ich fand diese Antwort: "Einfügen und Löschen von Daten im Wert von> 64 GB, damit die Protokollfolgenummer groß genug aufgepumpt wird".
http://forums.mysql.com/read.php?22,50163,50163#msg-50163
Diese magische Zahl von 64 GB stammt von 4 GB * 16, wobei die "Hauptzahl" des Innodb-Protokolls dieses Typen von 0 auf 15 erhöht werden musste. Die Mine wird von 70 auf 111 = 164 GB. Dies dauert 5 Tage. Ich werde weiter daran arbeiten, mein Skript zu beschleunigen und es parallel auszuführen, um dies zu beschleunigen. In der Zwischenzeit hoffe ich, dass jemand anderes eine bessere Antwort hat. Das ist dumm.
Antworten:
Dies war eine ziemlich seltene Situation. Ich hoffe, dass ich nie wieder dort landen werde, mit einer InnoDB "log sequence number is in the future!" Error. Aufgrund meiner besonderen Details war das Neuerstellen / Wiederherstellen der Daten meines Servers ein letzter Ausweg. Einige Tricks waren gute Ideen, aber am Ende habe ich beschlossen, mein Perl-Skript weiter zu verbessern, um dieses alberne Spiel zu spielen und so viele Auftritte pro Stunde wie möglich zu absolvieren. Was soll's, es ist ein guter Systemstresstest.
Denken Sie daran: Das Ziel besteht darin, einen einzelnen Zähler ("log sequence number") zu erhöhen, der irgendwo in den Headern von ib_logfile0 und ib_logfile1 gespeichert ist . Dies dient dazu, InnoDB so auszutricksen, dass es einen offensichtlichen Zeitsprung ignoriert und mit dem Leben weitermacht. Aber niemand weiß, wie man diese Nummer bearbeitet. Oder wenn sie es wissen, redet niemand.
Hier ist mein Endprodukt. YMMV, aber die interne Generierung der Daten mit der REPEAT-Funktion von mysql ist sehr effizient.
Mein Rezeptvorschlag:
while true; do date; junk.pl dataX; done
.Beobachten Sie, wie Ihr LSN wächst, vielleicht in einer anderen Schleife:
Die große Zahl ist eine vorzeichenlose 32-Bit-INT, die mit 4 GB umbrochen wird und die jeweils kleinere Zahl erhöht. In diesem Fall oben ist es nur von 124 auf 125 gewälzt. Ihr Ziel ist im mysqld.log versteckt , das Sie von Anfang an zum Googeln für diese lächerliche Lösung geschickt hat. Sobald Sie die Ziellinie überquert haben, ist es soweit! Schlag die Hörner! Lassen Sie die Konfetti los!
quelle
Sie haben drei (3) Möglichkeiten:
OPTION 01: Führen Sie eine Synchronisierung von Master zu Slave durch (Ausfallzeit auf dem Master)
reset master;
Auf dem Master ausführen (Zaps Binary Logs)service mysql stop
Auf dem Masterservice mysql stop
Auf den Sklavenservice mysql start
Auf dem Masterservice mysql stop --skip-slave-start
Auf den Sklavenstart slave;
den Slave aus und lassen Sie die Replikation aufholenOPTION 02: Führen Sie eine Synchronisierung von Master zu Slave durch (minimale Ausfallzeit auf dem Master)
reset master;
Auf dem Master ausführen (Zaps Binary Logs)service mysql stop
Auf den Sklavenservice mysql stop
Auf dem Masterservice mysql start
Auf dem Masterservice mysql stop --skip-slave-start
Auf den Sklavenstart slave;
den Slave aus und lassen Sie die Replikation aufholenOPTION 03: Verwenden Sie XtraBackup
Dieses Software-Tool erstellt nicht nur eine unauffällige Kopie eines laufenden Masters, sondern erstellt auch die entsprechenden ib_log-Dateien für Sie. Sie müssten die Replikation einrichten
Ich habe zu diesem Thema schon einmal im StackExchange gepostet
Ich habe diese Dinge oft für das Webhosting-Unternehmen meines Arbeitgebers getan. Ein Kunde musste 3,7 TB umziehen und es dauerte ungefähr 16 Stunden. 64 GB sind im Vergleich sehr klein.
quelle
RESET SLAVE
ist dies hilfreich, insbesondere wenn Sie viele GB Relay-Protokolle angehäuft haben. Denken Sie nach dem rsync-Vorgang und der Wiederherstellung der Replikation daran, dass der Befehl CHANGE MASTER TO auch die Relay-Protokolle für Sie löscht.Ich fand heraus, dass es vielleicht eine coolere Möglichkeit gibt, dieses Problem bei partitionierten Tabellen zu lösen. Ich musste Partitionen von vor einigen Jahren löschen und einige für 2014 hinzufügen. Fast alle Partitionen melden diesen Fehler, also auch alte. Sehr böser Absturz.
Wenn Sie also die alte Partition DROPPEN und REORGANIZE der MAXVALUE-Partition (die letzte) verwenden, werden neue Dateien erstellt, die in Ordnung sind, sodass ich immer weniger Warnungen erhalte. In der Zwischenzeit hilft es, den Protokollsequenzzähler zu erhöhen, sodass ich keine falschen Daten einfügen muss. Ich habe das passiert auf einem Master-Server übrigens ...
Also das:
Und das:
Auf diese Weise wird jede Partition in der Änderung gelöscht und mit einer temporären Kopie des Inhalts der vorhandenen Partition neu erstellt. Sie können dies pro Tabelle tun, wenn Sie möchten. Meine Anwendung lässt dies zu, sodass Sie sich nicht um synchronisierte Sicherungen usw. kümmern müssen.
Nun zum Rest der Tabelle, da ich nicht alle Partitionen in dem Prozess berührt habe, werden einige mit der Protokollsequenz-Warnung belassen, für diejenigen, die defekt sind , aber von dieser Reorganisationsaktion abgedeckt werden, werde ich wahrscheinlich Folgendes ausführen:
oder das
Das brachte mich zum Nachdenken: Sie könnten dies mit einfachen Vanilletabellen tun, temporär Partitionen per Hash hinzufügen und später entfernen (oder behalten, ich kann Partitionen dringend empfehlen).
Ich benutze Mariadb jedoch nicht MySQL (also XtraDB)
Vielleicht hilft das jemandem. Ich leite es immer noch, soweit so gut. Das Ändern von ENGINE scheint ebenfalls zu funktionieren, daher bringe ich es zwischen MyIsam und ihnen zurück zu InnoDB.
Es ist ziemlich logisch, wenn Sie ENGINE ändern, verschwindet die Tabelle aus innodb, sodass dies kein Problem mehr darstellt.
es scheint hier zu funktionieren. Ich kann ein paar Dinge auf partitionierten Tabellen bestätigen:
Die letzten habe ich an mehreren Tischen verwendet. Die Warnungen treten auf, wenn versucht wird, die Dateien zu öffnen, und es gibt eine für jede Partitionsdefinition, die mit Leistungsindikatorproblemen geöffnet wird. Fast über die Ladentheke gerollt heute für die letzten Tische. Ich denke, wenn alles einmal abgearbeitet ist, muss man die Binärlogs leeren.
Update : Ich kann ein paar Dinge abschließen, jetzt habe ich es geschafft, dieses Problem zu lösen.
quelle
USE INFORMATION_SCHEMA; SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` REBUILD PARTITION ALL;") AS MySQLCMD AS MySQLCMD FROM TABLES;
(Quelle: dba.stackexchange.com/questions/35073/… ) schnell ändern und in eine Datei einbinden , die als Folge von Befehlen ausgeführt werden soll.