it-swarm.com.de

ALTER TABLE ADD COLUMN dauert lange

Ich habe gerade versucht, einer Tabelle (main_table) in einer Datenbank eine Spalte namens "location" hinzuzufügen. Der Befehl, den ich ausführte, war

ALTER TABLE main_table ADD COLUMN location varchar (256);

Die main_table enthält> 2.000.000 Zeilen. Es läuft länger als 2 Stunden und ist immer noch nicht abgeschlossen. 

Ich habe versucht, mytop zu verwenden, um die Aktivität dieser Datenbank zu überwachen, um sicherzustellen, dass die Abfrage nicht durch einen anderen Abfrageprozess gesperrt ist. Soll es so lange dauern? Eigentlich habe ich den Rechner gerade neu gestartet, bevor ich diesen Befehl ausgeführt habe. Jetzt läuft dieser Befehl noch. Ich bin nicht sicher, was ich tun soll. 

57
fanchyna

Ihre ALTER TABLE-Anweisung impliziert, dass mysql jede einzelne Zeile der Tabelle einschließlich der neuen Spalte neu schreiben muss. Da Sie mehr als 2 Millionen Zeilen haben, würde ich definitiv erwarten, dass dies eine beträchtliche Zeit in Anspruch nimmt, in der Ihr Server wahrscheinlich meistens IO-gebunden ist. Normalerweise sollten Sie Folgendes tun:

CREATE TABLE main_table_new LIKE main_table;
ALTER TABLE main_table_new ADD COLUMN location varchar(256);
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table;
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table;
DROP TABLE main_table_old;

Auf diese Weise fügen Sie die Spalte in die leere Tabelle ein und schreiben im Wesentlichen die Daten in die neue Tabelle, von der Sie sicher sind, dass sie von niemand anderem betrachtet wird, ohne so viele Ressourcen zu sperren.

163
Romain

Ich denke, die passende Antwort dafür ist die Verwendung einer Funktion wie pt-online-schema-change oder gh-ost

Wir haben damit eine Migration von mehr als 4 Milliarden Zeilen durchgeführt, obwohl dies bis zu 10 Tage dauern kann, mit weniger als einer Minute Ausfallzeit. 

Percona arbeitet auf ähnliche Weise wie oben

  • Erstellen Sie eine temporäre Tabelle
  • Erzeugt Trigger für die erste Tabelle (für Einfügungen, Aktualisierungen, Löschungen), damit sie in der temporären Tabelle repliziert werden
  • Migrieren Sie Daten in kleinen Batches
  • Wenn Sie fertig sind, benennen Sie die Tabelle in eine neue Tabelle um und löschen Sie die andere Tabelle
21
Pratik Bothra

Das Ändern von Tabellen dauert bei großen Daten wie in Ihrem Fall sehr lange. Vermeiden Sie daher die Verwendung in solchen Situationen und verwenden Sie Code wie diesen:

select main_table.*, 
  cast(null as varchar(256)) as null_location, -- any column you want accepts null
  cast('' as varchar(256)) as not_null_location, --any column doesn't accept null
  cast(0 as int) as not_null_int, -- int column doesn't accept null
into new_table 
from main_table;

drop table main_table;
rename table new_table TO main_table;
0
ZORRO_BLANCO