MySQL Datenbanken über SSH ex- und importieren

26 08 2012

phpMyAdmin mag ein ganz praktisches Tool sein was die Administration von MySQL Datenbanken im Web anbelangt. Für einen Zweck taugte das Tool jedoch noch nie, nämlich für den Import größerer Datenmengen. Hier war das Zeitlimit des Webserver immer das Problem, selbst wenn neuere Versionen inzwischen einen Import wiederaufnehmen können. Abhilfe schaffte für mich immer BigDump, das jeweils nur eine begrenzte Anzahl von Zeilen lädt und sich dann selbst erneut aufruft, um die nächste Datenportion anzugehen.

Inzwischen braucht es häufig glücklicherweise nicht mehr einen eigenen Server mit Root-Zugang, viele Hoster bieten bereits bei kostengünstigen Shared-Hosting Offerten einen SSH Zugang mit an. Dank diesem stellt das Transportieren größerer Datenmengen von einer Datenbank in eine Andere kein Problem mehr dar. Ich zeige das im Folgenden exemplarisch für all-inkl.com.

Wir melden uns bei unserer Verwaltungsoberfläche KASserver an. Hier wählen wir den Menüpunkt „Tools“, dann „SSH-Zugänge“. Ist dies bisher noch nicht geschehen, richten wir uns einen SSH Zugang ein und merken uns den Benutzernamen wie auch das Passwort. Damit können wir uns auf der Shell gleich einloggen mittels Eingabe von

ssh [BENUTZERNAME]@[DOMAIN]

Natürlich möchten wir uns das Leben möglichst einfach machen und die folgende Aufforderung zur Eingabe des Passworts los werden. Dazu legen wir uns ein SSH Schlüsselpäärchen an. Um die Schlüssel zu schützen kann man, muss aber kein Passwort vergeben. Ich habe die Passphrase leer gelassen.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaaaa/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/aaaaa/.ssh/id_rsa.
Your public key has been saved in /home/aaaaa/.ssh/id_rsa.pub.
The key fingerprint is:
00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 aaaaa@aaaaa-ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
[...]
+-----------------+

Wir sollten nun zwei Dateien im Verzeichnis .ssh innerhalb unseres Home-Verzeichnisses vorfinden. Die id_rsa ist die private Schlüssel-Datei, die nicht in fremde Hände gehört. Die id_rsa.pub ist die öffentliche Datei, die wir auf den entfernten Server bringen müssen. In der known_hosts werden die Fingerabdrücke der Server gespeichert, auf denen wir schon eingelogggt waren, damit wir den Zugriff nicht jedes Mal aufs Neue bestätigen müssen.

$ ls -l ~/.ssh
insgesamt 36
-rw------- 1 aaaaa aaaaa 1675 Jul 29 14:21 id_rsa
-rw-r--r-- 1 aaaaa aaaaa  400 Jul 29 14:21 id_rsa.pub
-rw-r--r-- 1 aaaaa aaaaa 2042 Jul 29 14:30 known_hosts

Nun kopieren wir die Datei id_rsa.pub in die Datei authorized_keys auf dem Server. Sollte diese bereits existieren, können wir diese nicht einfach so kopieren, da die alten Inhalte damit überschrieben werden. Dann müssen wir die Datei mit anderem Namen auf den Server übertragen und dann den Inhalt ans Ende der authorized_keys anhängen.

$ scp ~/.ssh/id_rsa.pub [BENUTZERNAME]@[DOMAIN]:~/.ssh/authorized_keys
ssh-00000000@example.org's password: 
id_rsa.pub                                    100%  400     0.4KB/s   00:00  

Loggen wir uns jetzt erneut ein, wird unsere Berechtigung über das Schlüsselaar geprüft. Damit haben wir uns die Passworteingabe erspart.

$ ssh ssh-0000000@example.org
Last login: Sun Aug 25 14:43:15 2012 from example.net

Auf dem Server angekommen ist es ein Leichtes, die Datenbank zu exportieren. Wir nutzen dazu das Binary mysqldump.

$ mysqldump [DATENBANK] --user=[BENUTZERNAME] --password >/tmp/dbexport.sql
Enter password:

$ ls -lh /tmp/
-rw-r--r-- 1 ssh-00000000 aaaaa 31642952 2012-07-29 14:56 dbexport.sql

Theoretisch könnten wir das Passwort für die Datenbank auch direkt auf der Befehlszeile mitgeben. Da dieses dann aber auch in der Historie gespeichert wird, halte ich das für ein unnötiges Sicherheitsrisiko. mysqldump bietet noch viele weitere Möglichkeiten, beispielsweise nur bestimmte Tabellen auszugeben. Die Hilfe beschreibt alle Optionen:

mysqldump --help

Zurück auf unserem Computer müssen wir die Datei nur noch übertragen. Dazu nutzen wir scp.

scp -C [BENUTZERNAME]@[DOMAIN]:[/pfad/zur/dbexport.sql] .

Da die Datei dann immer noch unnütz auf dem Server herumliegt, Platz verbraucht und im schlimmsten Fall von böswilligen Besuchern entwendet werden könnten, verknüpfe ich gleich noch das Löschen der Remote Datei

$ MYSERVER=ssh-0000000f@example.org; DUMP=/pfad/zur/dbexport.sql; scp -C ${MYSERVER}:${DUMP} . && ssh ${MYSERVER} "rm ${DUMP}"
dbexport.sql                                  100%  156MB   6.2MB/s   00:25 

Jetzt geht es an den Import in die zweite Datenbank. Ich gehe davon aus, dass diese leer ist oder zumindest die Tabellen, die importiert werden sollen noch nicht existieren. Falls doch ist Vorsicht geboten, da mysqldump per Default ein DROP TABLE in die Export-Datei einfügt. Vorhandene Tabellen werden also unwiederbringlich gelöscht. Diese Option lässt sich natürlich auch deaktivieren, sollte das nicht gewünscht sein.

Am Einfachsten finde ich hier, mysql aufzurufen, die Datenbank inklusive Benutzernamen anzugeben in die wir die Daten laden möchten und die Export-Datei in den geöffneten Stream zu schicken.

$ mysql --database=[DATENBANK] --user=[BENUTZERNAME] --password <[/pfad/zur/dbexport.sql]

Auf diese Art kann ich innerhalb weniger Minuten eine mehrere hundert MB umfassende Datenbank in mein Testsystem überspielen. Schneller und bequemer wäre das mit anderen, auch kostenpflichtigen Tools kaum machbar.

Advertisements

Aktionen

Information

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s




%d Bloggern gefällt das: