MySQL 5.7 auf 8.0 upgraden: Praxisleitfaden für Magento-Shops
AI generated
InnoDB
SQL
MySQL / Versions-Upgrade
MySQL 5.7 auf 8.0 upgraden
Ein Praxisleitfaden für produktive Magento-Shops

Ein MySQL-Major-Version-Upgrade ist kein einfacher Paket-Update-Befehl, sondern eine Einbahnstraße mit mehreren stillen Verhaltensänderungen, die erst nach dem Upgrade sichtbar werden. Zwischen MySQL 5.7 und 8.0 liegen Änderungen am Optimizer, an der Standard-Zeichenkodierung, an der Authentifizierung und am gesamten Query-Cache-Subsystem, die einen produktiven Magento-Shop empfindlich treffen können, wenn sie vor dem Upgrade nicht bekannt sind.

14 Min. Lesezeit Breaking Changes mysql_upgrade Rollback-Strategie

1. Warum das Upgrade keine reine Formsache ist

Oracle stellt für den Wechsel von MySQL 5.7 auf 8.0 offiziell keinen unterstützten Downgrade-Pfad zur Verfügung. Sobald der Server einmal mit den neuen Data-Dictionary-Strukturen von 8.0 gestartet wurde, lässt sich die Instanz nicht mehr einfach mit einer alten 5.7-Binärversion zurückstarten. Jede Upgrade-Planung muss diese Tatsache von Anfang an berücksichtigen, statt sie erst im Problemfall zu entdecken.

Hinzu kommt, dass MySQL 8.0 in mehreren zentralen Bereichen bewusst andere Standardwerte gewählt hat als 5.7, nicht aus Versehen, sondern als bewusste Design-Entscheidung. Wer ein Upgrade als reinen Versionswechsel ohne inhaltliche Prüfung behandelt, riskiert stillschweigend veränderte Ausführungspläne, fehlschlagende Zeichensatz-Vergleiche oder sogar einen Server, der wegen einer inzwischen ungültigen Konfigurationsoption gar nicht mehr startet.

2. Optimizer-Verhalten: stillschweigend andere Ausführungspläne

MySQL 8.0 bringt ein überarbeitetes Kostenmodell für den Optimizer mit, ergänzt um Histogramm-Statistiken, die gezielt für Spalten ohne Index erzeugt werden können und die Datenverteilung deutlich genauer abbilden als die bisherigen, rein indexbasierten Statistiken. In der Praxis bedeutet das: dieselbe Abfrage, dieselben Indizes, aber ein anderer Ausführungsplan, weil der Optimizer nun andere Kosten für Alternativen berechnet.

Zusätzlich unterstützt MySQL 8.0 Hash-Joins für Fälle, in denen 5.7 noch auf verschachtelte Loop-Joins ohne passenden Index zurückfiel, was bestimmte komplexe Reporting-Abfragen deutlich beschleunigen, andere hingegen unerwartet verlangsamen kann. Vor jedem produktiven Upgrade lohnt sich deshalb ein Vergleich der EXPLAIN-Pläne für die geschäftskritischsten, langsamsten Abfragen zwischen alter und neuer Version, nicht nur ein pauschaler Blick auf die Gesamtlast.

3. Die Standard-Collation-Falle: utf8mb4_general_ci vs. utf8mb4_0900_ai_ci

MySQL 8.0 ändert die Standard-Kollation für utf8mb4 von utf8mb4_general_ci auf utf8mb4_0900_ai_ci, eine deutlich präzisere, Unicode-9.0-basierte Sortierreihenfolge. Magentos eigenes Schema setzt die Kollation für seine Tabellen explizit in db_schema.xml, sodass bestehende Kerntabellen davon direkt nicht betroffen sind, das Risiko liegt jedoch bei neu angelegten Tabellen aus Drittmodulen, temporären Tabellen und beim Vergleich von Zeichenketten unterschiedlicher Herkunft.

Treffen zwei Zeichenketten mit unterschiedlicher Kollation in einem JOIN oder WHERE aufeinander, etwa eine 5.7-Alttabelle mit der alten Standard-Kollation und eine neu angelegte 8.0-Tabelle mit der neuen, quittiert MySQL das mit dem Fehler Illegal mix of collations. Vor dem Upgrade lohnt sich deshalb ein systematischer Check aller Tabellen und Spalten auf ihre tatsächlich gesetzte Kollation, um Inkonsistenzen frühzeitig zu finden statt erst bei einem fehlschlagenden Checkout.


-- Alle Tabellen mit von der Standard-Kollation abweichender Einstellung finden
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'magento'
  AND TABLE_COLLATION NOT LIKE 'utf8mb4_general_ci';

4. Entfernte Query-Cache-Konfiguration

Der Query Cache war bereits in MySQL 5.7.20 als veraltet markiert, in MySQL 8.0 ist er vollständig entfernt, inklusive sämtlicher zugehöriger Konfigurationsoptionen wie query_cache_size und query_cache_type. Enthält eine bestehende my.cnf, die noch aus 5.6- oder frühen 5.7-Zeiten stammt, eine dieser Optionen, startet der MySQL-8.0-Server danach überhaupt nicht mehr, sondern bricht sofort mit einer klaren Fehlermeldung im Error-Log ab.

Für Magento-Shops ist das in der Praxis meist unkritisch, weil Full Page Cache und Objekt-Cache ohnehin über Redis oder Varnish laufen und der Query Cache selbst bei aktiviertem MySQL-5.7-Betrieb kaum genutzt wurde. Wichtig ist trotzdem, vor dem Upgrade die produktive my.cnf systematisch gegen die Liste entfernter Variablen in der offiziellen Upgrade-Dokumentation zu prüfen, statt erst beim gescheiterten Neustart davon zu erfahren.

5. Authentifizierung: caching_sha2_password als neuer Standard

MySQL 8.0 setzt als Standard-Authentifizierungs-Plugin caching_sha2_password statt des bisherigen mysql_native_password. Neu angelegte Benutzer ohne explizite Angabe verwenden damit automatisch das neue Verfahren, was bei älteren PHP-Treibern oder Verbindungsbibliotheken, die caching_sha2_password nicht unterstützen, zu Verbindungsfehlern direkt nach dem Upgrade führen kann, insbesondere bei unverschlüsselten Verbindungen ohne SSL.

Moderne PHP-Versionen mit aktuellem mysqlnd-Treiber, wie sie in einem Magento-2.4.8-Stack mit PHP 8.4 laufen, unterstützen caching_sha2_password vollständig, sodass in den meisten Fällen kein Handlungsbedarf besteht. Bestehende, bereits vor dem Upgrade angelegte Benutzerkonten behalten ihr ursprüngliches Authentifizierungsverfahren bei, ein Upgrade ändert es nicht automatisch, sicherheitshalber lohnt sich trotzdem ein expliziter Test aller produktiven Verbindungsstrings direkt nach dem Upgrade.


-- Aktuelles Authentifizierungs-Plugin eines Benutzers pruefen
SELECT user, host, plugin FROM mysql.user WHERE user = 'magento_app';

-- Bei Bedarf explizit auf mysql_native_password zuruecksetzen
ALTER USER 'magento_app'@'%' IDENTIFIED WITH mysql_native_password BY 'ein-sicheres-passwort';

6. Reservierte Schlüsselwörter und weitere Datentyp-Feinheiten

Mit jeder MySQL-Version kommen neue reservierte Schlüsselwörter hinzu, die zuvor problemlos als Tabellen- oder Spaltenname verwendet werden konnten. In MySQL 8.0 zählen dazu unter anderem RANK, ROW, GROUPS, WINDOW und mehrere weitere, die im Zusammenhang mit den neu eingeführten Fenster-Funktionen stehen. Eine bestehende Custom-Tabelle mit einer Spalte namens rank ohne Backtick-Quoting funktioniert unter 5.7 problemlos und erzeugt unter 8.0 einen Syntaxfehler.

Vor dem Upgrade lohnt sich deshalb ein Abgleich sämtlicher Tabellen- und Spaltennamen im eigenen Schema, insbesondere in Custom-Modulen und Drittanbieter-Extensions, gegen die aktuelle Liste reservierter Wörter in der MySQL-8.0-Dokumentation. Bereits bestehende Objekte mit einem jetzt reservierten Namen funktionieren zwar meist weiterhin, sofern konsequent mit Backticks referenziert wird, neue DDL-Anweisungen ohne Quoting schlagen jedoch fehl.

7. Der mysql_upgrade-Workflow in der Praxis

Seit MySQL 8.0.16 ist der separate Befehl mysql_upgrade überflüssig geworden, der Server prüft und aktualisiert die internen Systemtabellen sowie das Data Dictionary beim ersten Start nach einem Binär-Upgrade automatisch selbst. Das eigentliche Vorgehen läuft deshalb über einen klassischen In-Place-Upgrade-Pfad: Server stoppen, neue Binärpakete installieren, Server mit denselben Datenverzeichnissen neu starten und den Fortschritt im Error-Log verfolgen.

Vor dem eigentlichen Upgrade prüft das in MySQL Shell integrierte Werkzeug util.checkForServerUpgrade() proaktiv auf bekannte Inkompatibilitäten wie reservierte Wörter, entfernte Systemvariablen oder problematische Kollationen, ohne selbst irgendetwas zu verändern. Dieser Pre-Check-Schritt sollte immer vor dem eigentlichen Upgrade-Wartungsfenster laufen, damit gefundene Probleme in Ruhe behoben werden können, statt mitten im Wartungsfenster überrascht zu werden.


# Pre-Check vor dem eigentlichen Upgrade über MySQL Shell
mysqlsh -- util check-for-server-upgrade --user=root --password

# Nach Installation der neuen Binaerpakete: Server neu starten
# und den automatischen Upgrade-Vorgang im Error-Log beobachten
bin/log mysql/error.log

8. Teststrategie vor dem produktiven Upgrade

Ein produktives Upgrade sollte niemals der erste Test sein. Der sicherste Weg ist eine vollständige Kopie der Produktionsdatenbank auf einer separaten Staging-Instanz, die dort mit der neuen Version 8.0 hochgezogen wird, gefolgt von einem vollständigen Magento-Reindex sowie dem produktiven Testsuite-Lauf, inklusive der geschäftskritischsten Checkout- und Bestellprozesse.

Ergänzend lohnt sich ein direkter Vorher-Nachher-Vergleich des Slow Query Logs unter vergleichbarer, simulierter Last, um Abfragen zu identifizieren, die durch die veränderten Optimizer-Entscheidungen langsamer geworden sind. Erst wenn diese Tests über mehrere Tage stabil und ohne neue kritische Fehler durchlaufen, ist das produktive Wartungsfenster der richtige nächste Schritt.

9. Rollback-Strategie, falls das Upgrade Probleme verursacht

Da ein offizieller Downgrade-Pfad von 8.0 zurück auf 5.7 nicht existiert, muss die Rollback-Strategie vor dem Upgrade feststehen, nicht danach improvisiert werden. Die zuverlässigste Absicherung ist ein vollständiges, konsistentes Backup unmittelbar vor dem Upgrade, idealerweise per Snapshot auf Dateisystem- oder Storage-Ebene, das im Fehlerfall die alte 5.7-Instanz binnen Minuten wiederherstellen kann, statt einen langwierigen logischen Restore aus einem mysqldump zu benötigen.

Für Umgebungen mit ausreichend Kapazität ist ein Blue-Green-Ansatz die robustere Alternative: ein bislang nicht aktualisierter 5.7-Replica bleibt während des Upgrade-Fensters unangetastet im Hintergrund verfügbar und kann im Ernstfall innerhalb weniger Minuten zum neuen Primärserver befördert werden, während die problematische 8.0-Instanz in Ruhe analysiert wird. Ein klar definiertes, zeitlich begrenztes Wartungsfenster mit einem festen Abbruchkriterium gehört in jedem Fall zur Planung dazu.

Bereich MySQL 5.7 MySQL 8.0 Praktische Konsequenz
Standard-Kollation für utf8mb4 utf8mb4_general_ci utf8mb4_0900_ai_ci Risiko von Illegal mix of collations bei gemischten Tabellen
Query Cache Veraltet, aber vorhanden Vollständig entfernt my.cnf vorab von query_cache_* Optionen bereinigen
Standard-Authentifizierung mysql_native_password caching_sha2_password Treiber-Kompatibilität vor dem Upgrade prüfen
mysql_upgrade Manueller Befehl nötig Automatisch beim Serverstart Kein separater Schritt mehr im Deploy-Skript nötig
Downgrade-Pfad N/A Offiziell nicht unterstützt Rollback-Strategie vor dem Upgrade festlegen
Optimizer-Statistiken Rein indexbasiert Zusätzlich Histogramm-Statistiken Ausführungspläne vor Produktiveinsatz vergleichen

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

MySQL 5.7 auf 8.0: Upgrade-Leitfaden

Keine Rückkehr

Ein offizieller Downgrade-Pfad von 8.0 zurück auf 5.7 existiert nicht, die Rollback-Strategie muss vorab feststehen.

Collation-Risiko

Der neue Standard utf8mb4_0900_ai_ci betrifft vor allem neue Tabellen und Vergleiche über Tabellengrenzen hinweg.

Query Cache raus

my.cnf vorab von query_cache_* Optionen bereinigen, sonst startet der Server nach dem Upgrade nicht.

Vorher testen

Staging-Kopie mit realer Datenmenge, vollständiger Reindex und EXPLAIN-Vergleich vor jedem produktiven Wartungsfenster.

11. FAQ: MySQL 5.7 auf 8.0: Upgrade-Leitfaden

1Kann man direkt von MySQL 5.6 auf 8.0 upgraden?
Oracle unterstützt offiziell nur Upgrades von der jeweils letzten Vorgängerversion, ein Sprung von 5.6 direkt auf 8.0 ist nicht dokumentiert unterstützt. Der empfohlene Weg führt über einen Zwischenschritt auf 5.7, bevor von dort aus auf 8.0 upgegradet wird.
2Muss man mysql_upgrade nach 8.0.16 überhaupt noch manuell aufrufen?
Nein, seit 8.0.16 führt der Server den entsprechenden Check und die notwendigen Aktualisierungen automatisch beim ersten Start nach dem Binär-Upgrade durch. Der separate Aufruf schadet zwar nicht, ist aber redundant geworden.
3Wie lange dauert der automatische Upgrade-Vorgang bei einer sehr großen Magento-Datenbank?
Der eigentliche Datendictionary-Upgrade läuft meist in Sekunden bis wenigen Minuten ab, unabhängig von der Tabellengröße, da er primär die Systemtabellen betrifft. Die Gesamtdauer des Wartungsfensters hängt eher von Backup-Erstellung und Testphase davor ab.
4Muss man vor dem Upgrade Statistiken oder Indizes manuell neu aufbauen?
Nicht zwingend, ein ANALYZE TABLE auf den wichtigsten, großen Tabellen nach dem Upgrade hilft aber, dass der Optimizer möglichst schnell mit aktuellen Statistiken arbeitet, statt sich zunächst auf veraltete 5.7-Werte zu stützen.
5Betrifft die neue Standard-Kollation auch bestehende Magento-Kerntabellen?
Nicht automatisch. Ein Upgrade ändert die Kollation bestehender Tabellen nicht von selbst, das Risiko besteht vor allem bei neu erzeugten Tabellen, temporären Tabellen und Vergleichen zwischen unterschiedlich kollationierten Spalten.
6Was passiert mit bereits bestehenden Nutzerkonten beim Upgrade?
Deren Authentifizierungsverfahren bleibt unverändert erhalten, ein Upgrade migriert bestehende Konten nicht automatisch auf caching_sha2_password. Nur neu angelegte Konten ohne explizite Angabe erhalten das neue Standard-Verfahren.
7Ist ein Rolling Upgrade über mehrere Replicas hinweg möglich?
Ja, ein üblicher Ansatz upgraded zunächst einzelne Replicas, testet dort ausführlich und upgraded den Primärserver erst zuletzt, was ein deutlich risikoärmeres Vorgehen erlaubt als ein direktes Upgrade des produktiven Primärservers.
8Wie erkennt man reservierte Wortkonflikte am zuverlässigsten im Voraus?
Am zuverlässigsten über den integrierten Pre-Check von MySQL Shell mit util.checkForServerUpgrade, ergänzt durch eine manuelle Prüfung aller Custom-Modul-Schemas gegen die aktuelle Liste reservierter Wörter in der offiziellen Dokumentation.
9Verändert das Upgrade automatisch das InnoDB-Zeilenformat bestehender Tabellen?
Nein, bestehende Tabellen behalten ihr Zeilenformat, bis eine tatsächliche ALTER-TABLE-Operation darauf ausgeführt wird. Für neue INSTANT-Funktionen ist trotzdem ein einmaliger, bewusster Umbau auf DYNAMIC oft sinnvoll.
10Wie lange sollte man die alte 5.7-Instanz nach einem erfolgreichen Upgrade noch vorhalten?
Eine gängige Praxis ist, den nicht aktualisierten Replica oder das Vollbackup mindestens für einen vollständigen Geschäftszyklus inklusive Monatsabschluss aufzubewahren, bevor die alte Instanz endgültig stillgelegt wird.