MySQL-Datenbank über das Terminal importieren: Anleitung für große Datenbanken
Grafische Oberflächen wie phpMyAdmin oder Web-Uploads stoßen bei großen Datenbanken schnell an ihre Grenzen. Typische Fehler sind Timeout-Meldungen oder Beschränkungen der Dateigröße (upload_max_filesize).
Der Import über die Kommandozeile (Terminal / CLI) ist der schnellste, stabilste und ressourcenschonendste Weg, um Datenbanken – unabhängig von deren Größe – zu importieren.
Voraussetzungen
Bevor du beginnst, stelle sicher, dass:
- du SSH- oder direkten Terminal-Zugriff auf den Server hast,
- der MySQL- bzw. MariaDB-Client auf dem Server installiert ist,
- die
.sql- oder.sql.gz-Datei bereits auf dem Server liegt, - die Zieldatenbank bereits existiert (falls nicht, siehe Schritt 1).
Schritt 1: Zieldatenbank erstellen (optional)
Falls die Datenbank noch nicht existiert, kannst du sie direkt im Terminal erstellen:
mysql -u root -p -e "CREATE DATABASE mein_datenbankname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
(Ersetze root durch deinen Benutzer und mein_datenbankname durch den gewünschten Namen).
Schritt 2: Der Standard-Import (.sql-Datei)
Wenn du eine unkomprimierte .sql-Datei hast, kannst du sie mit dem folgenden Befehl importieren:
mysql -u [Benutzername] -p [Datenbankname] < /pfad/zur/datei.sql
Beispiel:
mysql -u db_user -p meine_datenbank < /var/www/backups/dump.sql
Nach dem Absenden wirst du aufgefordert, dein MySQL-Passwort einzugeben.
Schritt 3: Große Datenbanken optimiert importieren
Bei extrem großen Datenbanken (mehrere Gigabyte) gibt es spezielle Methoden, um den Prozess zu beschleunigen und Abbrüche zu verhindern.
Methode A: Komprimierte Dateien direkt importieren (.sql.gz)
Große Dumps werden meist als komprimierte .gz-Datei gespeichert. Du musst sie nicht vorher entpacken (das spart Speicherplatz und I/O-Leistung):
gunzip < /pfad/zur/datei.sql.gz | mysql -u [Benutzername] -p [Datenbankname]
Methode B: Fortschrittsbalken anzeigen mit pv (Pipe Viewer)
Der normale MySQL-Import zeigt keine Statusmeldung an. Bei großen Dateien kann das nervenaufreibend sein, da man nicht weiß, ob der Prozess noch läuft. Mit dem Tool pv siehst du den Fortschritt und die verbleibende Zeit.
-
pvinstallieren (falls nicht vorhanden):- Ubuntu/Debian:
sudo apt install pv - CentOS/RHEL:
sudo yum install pv
- Ubuntu/Debian:
-
Import mit Fortschrittsanzeige für
.sql:pv /pfad/zur/datei.sql | mysql -u [Benutzername] -p [Datenbankname] -
Import mit Fortschrittsanzeige für
.sql.gz:pv /pfad/zur/datei.sql.gz | gunzip | mysql -u [Benutzername] -p [Datenbankname]
Schritt 4: Verbindungsabbrüche verhindern (Screen / Tmux)
Wenn ein Import mehrere Stunden dauert und deine SSH-Verbindung abbricht, bricht auch der Importprozess ab. Nutze daher screen oder tmux:
- Neue Sitzung starten:
screen -S db_import - Führe deinen Import-Befehl aus (z. B. Methode A oder B).
- Du kannst die Sitzung jetzt mit
STRG + A, gefolgt vonDsicher im Hintergrund laufen lassen. - Später wieder zurückholen mit:
screen -r db_import
Schritt 5: Typische Probleme und Lösungen
Fehler: „MySQL server has gone away“ oder „Packet too large“
Große Datenbanken enthalten oft riesige Datenblöcke (z. B. Blogposts oder Binärdaten), die das Standardlimit überschreiten.
- Lösung: Erhöhe temporär das Paketlimit beim Import:
mysql --max_allowed_packet=512M -u [Benutzername] -p [Datenbankname] < /pfad/zur/datei.sql
Sehr langsamer Import von InnoDB-Tabellen
Wenn der Dump keine Deaktivierung von Prüfungen enthält, verlangsamt die Fremdschlüssel- und Indexprüfung den Import drastisch.
- Lösung: Du kannst diese Prüfungen temporär an den Anfang und das Ende deines SQL-Imports hängen oder die Konfiguration optimieren:
(echo "SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; SET AUTOCOMMIT=0;"; cat datei.sql; echo "COMMIT; SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1;") | mysql -u [Benutzername] -p [Datenbankname]
Zusammenfassung
Für maximale Geschwindigkeit und Komfort bei großen Datenbanken empfiehlt sich dieser Einzeiler (inkl. pv und erhöhtem Paketlimit für eine .sql.gz-Datei):
pv backup.sql.gz | gunzip | mysql --max_allowed_packet=1G -u mein_user -p meine_datenbank