Deutsch

MySQL/MariaDB-Datenbank auf Linux-VPS exportieren und importieren

3 min
VPS/VDS-Hosting

Eine Website umziehen, ein Backup einspielen oder eine Testumgebung klonen: Am Ende laufen alle Aufgaben auf zwei Schritte hinaus, nämlich die Datenbank in eine Datei zu exportieren und sie wieder zu laden. Auf einem VPS Linux Infrawire gelingt beides mit wenigen Befehlen, ganz ohne Weboberfläche. Diese Anleitung behandelt konsistente Dumps, Kompression, große Dateien, Zeichenkodierung und die direkte Übertragung zwischen Servern.

📋 Voraussetzungen

  • Ein Linux-VPS mit Ubuntu 24.04 oder Debian 12 und SSH-Root-Zugang (IP und Root-Passwort finden Sie in Ihrem Kundenbereich)
  • MySQL oder MariaDB, mindestens aber der Client (apt install mariadb-client)
  • Ein Datenbankbenutzer mit den Rechten SELECT, SHOW VIEW, TRIGGER, LOCK TABLES und EVENT für die zu exportierende Datenbank
  • Genug freier Speicherplatz: prüfen mit df -h

1. Datenbank mit mysqldump exportieren

Bei InnoDB-Tabellen (Standard-Engine) erzeugt --single-transaction einen konsistenten Schnappschuss, ohne die Tabellen zu sperren. Ihre Website läuft während des Dumps weiter.

Bash
mysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql

In aktuellen MariaDB-Versionen gibt es das Werkzeug auch als mariadb-dump, mit denselben Optionen.

2. Routinen, Trigger und Events einschließen

Trigger werden standardmäßig exportiert, gespeicherte Prozeduren, Funktionen und geplante Events müssen Sie jedoch ausdrücklich anfordern. Ein fest vorgegebener Zeichensatz vermeidet Probleme mit Umlauten und Emojis.

Bash
mysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql

Nützliche Varianten:

Bash
# Nur die Struktur, ohne Zeilen mysqldump -u USER -p --no-data DBNAME > schema.sql # Mehrere Datenbanken, mit CREATE-DATABASE-Anweisungen mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # Alle Datenbanken des Servers mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql

3. Dump mit gzip komprimieren

SQL-Text lässt sich sehr gut komprimieren. Leiten Sie die Ausgabe direkt an gzip weiter, damit die unkomprimierte Datei nie auf die Platte geschrieben wird.

Bash
mysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz

Um das Passwort nicht jedes Mal einzutippen (und es aus der ps-Ausgabe herauszuhalten), legen Sie es in ~/.my.cnf ab:

INI
[client] user=USER password=YOUR_PASSWORD
Bash
chmod 600 ~/.my.cnf

4. Dump importieren

Legen Sie zuerst die Zieldatenbank mit einem modernen Zeichensatz an und laden Sie dann die Datei.

Bash
mysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # Aus einer komprimierten Datei gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME

Achtung: Der Dump enthält standardmäßig DROP TABLE IF EXISTS. Beim Import in eine bestehende Datenbank werden gleichnamige Tabellen ersetzt. Sichern Sie das Ziel vorher.

5. Große Dateien bewältigen

Bei Dumps im Gigabyte-Bereich starten Sie den Import in tmux, damit ein SSH-Verbindungsabbruch ihn nicht stoppt, und zeigen den Fortschritt mit pv an.

Bash
apt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME

Mit Strg+B und danach D lösen Sie sich von der Sitzung und kehren später mit tmux attach -t import zurück.

6. Direkt per SSH auf einen anderen Server übertragen

Eine Zwischendatei ist nicht nötig: Der Dump läuft durch eine verschlüsselte SSH-Pipe und wird am Ziel geladen. Die Zugangsdaten werden auf beiden Seiten aus ~/.my.cnf gelesen (oder als root über den lokalen Socket).

Bash
mysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'

Die Datenbank DBNAME muss auf dem Zielserver bereits existieren.

✅ Ergebnis prüfen

Bash
gzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"

Vergleichen Sie die Zeilenanzahl einiger wichtiger Tabellen zwischen Quelle und Ziel.

🔧 Fehlerbehebung

ERROR 1045 Access denied : falscher Benutzer oder falsches Passwort, oder der Benutzer darf sich von diesem Host nicht verbinden. Testen Sie zuerst mit mysql -u USER -p.

ERROR 2006 MySQL server has gone away : Eine Zeile oder Abfrage überschreitet max_allowed_packet. Erhöhen Sie den Wert serverseitig im Abschnitt [mysqld] der Konfiguration und starten Sie den Dienst neu, oder übergeben Sie dem Client --max-allowed-packet=512M.

Kaputte Umlaute nach dem Import : Die Datei wurde mit dem falschen Zeichensatz gelesen. Exportieren Sie mit --default-character-set=utf8mb4 und importieren Sie mit derselben Option.

ERROR 1227 oder DEFINER-Fehler : Der Dump verweist auf einen Benutzer, den es am Ziel nicht gibt. Entfernen Sie die Klausel während des Imports:

Bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME

🎉 Ihre Datenbanken lassen sich jetzt einfach sichern, wiederherstellen und zwischen Servern umziehen!

Bleiben Sie über die neuesten Angebote, Rabatte und Sonderaktionen informiert.

Aktionen ansehen

Wir verwenden Cookies

Wir verwenden Analyse-Cookies, um Ihre Erfahrung auf unserer Website zu verbessern. Es werden keine Daten an Dritte verkauft. Mehr erfahren Sie in unserer Datenschutzerklärung.