Donnerstag, 31. August 2006, 21:58 Uhr

MySQL über SSH tunneln

Heute habe ich die lang ersehnte Instanz auf einem VMWare ESX-Server erhalten und werde in den nächsten Tagen Web-Sites von einem Solaris-System auf LAMP (Debian, Apache2, PHP4, MySQL 4.0) migrieren.

Bereits wenige Stunden nach der Installation von Debian stand ich vor einem grösseren Problem: Wie kopiere ich eine über 50 MB grosse Datenbank-Tabelle vom einen auf den anderen Server? (Achtung: Es steht hier jetzt nicht zur Diskussion, ob ich die Daten richtig normalisiert habe …) Und zwar selbständig, ohne den Sysadmin der Solaris-Kiste anzuflehen, mir das Tabellenfile zum Download zur Verfügung zu stellen? Auch phpMyAdmin kam nicht in Frage: Das Ding ist gut und recht – nur würde sich die Applikation garantiert an der Grösse der Textdateien verschlucken. Wenn nicht beim Download, dann spätestens beim Upload.

Was nun? SSH ist – wie so oft – die Lösung. Das Konzept ist simpel: Auf dem Zielrechner tunnle ich Anfragen über einen bestimmten Port via SSH auf den Solaris-Rechner und habe so Zugriff auf die zu migrierende Datenbank, als würde ich lokal am Server angemeldet sein.

Drei einfache Schritte sind nötig, um eine Datenbank-Tabelle von Server A nach Server B zu verschieben:

Port Forwarding über SSH Tunnel einrichten

Auf Server B erstellt man in der Datei ~/.ssh/config eine neue SSH-Konfiguration:

Host <irgendeine Wunschbezeichnung>
Hostname <IP Server A>
User <SSH-Benutzernamen auf Server A>
Localforward <beliebiger, nicht verwendeter Port> localhost:3306

Die IP nach Hostname entspricht der IP des Servers A, auf dem die zu spiegelnde Datenbank liegt. Nach User steht der Name eines gültigen SSH-Users auf Server A. 3307 ist der lokale Port (auf Server B, der auf Server A geforwardet wird und dort auf Port 3306 endet (dem MySQL-Port, notabene).

Ist die Textdatei gespeichert, braucht man nur noch die Verbindung zu starten:

ssh <irgendeine Wunschbezeichnung>

Man sollte nicht verblüfft sein, wenn alles wie eine normale Verbindungsaufnahme zu einem SSH-Server daherkommt. Man loggt sich wie gewohnt ein und lässt die Session laufen (Verbindung nicht trennen!). Es ist von Vorteil, wenn diese Verbindung in einem screen-Terminal geöffnet wurde.

Dump anlegen

Die Verbindung besteht nun also. Port 3307 steht bereit, Daten zu empfangen und diese an Server A weiterzuleiten.

Nun gut, auf was warten wir? Spätestens jetzt sollte man das Package mysql-client installieren, da darin mysqldump enthalten ist. Genau dieses verwenden wir nun, um die Tabelle in eine Datei ins lokalen Filesystem des Servers B zu speichern:

mysqldump -h 127.0.0.1 -P 3307 -u <MySQL-Benutzernamen Server A> -p <MySQL-Datenbank Server A> --tables <MySQL-Tabelle Server A> > /tmp/dump.sql

mysqldump nimmt nun Verbindung mit dem Datenbankserver auf. Nachdem man das korrekte Passwort übermittelt hat, wird der Dump schnurstracks in das entsprechende File übertragen. Nach kaum einer Minute waren 50MB an Daten über die Leitung transferiert und in /tmp/dump.sql gespeichert worden.

Dump einspielen

Die SSH-Verbindung zu Server A kann nun gekappt werden. Jetzt bleibt nur noch eines übrig: Den Dump in die Datenbank auf Server B einzulesen. Nichts leichter als das:

mysql -u <MySQL-Benutzernamen Server B> -p <MySQL-Datenbank Server B> < /tmp/dump.sql

Sind bis hierhin keine Fehlermeldungen aufgetaucht, ist die Tabelle nun auch auf Server B anzutreffen.

PS: Ob Kollege Torquie seine unzählige Gigabytes umfassende SAP-Datenbanken auf dieselbe Art spiegelt? *grins*

Nützliche Links

Labels: Linux

Kommentar erfassen