Ich bin ein PHP-Entwickler, seien Sie also nicht streng. Ich habe einen großen Tisch ~ 5,5 GB Dump. Unser PM hat beschlossen, eine neue Spalte zu erstellen, um eine neue Funktion auszuführen. Tabelle ist InnoDB also was ich versucht habe:
Ändern Sie die Tabelle auf dem Bildschirm mit der Tabellensperre. Dauerte ~ 30 Stunden und nichts. Also habe ich einfach aufgehört. Zuerst habe ich einen Fehler gemacht, weil ich nicht alle Transaktionen beendet habe, aber das zweite Mal war kein Multilock. Status war
copy to tmp table
.Da ich auch die Partitionierung für diese Tabelle anwenden muss, beschließen wir, einen Speicherauszug zu erstellen, die Tabelle umzubenennen und mit demselben Namen und neuer Struktur zu erstellen. Aber Dump macht eine strenge Kopie (zumindest habe ich nichts anderes gefunden). Also habe ich hinzugefügt, um eine neue Spalte mit
sed
auszugeben und abzufragen. Aber einige seltsame Fehler begannen. Ich glaube, es wurde durch Zeichensatz verursacht. Tabelle in utf-8 und Datei wurde nach us-asciised
. Ich habe also Fehler (unbekannter Befehl '\' ') bei 30% der Daten erhalten. Das ist also auch ein schlechter Weg.
Was sind andere Optionen, um dies zu erreichen und die Leistung zu beschleunigen (ich kann es mit PHP-Skript tun, aber es wird ewig dauern). Was wird Leistung INSERT SELECT
in diesem Fall sein.
Vielen Dank für jeden Fortschritt.
SET NAMES utf8
undCOLLATION
.Aber meh idk, warum 30% der Daten danach beschädigtsed
. Ich denke, die Massenladung wird die schnellste sein, aber vielleicht gibt es noch etwas, das mir fehlt. Vielen Dank MarkIhre sed Idee ist eine anständige Methode, aber ohne die Fehler oder den Befehl, den Sie ausgeführt haben, können wir Ihnen nicht helfen.
Eine bekannte Methode für Online-Änderungen an großen Tabellen ist jedoch die Änderung des pt-online-Schemas . Das vereinfachte Übersehen der Funktionen dieses Tools wird aus der Dokumentation kopiert:
Diese Methode kann auch eine Weile dauern, aber während des Vorgangs kann die ursprüngliche Tabelle vollständig verwendet werden.
quelle
'D\'agostini'
wird ein Fehler verursachtunknown command '\''
. Aber nicht immer, wie in 30% der Fälle. Das ist seltsam und fehlerhaft. Gleiches gilt auch für Hex-Blob-Dumps. Vielen Dank, Derek.alter table add column, algorithm=inplace, lock=none
ändert eine MySQL 5.6-Tabelle, ohne die Tabelle zu kopieren und ohne Auswirkungen zu sperren.Gerade gestern getestet, fügte die Masse 70.000 Zeilen in eine Partitionstabelle mit 280.000 Zeilen und 7 Partitionen ein, 10.000 Zeilen in jede Partition, wobei 5 Sekunden dazwischen geschlafen wurden, um anderen Durchsatz zu ermöglichen.
Begann die Masseneinfügungen, dann startete in einer separaten Sitzung die
alter
obige Online- Anweisung in MySQL Workbench, diealter
beendet wurde, bevor die Einfügungen, zwei neue Spalten hinzugefügt wurden und keine Zeilen aus der Änderung resultierten, was bedeutet, dass MySQL keine Zeilen kopierte.quelle
Derzeit ist die beste Option zum Ändern großer Tabellen wahrscheinlich https://github.com/github/gh-ost
gh-ost ist eine Online-Schema-Migrationslösung ohne Trigger für MySQL. Es ist testbar und bietet Pausierbarkeit, dynamische Steuerung / Rekonfiguration, Überwachung und viele betriebliche Vorteile.
gh-ost erzeugt während der Migration eine leichte Arbeitslast auf dem Master, die von der vorhandenen Arbeitslast auf der migrierten Tabelle entkoppelt ist.
Es basiert auf jahrelanger Erfahrung mit vorhandenen Lösungen und ändert das Paradigma der Tabellenmigrationen.
quelle
Ich denke, Mydumper / Myloader ist ein gutes Werkzeug für Operationen wie diese: Wird von Tag zu Tag besser. Sie können Ihre CPUs nutzen und Daten parallel laden: http://www.percona.com/blog/2014/03/10/new-mydumper-0-6-1-release-offers-several-performance-and- Usability-Features /
Ich habe es geschafft, Hunderte Gigabyte MySQL-Tabellen in Stunden zu laden.
Nun, wenn es um das Hinzufügen eine neue Spalte kommt, ist schwierig , da MySQL kopiert die gesamte Tabelle in dem Speicher -
TMP
Bereich mitALTER TABLE...
Obwohl MySQL 5.6 sagt es online Schemaänderungen tun, habe ich nicht geschaffen , sie online massive Tabellen ohne Sperre zu tun Streit noch.quelle
Ich hatte nur das gleiche Problem. Ein kleiner Workaround:
CREATE TABLE new_table SELECT * FROM oldtable;
DELETE FROM new_table
ALTER TABLE new_table ADD COLUMN new_column int (11);
INSERT INTO new_table wähle *, 0 aus old_table
drop table old_table; benenne die Tabelle new_table um TO old_table;
quelle