Konvertierung eines großen Tisches von MyISAM nach Innodb

9

Ich habe eine Tabelle mit ungefähr 300 Millionen Zeilen im MyISAM-Format, die ich in Innodb konvertieren möchte

Mein ursprüngliches Ziel war es, die Nutzung zu reduzieren, indem ich das Tabellenschema so änderte, dass es einfachere Indizes hatte. Ich habe die gesamte Tabelle gelöscht, sie gelöscht, mit weniger Indizes neu erstellt und importiere sie jetzt erneut. Ich habe jedoch vergessen anzugeben, dass es innodb anstelle von myisam sein soll.

Kann ich einfach die Standard-ALTER TABLE ... ENGINE = INNODB ausführen? Gibt es etwas Besonderes, das ich bei einem so riesigen Tisch beachten sollte?

Der Datenimport dauert ungefähr 12 Stunden - ich hasse es, das noch einmal zu tun. Deshalb möchte ich es einfach konvertieren.

Will Glass
quelle
Mit 300 Millionen Zeilen ist MyISAM wahrscheinlich ohnehin schneller und besser für eine Tabelle dieser Größe geeignet!
Mark Henderson

Antworten:

14

Der folgende Auszug stammt aus dem Buch " High Performance MySQL, Second Edition ".

Dies ist ein ausgezeichnetes Buch und ich würde es jedem empfehlen.

Die kurze Antwort lautet:

Mit Ihrer Tischgröße und Ihren Tischbedingungen, egal für welche Methode Sie sich entscheiden, ich denke, Sie werden möglicherweise lange warten müssen.


Tabellenkonvertierungen

Es gibt verschiedene Möglichkeiten, eine Tabelle von einer Speicher-Engine in eine andere zu konvertieren, die jeweils Vor- und Nachteile haben.

ALTER TABLE

mysql> ALTER TABLE mytable ENGINE = Falcon;

Diese Syntax funktioniert für alle Speicher-Engines, aber es gibt einen Haken: Es kann viel Zeit in Anspruch nehmen. MySQL führt eine zeilenweise Kopie Ihrer alten Tabelle in eine neue Tabelle durch. Während dieser Zeit wird wahrscheinlich die gesamte Festplatten-E / A-Kapazität des Servers verwendet, und die ursprüngliche Tabelle wird während der Konvertierung schreibgeschützt.

Dump und Import

Um mehr Kontrolle über den Konvertierungsprozess zu erhalten, können Sie die Tabelle zunächst mit dem Dienstprogramm mysqldump in eine Textdatei sichern. Sobald Sie die Tabelle gesichert haben, können Sie die Speicherauszugsdatei einfach bearbeiten, um die darin enthaltene Anweisung CREATE TABLE anzupassen. Stellen Sie sicher, dass Sie sowohl den Tabellennamen als auch den Typ ändern, da Sie nicht zwei Tabellen mit demselben Namen in derselben Datenbank haben können, auch wenn sie unterschiedlichen Typs sind. Mysqldump schreibt standardmäßig einen Befehl DROP TABLE vor CREATE TABLE Sie könnten also Ihre Daten verlieren, wenn Sie nicht vorsichtig sind!

ERSTELLEN und AUSWÄHLEN

Die dritte Umwandlungstechnik ist ein Kompromiss zwischen der Geschwindigkeit des ersten Mechanismus und der Sicherheit des zweiten. Erstellen Sie die neue Tabelle und füllen Sie sie wie folgt mit der INSERT ... SELECT-Syntax von MySQL, anstatt die gesamte Tabelle zu sichern oder alles auf einmal zu konvertieren:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Das funktioniert gut, wenn Sie nicht viele Daten haben, aber wenn Sie dies tun, ist es oft effizienter, die Tabelle inkrementell zu füllen und die Transaktion zwischen jedem Block festzuschreiben, damit die Rückgängig-Protokolle nicht riesig werden. Angenommen, id ist der Primärschlüssel, führen Sie diese Abfrage wiederholt aus (wobei Sie jedes Mal größere Werte von x und y verwenden), bis Sie alle Daten in die neue Tabelle kopiert haben:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Danach bleiben Ihnen die ursprüngliche Tabelle, die Sie löschen können, wenn Sie damit fertig sind, und die neue Tabelle, die jetzt vollständig gefüllt ist. Achten Sie darauf, die Originaltabelle bei Bedarf zu sperren, um eine inkonsistente Kopie der Daten zu vermeiden!

KPWINC
quelle
2

Die Anweisung ALTER TABLE macht im Wesentlichen dasselbe: Der Server erstellt eine temporäre Tabelle, in die er alle Zeilen kopiert und dann einen RENAME ausführt. On-Disk-Formate unterscheiden sich stark zwischen InnoDB und MyISAM, daher erwarte ich nicht, dass Sie eine Verknüpfung dazu finden.

Eine weitere Bemerkung (die Sie vielleicht kennen, die aber anderen beim Lesen helfen würde): Das On-Disk-Format für InnoDB hängt stark vom Primärschlüssel ab, da es darauf basierende Datensätze gruppiert. Wenn Sie also mit großen InnoDB-Tabellen arbeiten, überlegen Sie es sich zweimal, bevor Sie den Primärschlüssel auswählen, da durch dessen Änderung die gesamte Tabelle neu erstellt wird, ähnlich wie beim vorliegenden Problem.

Wie auch immer, ich empfehle, zuerst ein paar Tests an einem mittelgroßen Tisch durchzuführen und diese zu messen.

rpetre
quelle
2
Jede Tabellenänderungsoperation in MySQL (und dazu gehört das Hinzufügen von Indizes) erstellt die Tabelle neu.
David Pashley