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 TABLESundEVENTfü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.
Bashmysqldump -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.
Bashmysqldump -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.
Bashmysqldump -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
Bashchmod 600 ~/.my.cnf
4. Dump importieren
Legen Sie zuerst die Zieldatenbank mit einem modernen Zeichensatz an und laden Sie dann die Datei.
Bashmysql -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.
Bashapt 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).
Bashmysqldump --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
Bashgzip -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:
Bashsed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME
🎉 Ihre Datenbanken lassen sich jetzt einfach sichern, wiederherstellen und zwischen Servern umziehen!