MySQL-Datenbanken importieren und exportieren – Praxisleitfaden für große Datenmengen von Adrian Thommes

Warum phpMyAdmin bei großen Datenbanken versagt

phpMyAdmin ist ein hervorragendes Werkzeug für die tägliche Datenbankarbeit. Tabellen durchsuchen, Abfragen ausführen, kleine Importe – kein Problem. Doch sobald Datenmengen in den dreistelligen Megabyte-Bereich steigen, treffen drei technische Schranken gleichzeitig aufeinander.

Limit 1
PHP Timeout

Die max_execution_time bricht das Skript nach 30–120 Sekunden ab. Große Imports dauern länger.

Limit 2
Upload-Limit

upload_max_filesize und post_max_size sind auf Shared Hosting oft auf 64–256 MB begrenzt.

Limit 3
Arbeitsspeicher

Das PHP Memory Limit (memory_limit) kann bei großen Dateimengen überschritten werden.

Das Tückische: phpMyAdmin zeigt oft keine klare Fehlermeldung. Der Import bricht einfach mittendrin ab – ohne Hinweis, wo genau und ob Daten korrekt importiert wurden. Das Resultat ist im schlimmsten Fall eine halbfertig befüllte Datenbank, die inkonsistente Zustände enthält.

Wichtig: Ein gescheiterter phpMyAdmin-Import kann die Zieldatenbank in einem inkonsistenten Zustand hinterlassen. Bevor du irgendetwas importierst – egal welche Methode – exportiere zuerst den aktuellen Zustand der Zieldatenbank als Sicherungskopie.

Übersicht: Welche Methode passt zu deiner Situation?

Die richtige Methode hängt von deinen Zugriffsrechten und der Datenbankgröße ab:

Entscheidungshilfe

  • SSH-Zugang vorhanden + Datenbank < 10 GB: mysqldump direkt auf dem Server – schnell, zuverlässig, ohne Limits
  • SSH-Zugang + Datenbank > 10 GB: mydumper für parallelisierte Dumps oder direkte Dateisystem-Sicherung
  • Kein SSH, aber FTP + PHP-Skript-Ausführung möglich: PHP-Export-Skript via system() oder BigDump für den Import
  • Nur phpMyAdmin, Dump unter 50 MB: Direkt über phpMyAdmin – funktioniert problemlos
  • WordPress-Projekt: WP-CLI ist die sauberste und schnellste Lösung

mysqldump via SSH – der Goldstandard

mysqldump ist das offizielle Backup-Tool für MySQL und MariaDB. Es läuft direkt auf dem Server, kennt keine PHP-Timeouts und kann Datenbanken jeder Größe sichern. Voraussetzung: SSH-Zugang zu deinem Server.

Einfacher Export

# Einzelne Datenbank exportieren
mysqldump -u benutzername -p datenbankname > dump.sql

# Mit Passwort direkt (kein interaktiver Prompt)
mysqldump -u benutzername -p'MeinPasswort' datenbankname > dump.sql

# Alle Datenbanken auf einmal sichern
mysqldump -u root -p --all-databases > alle-datenbanken.sql

Optimierter Export für große Datenbanken

# Zusatzoptionen für große, produktive Datenbanken
mysqldump \
  -u benutzername -p \
  --single-transaction \     # Konsistenter Snapshot ohne Tabellensperren (InnoDB)
  --quick \                  # Zeilen einzeln laden, schont RAM
  --skip-extended-insert \   # Einzelne INSERTs – einfacher zu debuggen
  --set-gtid-purged=OFF \    # Für Replikationsumgebungen relevant
  datenbankname > dump.sql

--single-transaction: Dieser Flag ist für produktive InnoDB-Datenbanken essenziell. Er erstellt einen konsistenten Snapshot ohne die Tabellen zu sperren – du kannst die Datenbank während des Exports normal weiter nutzen. Für MyISAM-Tabellen funktioniert das nicht; dort hilft stattdessen --lock-tables.

Dump komprimieren: Dateigröße um bis zu 90 % reduzieren

SQL-Dumps bestehen aus reinem Text – und Text lässt sich hervorragend komprimieren. Ein 1-GB-Dump schrumpft mit gzip regelmäßig auf 80–150 MB. Das spart Speicherplatz und beschleunigt den Transfer erheblich.

Export direkt als gzip-Archiv

# Export + sofortige Komprimierung per Pipe
mysqldump -u benutzername -p datenbankname | gzip > dump.sql.gz

# Mit Datum im Dateinamen – praktisch für automatisierte Backups
mysqldump -u benutzername -p datenbankname | gzip > dump-$(date +%Y-%m-%d).sql.gz

Bestehenden Dump nachträglich komprimieren

# Komprimieren (die Originaldatei wird ersetzt)
gzip dump.sql

# Komprimieren ohne Original zu löschen
gzip -k dump.sql

# Entpacken
gunzip dump.sql.gz

Import via SSH – schnell, sicher, ohne Limits

Der Import via SSH ist genauso unkompliziert wie der Export. Der mysql-Client liest die SQL-Datei direkt ein und ist dabei nur durch die Netzwerkgeschwindigkeit und den Server begrenzt – nicht durch PHP.

Einfacher SQL-Import

# SQL-Datei in bestehende Datenbank importieren
mysql -u benutzername -p datenbankname < dump.sql

Komprimierten Dump importieren

# gzip-Dump direkt importieren ohne zwischenzeitliches Entpacken
gunzip -c dump.sql.gz | mysql -u benutzername -p datenbankname

# Alternative mit zcat
zcat dump.sql.gz | mysql -u benutzername -p datenbankname

Import mit Fortschrittsanzeige

# pv zeigt Geschwindigkeit und geschätzte Restzeit
pv dump.sql | mysql -u benutzername -p datenbankname

# pv installieren falls nicht vorhanden (Debian/Ubuntu)
apt-get install pv

Kein SSH-Zugang? Import & Export per PHP-Skript

Auf Shared-Hosting-Tarifen ohne SSH-Zugang gibt es dennoch einen Weg zu mysqldump: PHP kann mit der system()-Funktion Server-Befehle ausführen – sofern der Hosting-Anbieter dies erlaubt. Das Skript wird per FTP hochgeladen und dann über den Browser aufgerufen.

Sicherheitshinweis: PHP-Skripte die Datenbankzugangsdaten enthalten und Shell-Befehle ausführen, sind ein erhebliches Sicherheitsrisiko wenn sie dauerhaft auf dem Server liegen. Lade sie nur für den Moment des Imports hoch, führe sie aus und lösche sie anschließend sofort. Schütze den Zugang zusätzlich über Verzeichnis-Passwortschutz via .htaccess.

Export-Skript (export.php)

<?php
// Zugangsdaten anpassen
$db_host = 'localhost';
$db_user = 'dein-datenbankbenutzer';
$db_pass = 'dein-passwort';
$db_name = 'dein-datenbankname';
$dump_pfad = '/absoluter/pfad/zum/webspace/dump/dump.sql';

// Dump erstellen
$befehl = '/usr/bin/mysqldump -u' . escapeshellarg($db_user)
        . ' -p' . escapeshellarg($db_pass)
        . ' -h' . escapeshellarg($db_host)
        . ' ' . escapeshellarg($db_name)
        . ' > ' . escapeshellarg($dump_pfad);

system($befehl, $exitcode);

if ($exitcode === 0 && chmod($dump_pfad, 0600)) {
    echo 'Export erfolgreich. Dump liegt unter: ' . $dump_pfad;
} else {
    echo 'Fehler beim Export. Exit-Code: ' . $exitcode;
}
?>

Export als gzip-Archiv (export-gz.php)

<?php
$db_host = 'localhost';
$db_user = 'dein-datenbankbenutzer';
$db_pass = 'dein-passwort';
$db_name = 'dein-datenbankname';
$dump_pfad = '/absoluter/pfad/zum/webspace/dump/dump.sql.gz';

$befehl = '/usr/bin/mysqldump -u' . escapeshellarg($db_user)
        . ' -p' . escapeshellarg($db_pass)
        . ' -h' . escapeshellarg($db_host)
        . ' ' . escapeshellarg($db_name)
        . ' | /bin/gzip > ' . escapeshellarg($dump_pfad);

system($befehl, $exitcode);

if ($exitcode === 0 && chmod($dump_pfad, 0600)) {
    echo 'Export als .gz erfolgreich.';
} else {
    echo 'Fehler beim Export. Exit-Code: ' . $exitcode;
}
?>

Import-Skript (import.php)

<?php
$db_host = 'localhost';
$db_user = 'dein-datenbankbenutzer';
$db_pass = 'dein-passwort';
$db_name = 'dein-datenbankname';
$dump_pfad = '/absoluter/pfad/zum/webspace/dump/dump.sql';

$befehl = '/usr/bin/mysql -u' . escapeshellarg($db_user)
        . ' -p' . escapeshellarg($db_pass)
        . ' -h' . escapeshellarg($db_host)
        . ' ' . escapeshellarg($db_name)
        . ' < ' . escapeshellarg($dump_pfad);

system($befehl, $exitcode);
echo $exitcode === 0 ? 'Import erfolgreich.' : 'Fehler beim Import. Code: ' . $exitcode;
?>

Den absoluten Pfad zu deinem Webspace findest du bei den meisten Hostern im Verwaltungspanel unter den Serverinformationen – er sieht meist aus wie /var/www/html/deinname oder /is/htdocs/wp1234567_ABC.

BigDump – web-basierter Import für große SQL-Dateien

Wer keinen SSH-Zugang hat und system() auf dem Server nicht verfügbar ist, kann auf BigDump zurückgreifen. Das PHP-Skript liest die hochgeladene SQL-Datei in kleinen, definierten Häppchen ein – und umgeht so den PHP-Timeout clever, indem es sich per Meta-Refresh selbst immer wieder neu aufruft.

  • BigDump herunterladen – das PHP-Skript von der offiziellen Projektseite laden (bigdump.php)
  • Konfigurieren – Datenbankzugangsdaten direkt in der bigdump.php eintragen: $db_server, $db_username, $db_password, $db_name
  • SQL-Dump hochladen – per FTP in dasselbe Verzeichnis wie bigdump.php legen
  • bigdump.php im Browser aufrufen – den Pfad zur SQL-Datei auswählen und starten
  • Fortschritt beobachten – BigDump zeigt prozentualen Fortschritt und Dauer
  • Beide Dateien löschen – nach erfolgreichem Import bigdump.php und dump.sql sofort entfernen

BigDump-Einschränkung: BigDump kann keine Dumps verarbeiten, die per phpMyAdmin mit der Option „Erweiterter Insert" exportiert wurden – also Dumps bei denen mehrere Zeilen in einem einzelnen INSERT-Statement zusammengefasst sind. Exportiere mit --skip-extended-insert oder wähle in phpMyAdmin „Vollständige INSERT-Statements".

WP-CLI: Datenbanken in WordPress-Projekten managen

Wer mit WordPress-Projekten arbeitet, hat mit WP-CLI ein mächtiges Tool an der Hand. Es liest Zugangsdaten direkt aus der wp-config.php – kein manuelles Eintippen von Host, User und Passwort.

# Datenbank exportieren (liest wp-config.php automatisch)
wp db export backup.sql

# Komprimiert exportieren
wp db export -- | gzip > backup.sql.gz

# Datenbank importieren
wp db import backup.sql

# URL nach Migration/Domainwechsel ersetzen
wp search-replace 'https://alte-domain.de' 'https://neue-domain.de' --all-tables

# Datenbankstruktur prüfen
wp db check

Der search-replace-Befehl ist besonders wertvoll bei Website-Migrationen. WordPress speichert URLs serialisiert in der Datenbank – ein einfaches Suchen-Ersetzen in der SQL-Datei zerstört dabei die Serialisierung. WP-CLI handhabt das korrekt. Mehr zur sicheren Wartung und Absicherung von WordPress-Installationen findest du in einem eigenen Leitfaden.

Troubleshooting: Häufige Fehler und ihre Ursachen

Fehler: 1044 – Access denied for user

Dieser Fehler beim Import bedeutet fast immer: Im SQL-Dump steckt der Befehl CREATE DATABASE. Shared-Hosting-Benutzer dürfen über ihren Datenbankbenutzer keine neuen Datenbanken anlegen – das geht nur über das Verwaltungspanel des Hosters.

Lösung: Öffne den Dump in einem Texteditor (bei großen Dateien: Notepad++, VS Code, oder per grep auf der Kommandozeile) und entferne die Zeilen mit CREATE DATABASE und USE datenbankname;. Danach klappt der Import.

Fehler: Zeichensatz-Probleme (krakelige Umlaute)

Wenn nach dem Import Umlaute falsch dargestellt werden, stimmt der Zeichensatz nicht. Häufige Ursache: Der Dump wurde mit einem anderen Charset erstellt als die Zieldatenbank erwartet.

# Export explizit mit UTF-8 erzwingen
mysqldump --default-character-set=utf8mb4 -u user -p datenbankname > dump.sql

# Import mit Zeichensatz-Angabe
mysql --default-character-set=utf8mb4 -u user -p datenbankname < dump.sql

Fehler: max_allowed_packet überschritten

Bei Dumps mit sehr langen INSERT-Statements – etwa wenn du ohne --skip-extended-insert exportiert hast – kann der max_allowed_packet-Wert beim Import überschritten werden.

# Temporär erhöhen beim Import
mysql --max_allowed_packet=512M -u user -p datenbankname < dump.sql

Import bricht ohne Fehlermeldung ab (PHP-Timeout)

Wenn der Import über ein PHP-Skript ohne Fehlermeldung abbricht, ist fast immer der PHP-Timeout der Schuldige. Du kannst versuchen, ihn am Anfang des Skripts zu setzen:

<?php
set_time_limit(0);     // Kein Timeout
ini_set('memory_limit', '512M');

Alternativ hilft es, den Timeout-Wert per .htaccess-Direktive anzuheben: php_value max_execution_time 3600. Ob dein Hoster das erlaubt, hängt vom Tarif ab.

Backup-Strategie: So verlierst du nie wieder Daten

Ein Datenbankdump der bei Bedarf nicht greifbar ist, ist wertlos. Verlässliche Backups brauchen Automatisierung, Redundanz und regelmäßige Tests.

Checkliste: Solide Backup-Strategie

  • Tägliche automatisierte Dumps – per Cronjob auf dem Server oder über das Hosting-Panel, nicht manuell
  • Offsite-Speicherung – Backups müssen außerhalb des Webservers liegen: S3, SFTP-Server, lokale Festplatte. Ein Server-Ausfall darf nie alle Backups vernichten
  • Aufbewahrungsrichtlinie – Tägliche Backups 7 Tage, wöchentliche 4 Wochen, monatliche 12 Monate
  • Komprimierung – gzip spart 80–90 % Speicherplatz ohne Qualitätsverlust
  • Restore-Tests – Mindestens einmal im Quartal einen Testimport in eine Staging-Umgebung durchführen. Ein Backup das sich nicht wiederherstellen lässt, ist keins
  • Monitoring – Fehlgeschlagene Backup-Jobs müssen eine Benachrichtigung auslösen

Automatisierter Cronjob: 0 3 * * * /usr/bin/mysqldump -u user -pPasswort datenbankname | gzip > /backup/dump-$(date +\%Y-\%m-\%d).sql.gz – täglich um 3 Uhr nachts, komprimiert, mit Datum im Dateinamen.

Häufige Fragen zum Datenbankimport & -export

Warum scheitert phpMyAdmin beim Import großer Datenbanken?
phpMyAdmin läuft als PHP-Skript und unterliegt serverseitigen Limits: der maximalen PHP-Ausführungszeit (max_execution_time), dem Upload-Limit (upload_max_filesize) und dem Post-Limit (post_max_size). Dumps über 256 MB oder komplexe Wiederherstellungen, die länger als 30–120 Sekunden dauern, werden abgebrochen. Abhilfe: mysqldump via SSH, BigDump oder PHP-basierte Import-Skripte.
Was ist der Unterschied zwischen mysqldump und phpMyAdmin-Export?
Technisch erzeugen beide einen SQL-Dump. Der Unterschied liegt in der Ausführungsumgebung: phpMyAdmin läuft als PHP-Skript im Webserver und ist an dessen Limits gebunden. mysqldump läuft direkt auf dem Betriebssystem, hat Zugriff auf alle Serverressourcen und ist deutlich schneller – ohne jegliche Größen- oder Zeitbeschränkung. Für Datenbanken über 50 MB ist mysqldump klar vorzuziehen.
Wie importiere ich eine große SQL-Datei ohne SSH-Zugang?
Ohne SSH gibt es drei praktische Wege: BigDump (ein PHP-Skript das die SQL-Datei in kleinen Segmenten verarbeitet und per Meta-Refresh den Timeout umgeht), selbst geschriebene PHP-Import-Skripte die mysqldump über system() aufrufen (wenn der Hoster das erlaubt), oder das Aufteilen des Dumps in kleinere Dateien unter 50 MB, die phpMyAdmin einzeln importieren kann.
Wie komprimiere ich einen Datenbank-Dump?
Mit mysqldump lässt sich der Output direkt durch gzip pipen: mysqldump -u user -p datenbankname | gzip > dump.sql.gz. Das reduziert die Dateigröße oft um 80–90 %. Import dann mit: gunzip -c dump.sql.gz | mysql -u user -p datenbankname – kein zwischenzeitliches Entpacken nötig.
Was bedeutet der Fehler "1044 Access denied" beim Import?
Fast immer enthält der SQL-Dump den Befehl CREATE DATABASE. Shared-Hosting-Nutzer dürfen über ihren Datenbankbenutzer keine neuen Datenbanken anlegen – nur über das Hosting-Verwaltungspanel. Lösung: Im Dump die Zeile mit CREATE DATABASE und USE datenbankname; mit einem Texteditor entfernen, dann erneut importieren.
Kann ich eine Datenbank zu einem anderen Hoster migrieren?
Ja. Der Prozess: 1. Vollständigen Dump beim alten Hoster erstellen. 2. Beim neuen Hoster eine leere Datenbank anlegen. 3. Dump importieren. Bei WordPress außerdem: URLs in der Datenbank anpassen (am besten per WP-CLI search-replace), wp-config.php auf neue Zugangsdaten aktualisieren und ggf. DNS-Einträge umstellen. Der häufigste Fehler: vergessene URL-Anpassung und fehlende Zeichensatz-Übereinstimmung zwischen alt und neu.
Adrian Thommes – Marketing Experte & SEO Spezialist Saarland

Adrian Thommes

Datenbanken sind das Gedächtnis jeder Website – und ausgerechnet beim Thema Backup herrscht bei vielen Webmastern erstaunlich viel Optimismus: „Das wird schon nicht schiefgehen." Geht es aber. Ich habe zu viele Migrations-Desaster gesehen, die mit einem funktionierenden mysqldump-Befehl und einer Offsitekopie nie stattgefunden hätten. Die gute Nachricht: einmal richtig eingerichtet, läuft ein automatisierter Backup-Cronjob jahrelang still im Hintergrund – und du schläfst deutlich ruhiger.