Wir haben eine ziemlich kleine Datenbank, die wir von MyISAM nach InnoDB konvertieren wollten. Da wir keine Datenbankbenutzer sind, haben wir nur mithilfe von alter table konvertiert, ohne die Site zu entfernen.
Nachdem die Konvertierung abgeschlossen ist, scheinen viele intermittierende Zeilen zu fehlen. Ist dies möglicherweise auf Operationen während der Konvertierung zurückzuführen? Oder liegt das Problem woanders?
Antworten:
Durch Ausführen von ALTER zum Ändern von Speicher-Engines werden Zeilen nicht ausgeblendet. Lassen Sie mich jedoch einige Ratschläge geben, da Sie in Ihrer Frage angegeben haben, dass Sie 'Datenbank-Noobs' sind.
Im Folgenden finden Sie einige grundlegende Ratschläge zum Ändern eines vorhandenen Schemas oder zu Maßnahmen, die sich auf die Daten auswirken können:
Es gibt wahrscheinlich noch viel mehr, auf das ich mich einlassen könnte, aber das Obige bietet Ihnen Optionen, wenn etwas schief geht.
Was Ihre fehlenden Daten / Zeilen betrifft, gibt es keine Möglichkeit, ohne einen "Vorher / Nachher" -Snapshot zu wissen, der verglichen werden kann. Sie können mit Ihrer letzten Sicherung vergleichen, um zumindest zu überprüfen, ob dies der Fall ist.
quelle
Eine der besten Möglichkeiten, MyISAM ohne viel Ausfallzeit nach InnoDB zu konvertieren, ist nur eine Voraussetzung: Verwenden Sie einen Replication Slave.
Hier ist eine Vogelperspektive des Plans
Hört sich einfach an? Dahinter stecken viele Details.
Replikations-Master / Slave-Setup erstellen
Es gibt eine clevere Möglichkeit, einen Slave zu erstellen, ohne den Master zu stören. Ich habe zwei Posts geschrieben:
Lesen Sie diese beiden Beiträge, anstatt zu erläutern, wie Sie rsync verwenden.
Konvertieren Sie jede MyISAM-Tabelle auf dem Slave in InnoDB
Auf dem DB-Slave können Sie die folgende SQL-Anweisung ausführen:
Für MySQL 5.5:
Version für MySQL vor MySQL 5.5
Mit der Ausgabe der Abfrage haben Sie ein Konvertierungsskript für den Slave.
Sie müssen diese beiden Zeilen oben im Skript einfügen:
Das Skript deaktiviert zuerst die Binärprotokollierung (wenn Sie den Slave für Binärprotokolle konfiguriert haben), stoppt die Replikation und konvertiert jede MyISAM-Tabelle in InnoDB.
So erstellen Sie das Skript und führen es aus:
Richten Sie Ihre App auf den Slave
Führen Sie SELECT-Abfragen vom Slave aus. Wenn Sie mit dem Dateninhalt auf dem Slave zufrieden sind, können Sie Ihre App wie folgt auf den Slave richten:
SHOW SLAVE STATUS\G
und stellen Sie sicher, dass Seconds_Behind_Master 0 istservice mysql stop
(Ausfallzeit beginnt)Wenn Sie bis zu diesem Punkt unversehrt gemacht haben, HERZLICHEN GLÜCKWUNSCH !!!
ADDED BONUS : Wenn Sie Master / Master-Replikation (auch als zirkuläre Replikation bezeichnet) anstelle von Master / Slave einrichten , können Sie dies stattdessen tun:
SHOW SLAVE STATUS\G
und stellen Sie sicher, dass Seconds_Behind_Master 0 istSTOP SLAVE;
CHANGE MASTER TO MASTER_HOST='';
Was Sie jetzt haben, ist Master / Slave in umgekehrter Richtung. Der neue Master verfügt über InnoDB-Daten und der alte Master ist jetzt ein Slave mit MyISAM-Daten. Wenn Sie Lese- und Schreibvorgänge aufteilen, können Lesevorgänge vom Slave (Lesevorgänge von MyISAM sind schneller als von InnoDB) und Schreibvorgänge vom Master (Transaktionsunterstützung für InnoDB) ausgeführt werden. Wie Hannah Montana singt, bekommen Sie das Beste aus beiden Welten (Ja, ich habe zwei Töchter, die die Show lieben) !!!
EIN WEITERER HINZUGEFÜGTER BONUS : Da der Master jetzt InnoDB ist, können Sie vom Master einen Mysqldump ausführen, ohne Ausfallzeiten zu haben und ohne die Transaktionen zu stören. Einziger Nachteil ist die Erhöhung der CPU- und Festplatten-E / A. Sie könnten also einen mysqldump von Tabellenstrukturen nur auf dem Master (InnoDB) und einen mysqldump der Daten nur auf dem Slave (Ein solcher Dump enthält keine Verweise auf InnoDB oder MyISAM. Es handelt sich nur um Daten) plus einen mysqldump des Tabellenstrukturen für den Slave mit dem MyISAM-Layout.
Die Möglichkeiten können durch dieses neue Setup weitergehen ...
UPDATE 2011-08-27 19:50 EDT
Entschuldigen Sie. Ich habe die Frage nicht vollständig gelesen. Sie haben das Gespräch bereits geführt .
Nur wenn Sie bereits die binäre Protokollierung aktiviert hatten und zuvor eine Sicherung durchgeführt haben, können Sie dies tun
service mysql stop
service mysql start --datadir=/var/lib/mysql2
Dies sollte alles auffangen, was aufgezeichnet wurde, und die Konvertierung sollte ansetzen. Dies ist wiederum problematisch, wenn Sie vor der letzten Sicherung bereits die binäre Protokollierung aktiviert hatten . Ansonsten mein Beileid.
quelle