Online DDL in MySQL: ALGORITHM=INSTANT vs. INPLACE vs. COPY verstehen
AI generated
InnoDB
SQL
MySQL / Schema-Migration
Online DDL in MySQL
ALGORITHM=INSTANT, INPLACE oder COPY richtig verstehen

Nicht jede ALTER-TABLE-Anweisung ist in MySQL gleich teuer. Manche Änderungen sind reine Metadaten-Operationen, die in Millisekunden abgeschlossen sind, andere kopieren im Hintergrund die komplette Tabelle und blockieren Schreibzugriffe für Sekunden oder Minuten. Wer bei mehreren hundert Gigabyte großen Magento-Tabellen den Unterschied zwischen ALGORITHM=INSTANT, INPLACE und COPY nicht kennt, riskiert ungeplante Downtime mitten im Tagesgeschäft.

12 Min. Lesezeit ALTER TABLE InnoDB-Metadaten Downtime-Risiko

1. Warum der ALGORITHM-Parameter bei ALTER TABLE entscheidend ist

Vor MySQL 5.6 kannte der Server bei praktisch jeder Schemaänderung nur einen Weg: die betroffene Tabelle komplett neu aufbauen. Eine neue Spalte, ein neuer Index, eine geänderte Spaltenreihenfolge, all das führte zu einer vollständigen Tabellenkopie mit exklusivem Lock für die gesamte Dauer der Operation. Bei einer catalog_product_entity mit mehreren Millionen Zeilen bedeutete das im Zweifel Stunden mit gesperrtem Schreibzugriff.

Mit dem Online-DDL-Framework, das seit MySQL 5.6 existiert und in 8.0 kontinuierlich erweitert wurde, unterscheidet der Server bei jeder unterstützten ALTER-TABLE-Operation zwischen drei Algorithmen: INSTANT, INPLACE und COPY. Welcher Algorithmus tatsächlich zum Einsatz kommt, hängt nicht vom Willen des Entwicklers ab, sondern strikt von der konkreten Operation. Wer den Unterschied nicht kennt, verlässt sich blind auf den vom Optimizer automatisch gewählten Standardalgorithmus und wird von langen Laufzeiten überrascht.

2. ALGORITHM=COPY: die teuerste und langsamste Variante

COPY ist historisch der einzige verfügbare Algorithmus und bleibt bis heute der Fallback für alle Operationen, die weder instant noch inplace unterstützt werden. Der Server legt eine komplett neue, leere Tabelle mit der Zielstruktur an, kopiert Zeile für Zeile aus der alten in die neue Tabelle, baut sämtliche Indizes neu auf und tauscht am Ende beide Tabellen atomar aus. Während der gesamten Kopierphase wird zwar lesender Zugriff meist noch toleriert, aber schreibender Zugriff blockiert.

Der Speicherplatzbedarf verdoppelt sich temporär, da alte und neue Tabelle parallel existieren, bevor die alte Version gelöscht wird. Bei einer 80 Gigabyte großen sales_order_grid bedeutet das kurzfristig 160 Gigabyte freien Plattenplatz, nur um eine einzige Spalte umzubenennen, falls MySQL aus irgendeinem Grund auf COPY zurückfällt. Operationen wie das Ändern der Zeichenkodierung einer ganzen Tabelle oder bestimmte Änderungen an Fremdschlüsseln zwingen den Server auch in MySQL 8.0 noch in diesen Modus.

3. ALGORITHM=INPLACE: kein Rebuild, aber auch nicht kostenlos

INPLACE vermeidet die vollständige Tabellenkopie auf SQL-Ebene, arbeitet aber intern trotzdem oft mit einem Rebuild der Datendatei, nur eben innerhalb der bestehenden Tabellenstruktur und ohne temporäre Zweittabelle im Datenverzeichnis. Während der Operation lässt InnoDB parallele DML-Anweisungen zu und protokolliert sie in einem sogenannten Row-Log, der nach Abschluss der eigentlichen Umbauarbeit auf die neue Struktur angewendet wird. Am Ende steht nur noch ein kurzer exklusiver Metadaten-Lock für den finalen Austausch.

Das klingt nach einer fast kostenlosen Operation, ist es aber nicht immer. Das Hinzufügen eines sekundären Index etwa läuft zwar inplace, erzeugt aber vollen I/O-Aufwand, weil der komplette Index von Grund auf sortiert und aufgebaut werden muss. Bei einer sehr schreiblastigen Tabelle kann der Row-Log zudem an seine konfigurierte Obergrenze innodb_online_alter_log_max_size stoßen, was die gesamte, unter Umständen stundenlange Operation mit einem Rollback beendet, ohne dass die Änderung übernommen wurde.

4. ALGORITHM=INSTANT: wenn wirklich nur Metadaten geändert werden

INSTANT ist der jüngste und schnellste der drei Algorithmen. Statt Daten überhaupt anzufassen, ändert der Server ausschließlich einen Eintrag im Data Dictionary und merkt sich intern, welche physischen Zeilen noch im alten Format vorliegen. Erst beim nächsten regulären Zugriff auf eine solche Zeile interpretiert InnoDB sie transparent mit einer sogenannten Instant-Metadaten-Version, ohne die Datei selbst umschreiben zu müssen. Die Laufzeit einer instant-fähigen Operation ist damit unabhängig von der Tabellengröße und liegt praktisch immer im Millisekundenbereich.

Seit MySQL 8.0.12 funktioniert das für das Hinzufügen einer Spalte ans Tabellenende, seit 8.0.29 auch für das Hinzufügen und Entfernen von Spalten an beliebiger Position sowie für das Sichtbar- und Unsichtbarmachen von Spalten. Bei einer mehrere hundert Millionen Zeilen großen url_rewrite-Tabelle ist der Unterschied zwischen einer INSTANT-Operation, die in unter einer Sekunde durchläuft, und einer COPY-Operation, die den Shop stundenlang lahmlegt, geschäftskritisch.


-- Explizit anfordern, dass eine Operation nur INSTANT laufen darf
-- Schlaegt kontrolliert fehl, statt unbemerkt auf COPY zurueckzufallen
ALTER TABLE catalog_product_entity
  ADD COLUMN internal_note VARCHAR(255) NULL,
  ALGORITHM=INSTANT;

-- Pruefen, ob der Server INSTANT tatsaechlich verwendet hat
SELECT NAME, TABLE_ID
FROM information_schema.INNODB_TABLES
WHERE NAME = 'mironsoft/catalog_product_entity';

5. Welche Operationen welchen Algorithmus tatsächlich nutzen

Die konkrete Zuordnung ist in der MySQL-Dokumentation vollständig aufgelistet, in der Praxis lohnt sich aber ein Blick auf die häufigsten Fälle im Magento-Alltag. Spalten ans Ende anfügen, Spaltendefaults ändern, Spalten umbenennen und Indizes umbenennen laufen praktisch immer instant. Einen sekundären Index hinzufügen oder entfernen läuft inplace, ebenso das Ändern bestimmter Zeilenformat-Optionen. Eine Spalte in einen inkompatiblen Datentyp umzuwandeln, etwa von INT auf VARCHAR, oder die gesamte Tabelle auf ein anderes Zeichenkodierungsschema umzustellen, erzwingt weiterhin COPY.

Wichtig ist außerdem: den Primärschlüssel einer Tabelle zu ändern läuft grundsätzlich als Rebuild, weil sich damit die physische Sortierreihenfolge sämtlicher Zeilen in der clusterten InnoDB-Struktur ändert. Selbst wenn MySQL das technisch als INPLACE klassifiziert, ist der I/O-Aufwand vergleichbar mit einer vollständigen Kopie. Wer unsicher ist, sollte die konkrete Operation nicht raten, sondern gegen eine Kopie der Produktionstabelle mit realistischer Zeilenzahl testen, bevor sie im Wartungsfenster live läuft.

6. Algorithmus explizit erzwingen und Laufzeit messen

Statt sich auf die automatische Auswahl von MySQL zu verlassen, sollte jede produktive ALTER-TABLE-Anweisung den erwarteten Algorithmus explizit über die Klausel ALGORITHM= anfordern. Passt die tatsächliche Operation nicht zum angeforderten Algorithmus, bricht der Server sofort mit einer Fehlermeldung ab, statt stillschweigend auf die nächstlangsamere Variante auszuweichen. Das verhindert die häufige Überraschung, bei der ein vermeintlich harmloses ALTER TABLE im Wartungsfenster plötzlich eine volle Tabellenkopie auslöst.

Zusätzlich lohnt sich die Klausel LOCK=NONE, die verlangt, dass parallele Lese- und Schreibzugriffe während der gesamten Operation weiterhin möglich bleiben. Auch hier gilt: unterstützt die konkrete Operation das nicht, bricht der Befehl kontrolliert ab, statt den Shop während eines Deploys unbemerkt für Bestellungen zu sperren.


-- Sicherstellen, dass Schreibzugriffe während des Alters weiterlaufen
ALTER TABLE sales_order_grid
  ADD INDEX idx_customer_email (customer_email),
  ALGORITHM=INPLACE, LOCK=NONE;

-- Laufzeit und Fortschritt einer laufenden Online-DDL-Operation beobachten
SELECT * FROM performance_schema.events_stages_current
WHERE EVENT_NAME LIKE '%alter table%';

7. Row-Format-Voraussetzungen und Grenzen von INSTANT

INSTANT-Operationen setzen voraus, dass die Tabelle im Zeilenformat DYNAMIC oder COMPRESSED vorliegt. Tabellen im veralteten Format COMPACT oder REDUNDANT, wie sie gelegentlich noch aus sehr alten Magento-1-Migrationen übrig sind, unterstützen instant hinzugefügte Spalten nicht und fallen automatisch auf COPY zurück. Ein einmaliger ALTER TABLE ... ROW_FORMAT=DYNAMIC, selbst als teure Einmal-Operation, zahlt sich hier langfristig aus.

Zusätzlich begrenzt InnoDB die Anzahl instant hinzugefügter Spalten pro Tabelle auf 64 zusätzliche Versionen, bevor ein interner Rebuild erzwungen wird. In der Praxis erreicht das kaum ein Magento-Projekt, wichtig ist die Grenze trotzdem bei sehr aktiv gepflegten, EAV-nahen Custom-Tabellen mit vielen kleinen, über Jahre angesammelten Schemaänderungen. Ein weiterer Punkt: Datenbank-Dumps und Downgrades auf ältere Server-Versionen können mit instant erzeugten Zeilenformaten Probleme bekommen, ein sauberer mysqldump mit vollständigem Rebuild der Zieltabelle umgeht das zuverlässig.

8. Auswirkung auf große Magento-Tabellen in der Praxis

Gerade Tabellen wie catalog_product_entity, catalog_product_index_price, sales_order oder url_rewrite wachsen in etablierten Shops schnell auf zweistellige Gigabyte-Größen. Magentos deklaratives Schema in db_schema.xml überlässt die konkrete Wahl des Algorithmus dem Server, ein Modul-Update während setup:upgrade kann also unbemerkt eine COPY-Operation auf einer riesigen Tabelle auslösen und den Deploy-Prozess um Stunden verlängern, ohne dass das im Vorfeld sichtbar wird.

Vor jedem produktiven Modul-Update, das Schemaänderungen an großen Tabellen mitbringt, lohnt sich deshalb ein Testlauf gegen eine aktuelle Kopie der Produktionsdatenbank mit realistischer Zeilenzahl, inklusive Messung der tatsächlichen Laufzeit. Ist absehbar, dass eine Operation zwingend COPY erfordert, etwa eine Typänderung an einer stark frequentierten Spalte, sind externe Werkzeuge wie pt-online-schema-change oder gh-ost oft die bessere Wahl als das native, aber blockierende ALTER TABLE.

9. Fehlgeschlagene Online-DDL-Operationen erkennen und beheben

Auch eine grundsätzlich instant- oder inplace-fähige Operation kann hängen bleiben, meist weil sie zu Beginn einen Metadata Lock benötigt, den eine lange laufende Transaktion blockiert. SHOW PROCESSLIST zeigt in diesem Fall den ALTER-Befehl im Zustand Waiting for table metadata lock. Genauere Einsicht liefert die Tabelle performance_schema.metadata_locks, die alle aktuell gehaltenen und angeforderten Locks samt der jeweiligen Session-ID auflistet.

Findet sich dort eine seit Stunden offene, unbeendete Transaktion aus einem alten Admin-Tab oder einem hängenden Cron-Prozess, hilft in der Regel nur, diese Session gezielt mit KILL zu beenden, bevor die ALTER-Operation fortfahren kann. Bei einer bereits laufenden INPLACE-Operation, die am Row-Log-Limit scheitert, hilft nur ein sauberer Rollback und ein zweiter Versuch mit temporär erhöhtem innodb_online_alter_log_max_size oder in einem Wartungsfenster mit weniger paralleler Schreiblast.

Kriterium ALGORITHM=INSTANT ALGORITHM=INPLACE ALGORITHM=COPY
Tabellenkopie Nein, reine Metadaten-Änderung Kein SQL-Level-Duplikat, interner Rebuild möglich Vollständige Tabellenkopie
Blockiert Schreibzugriffe Nein, praktisch nie Nur kurz am Anfang und Ende Für die gesamte Laufzeit
Laufzeit bei großen Tabellen Millisekunden, unabhängig von der Zeilenzahl Abhängig von Zeilenzahl und I/O Abhängig von Zeilenzahl, oft am längsten
Typische Operationen Spalte hinzufügen/entfernen, Umbenennen, Default ändern Index hinzufügen/entfernen, Row-Format ändern Datentyp-Konvertierung, Zeichenkodierung ändern
Zusätzlicher Speicherplatz Praktisch keiner Temporärer Row-Log Bis zu 100 Prozent der Tabellengröße
Verfügbar seit MySQL 8.0.12, erweitert in 8.0.29 MySQL 5.6 Seit jeher als Fallback

Mironsoft

Datenbank-Performance, Index-Tuning und Magento-DB-Optimierung

Magento-Shop, der an langsamen Datenbankabfragen leidet?

Wir analysieren MySQL-Datenbanken auf Performance-Bremsen, optimieren Indizes und Abfragen gezielt und richten Backup- und Replikationsstrategien ein, die im Ernstfall wirklich funktionieren.

Performance-Audit

Slow Query Log und Explain-Pläne systematisch auf Engpässe untersuchen.

Index-Optimierung

Indizes gezielt für die tatsächliche Abfragelast des Shops aufbauen.

Backup-Strategie

Zuverlässige Backup- und Restore-Prozesse für produktive Magento-Datenbanken einrichten.

10. Zusammenfassung

Online DDL: INSTANT vs. INPLACE vs. COPY

INSTANT

Reine Metadaten-Operation, Laufzeit unabhängig von der Tabellengröße, ideal für Spalten hinzufügen oder Defaults ändern.

INPLACE

Kein SQL-Level-Duplikat, aber oft voller I/O-Aufwand, etwa beim Aufbau eines neuen sekundären Index.

COPY

Vollständige Tabellenkopie mit exklusivem Lock, unvermeidbar bei Datentyp-Konvertierungen und Zeichenkodierungswechseln.

Magento-Praxis

Vor Modul-Updates mit Schemaänderungen an großen Tabellen den tatsächlichen Algorithmus und die Laufzeit testen, nicht raten.

11. FAQ: Online DDL: INSTANT vs. INPLACE vs. COPY

1Kann ALGORITHM=INSTANT bei jeder ALTER-TABLE-Operation verwendet werden?
Nein. Instant funktioniert nur für eine begrenzte Menge an Operationen wie das Hinzufügen, Entfernen oder Umbenennen von Spalten sowie Änderungen am Default-Wert. Sobald sich die physische Zeilenstruktur ändern muss, etwa bei einer Datentyp-Konvertierung, fällt der Server zwingend auf INPLACE oder COPY zurück.
2Warum schlägt ein ALTER TABLE mit explizitem ALGORITHM=INSTANT manchmal mit einer Fehlermeldung fehl?
Das ist gewollt und sicherer als ein stiller Fallback. Wenn die angeforderte Operation instant technisch nicht möglich ist, bricht MySQL sofort ab, statt unbemerkt auf eine viel langsamere COPY-Operation umzuschalten, die den Betrieb während des Deploys blockieren könnte.
3Beeinflusst der gewählte Algorithmus die Replikation auf Replicas?
Ja indirekt. Bei zeilenbasierter Replikation wird die tatsächliche Datenänderung repliziert, bei anweisungsbasierter Replikation führt der Replica dieselbe ALTER-Operation selbst aus und kann dabei durchaus eine andere Laufzeit haben als der Primärserver, etwa bei unterschiedlicher Hardware oder Parallel-Last.
4Was passiert mit alten, instant hinzugefügten Spalten bei einem späteren mysqldump?
Ein logischer Dump mit anschließendem Import baut die Tabelle immer komplett neu auf und normalisiert dabei automatisch alle instant erzeugten internen Metadaten-Versionen. Nach einem Restore aus einem mysqldump gibt es also keine instant-spezifischen Altlasten mehr.
5Kann man den von MySQL gewählten Algorithmus im Nachhinein herausfinden?
Direkt protokolliert MySQL das nicht zentral, aber über performance_schema.events_stages_current während der Ausführung oder über einen bewussten Testlauf mit explizitem ALGORITHM-Parameter lässt sich zuverlässig ermitteln, welcher Algorithmus für eine konkrete Operation zulässig ist.
6Ist LOCK=NONE bei jeder inplace-fähigen Operation garantiert möglich?
Nein. Manche inplace-fähigen Operationen benötigen trotzdem einen kurzzeitigen Shared- oder Exclusive-Lock, etwa wenn ein Primärschlüssel involviert ist. LOCK=NONE erzwingt lediglich, dass der Befehl abbricht, falls ein stärkerer Lock nötig würde, statt ihn stillschweigend zu setzen.
7Verbraucht eine INPLACE-Operation trotzdem zusätzlichen Speicherplatz?
Ja, temporär für den Row-Log, in dem parallele DML-Änderungen während der Operation zwischengespeichert werden, sowie für neu aufgebaute Indexdateien. Der Bedarf liegt aber deutlich unter dem einer vollständigen Tabellenkopie bei COPY.
8Sollte man ALTER-TABLE-Operationen mit COPY-Fallback grundsätzlich vermeiden?
Wenn möglich ja, insbesondere bei großen, produktiven Tabellen im laufenden Betrieb. Für Operationen, die zwingend eine Tabellenkopie erfordern, sind trigger- oder binlog-basierte externe Werkzeuge wie pt-online-schema-change oder gh-ost oft die risikoärmere Alternative zum nativen, blockierenden ALTER TABLE.
9Gilt die INSTANT-Unterstützung auch für Fremdschlüsselspalten?
Das Hinzufügen einer neuen, nicht referenzierten Spalte funktioniert instant. Sobald jedoch ein neuer Fremdschlüssel selbst hinzugefügt oder ein bestehender geändert werden soll, verlangt MySQL zusätzliche Validierung der referenziellen Integrität, was in der Regel eine INPLACE- oder sogar COPY-Operation erzwingt.
10Wie verhält sich ein Deploy, wenn ein ALTER TABLE mitten in setup:upgrade unerwartet lange läuft?
Magentos Setup-Skript wartet standardmäßig auf den Abschluss der Anweisung, es gibt kein eingebautes Timeout, das die Operation abbricht. Genau deshalb sollte die tatsächliche Laufzeit kritischer Schemaänderungen vorab in einer Staging-Umgebung mit realistischer Datenmenge gemessen werden, statt sie im produktiven Deploy-Fenster zu entdecken.