Migration von MySQL 5.7 zu MySQL 8.0 in Docker

Der Wechsel von MySQL 5.7 auf die neuere Version 8.0 kann auf den ersten Blick einschüchternd wirken. Besonders wenn du in einer Docker-Umgebung arbeitest, gibt es einige Punkte zu beachten, um sicherzustellen, dass die Migration reibungslos abläuft. Doch keine Sorge, mit einer guten Anleitung und einem strukturierten Vorgehen ist der Wechsel gar nicht so kompliziert, wie es scheint.
Ich selbst habe diesen Umzug auch erst hinter mir, da ich meine WordPress Installation blöderweise mit einem MySQL Server (in Docker) in der Verision 5.7 hochgezogen habe, bevor ich gemerkt habe, dass diese Version schon ziemlich alt ist und nicht mehr verwendet werden sollte. In diesem Beitrag zeige ich dir Schritt für Schritt, wie du eine MySQL-Migration in Docker durchführst.

Warum auf MySQL 8.0 upgraden?

Die Entscheidung, von MySQL 5.7 auf MySQL 8.0 zu wechseln, bringt einige Vorteile mit sich. Zum einen erhältst du Zugriff auf die neuesten Sicherheits- und Performance-Updates, die deine Datenbank nicht nur sicherer, sondern auch schneller machen. MySQL 8.0 hat viele Verbesserungen, die für moderne Anwendungen sehr nützlich sind, wie zum Beispiel erweiterte JSON-Funktionen und leistungsstarke neue Indizierungs-Features.

Ein weiterer Vorteil sind die verbesserten Werkzeuge für Datenintegrität und Wartung. MySQL 8.0 ist robuster und besser aufgestellt für die wachsenden Anforderungen von Webanwendungen. Mit einem Upgrade stellst du sicher, dass du die bestmögliche Performance aus deiner Datenbank herausholst und bereit bist für zukünftige Anforderungen.

Backup der Datenbank erstellen

Zuerst das wichtigste: Damit du es einfacher hast, definiere ich an dieser Stelle ein paar Variablen für dich, damit du weisst, was ich hier in den Befehlen an solche verwende:

wordpress-db_alt = das ist der alte Docker Container
root = das ist jeweils der Datenbank Benutzer, welcher erhöhte Rechte hat
rootpassword = Das ist das Root Kennwort des alten MySQL Docker Containers und später auch das des neuen MySQL Docker Containers
wordpressdb = das ist die Datenbank, die ich aus dem alten Docker Container exportiere

Wir starten mit einem Backup der alten Datenbank. Das Backup ist essenziell für die Migration. Verwende dafür am besten den folgenden Befehl, um eine Sicherung deiner bestehenden MySQL 5.7-Datenbank zu erstellen:

docker exec -it wordpress-db_alt mysqldump --no-tablespaces --ignore-table=mysql.innodb_index_stats --ignore-table=mysql.innodb_table_stats -u root -prootpassword wordpressdb > wordpressdb.sql

Dieser Befehl sichert die gesamte Datenbank „wordpressdb“ und speichert das Backup als „new_backup.sql“. Denk dran, dass das die Variable -p direkt gefolgt von einem Passwort sein muss. Kein Leerzeichen oder sonst was. In meinem Fall verwende ich das Passwort rootpassword. Also muss die Variable so aussehen: -prootpassword. Achte ausserdem darauf, dass deine Passwörter und Benutzernamen korrekt sind, und verwende auf keinen Fall die gleichen Passwörter wie hier gezeigt in der produktiven Umgebung. ^^

MySQL 8.0-Container erstellen und konfigurieren

Nun erstellen wir einen neuen MySQL 8.0-Container. Diesen Container kannst du in derselben Docker-Compose-Datei wie deinen alten Container definieren, allerdings solltest du darauf achten, dass der neue Container eine andere IP-Adresse, einen anderen Hostnamen sowie ein separates Datenverzeichnis verwendet.

Hier ein Beispiel, wie die Docker-Compose-Datei für den neuen MySQL 8.0-Container aussehen könnte:

services:

  wordpress-db_neu:
    image: mysql:8
    container_name: wordpress-db_neu
    hostname: wordpress-db_neu
    restart: always
    networks:
      dockernet:
        ipv4_address: 172.37.0.187
    environment:
      MYSQL_DATABASE: wordpressdb
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: "wordpresspassword"
      MYSQL_ROOT_PASSWORD: "rootpassword"
    volumes:
      - ./temp/db_data:/var/lib/mysql

networks:
  dockernet:
    external: true

Dieser Container stellt sicher, dass MySQL 8.0 bereit ist, um die Daten aufzunehmen. Starte nun diesen neuen Container. Jetzt bist du bereit für den Import der Datenbank in den neuen MySQL Docker.

Das Backup bereinigen

Bevor du das Backup in den neuen Container importierst, solltest du es bereinigen. Manchmal können bestimmte Befehle und Anweisungen im Backup sein, die du in der neuen Umgebung nicht brauchst oder die sogar zu Fehlern führen könnten. Dies war zumindest bei mir der Fall.
Prüfen kannst du dies, in dem du die Datenbank datei mit nano wordpressdb.sql öffnest. Ich in meinem Fall hatte auf der ersten Zeile einen Hinweis darüber stehen, dass es unsicher ist ein MySQL root Kennwort auf der Bash zu verwenden.

mysqldump: [Warning] Using a password on the command line interface can be insecure.

Prüfe es am besten einmal, bevor du den Befehl ausführst.

Verwende den folgenden Befehl, um das Backup zu säubern:

tail -n +2 wordpressdb.sql > clean_wordpressdb.sql

Dieser Befehl entfernt die erste Zeile aus dem Backup, die oft eine Warnung oder unnötige Information enthält. Die gesäuberte Datei wird als clean_wordpressdb.sql gespeichert.

Import der Datenbank in MySQL 8.0

Nun ist es an der Zeit, das bereinigte Backup in deinen neuen MySQL 8.0-Container zu importieren. Das geht ganz einfach mit folgendem Befehl:

clean_wordpressdb.sql | docker exec -i wordpress-db_neu mysql -u root -paltespassword wordpressdb

Der Befehl importiert die bereinigte Backup-Datei in die neu erstellte MySQL-Instanz. Wichtig hierbei ist, dass die Verbindung korrekt hergestellt wird, und die Zugriffsdaten stimmen. Sobald das Backup erfolgreich eingespielt ist, kannst du testen, ob alle Daten im neuen MySQL-Container vorhanden sind.

Umstellung und Endtests

Nachdem die neue Datenbank erfolgreich importiert wurde, kannst du die alte Datenbank-Instanz deaktivieren. Führe dafür einfach ein docker-compose down aus, um alle Docker Container, die sich in der Docker-Compose.yaml befinden, zu stoppen. Im nächsten Schritt müssen die Konfigurationen angepasst werden, damit WordPress oder jede andere Anwendung auf den neuen MySQL 8.0-Container zugreifen kann.

Achte darauf, dass du die Docker-Compose-Datei entsprechend aktualisierst, sodass der neue MySQL-Container dieselbe IP-Adresse, denselben Hostnamen und das gewünschte Datenverzeichnis nutzt wie der alte Container. Damit bleibt deine WordPress-Installation oder deine Anwendung funktionstüchtig, ohne dass weitere Anpassungen notwendig sind.

Nach diesen Anpassungen führst du deine Docker-Compose-Datei wieder hoch und testest, ob deine Anwendung korrekt auf den neuen MySQL 8.0-Server zugreifen kann. Teste alle Funktionalitäten, um sicherzugehen, dass keine Daten verloren gegangen sind oder unerwartete Fehler auftreten.

Bei mir sah es am ende folgendermaßen aus:

Fazit: Vorbereitung ist alles

Die Migration von MySQL 5.7 auf MySQL 8.0 mag kompliziert wirken, aber mit einer guten Planung und strukturierten Vorgehensweise ist sie absolut machbar. Der wichtigste Punkt dabei ist, dass du alle Schritte sorgfältig durchgehst und nichts überstürzt. Ein Backup ist dein bester Freund und gibt dir die notwendige Sicherheit, falls doch etwas schiefgehen sollte.

Sobald du die Migration erfolgreich abgeschlossen hast, kannst du die Vorteile von MySQL 8.0 nutzen: verbesserte Performance, bessere Sicherheit und zukunftssichere Funktionalitäten. Jetzt bist du bestens aufgestellt für kommende Anforderungen!