Benutzer mit Rechten für mysqldump ausstatten

MySQL Backupscripte sind ein potentielles Sicherheitsrisiko, wenn zum Sichern der root Benutzer verwendet wird. Denn meist steht das Passwort direkt im Script oder ist in der my.cnf abgelegt. Ein potenzieller Angreifer der lesend auf das System gelangt, hat dadurch leichtes Spiel an die Passwörter zu kommen. Deshalb empfiehlt es sich Backups mit einem separaten Benutzer anzulegen, der nur die nötigsten Rechte hat. Ich gehe meist wie folgt vor:

Benutzer angelegen

CREATE USER 'backupnutzer'@'localhost' IDENTIFIED BY 'geheim';

Berechtigungen setzen (Wer keine Trigger oder Views benutzt kann SHOW VIEW bzw. TRIGGER auch weg lassen.)

GRANT SELECT, FILE, LOCK TABLES, SHOW VIEW, TRIGGER ON *.* TO 'backupnutzer'@'localhost';

Hinweis! Diese Query vergibt globale Rechte. Will man nur auf eine bestimmte Datenbank sichern sollte der Befehl so aussehen.

GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ON datenbank.* TO 'backupnutzer'@'localhost';

Rechte neu einlesen

FLUSH PRIVILEGES;

Fertig. Nun kann der Benutzer backupnutzer mit dem Passwort geheim in den Scripten verwendet werden. Ein potentieller Angreifer würde zwar trotzdem noch auf die Datenbank gelangen, könnte aber deutlich weniger Schaden anrichten.

MySQL Dump Importfortschritt anzeigen

Der Titel klingt ein wenig holprig, aber es geht hier um eine wirklich nette Funktion, die sich bestimmt jeder irgendwann schon einmal gewünscht hat. Eine „Fortschrittsanzeige“ für das Einspielen von MySQL Dumps (siehe Screenshot).

Fortschrittsanzeige bei MySQL Dump Import

Hierfür wird ein kleines Programm namens bar benutzt, welches Fortschrittsanzeigen für Dateitransfers generiert. Auf SourceForge kann man sich die aktuelle Version herunterladen. Ubuntu Nutzer (ab Natty/11.04 ) können auch die Paketquellen zur Installation verwenden:

$ sudo apt-get install bar

Ein simpler Import eines MySQL Dump würde dann in etwa so aussehen:

$ bar -if=/pfad/zum/dump.sql | mysql

Natürlich macht dieser Umweg nur Sinn wenn das Dump auch eine entsprechende Größe aufweist. ;-)

Hinweis: Die Angabe der Logindaten entfällt bei mir, weil ich eine ~/.my.cnf verwende.

Weitere Links zum Thema:
http://clpbar.sourceforge.net/
http://manpages.ubuntu.com/manpages/natty/en/man1/bar.1.html

MySQL Datenbankstruktur sichern

Zum Entwerfen und Bearbeiten von Datenbanken habe ich mich zur Zeit auf MySQL Workbench eingeschossen. Neben vielen anderen Features kann man hier via „Reverse Engineer“ bestehende Datenbanken einlesen.

Doch heute hatte ich das Problem keinen direkten Zugriff auf die DB zu haben. Das Einspielen eines aktuellen Dumps war aufgrund der Größen- und Performancebeschränkungen auf meinem Netbook nicht möglich.

Ich brauchte also nur ein Dump der Struktur. Da keine GUI wie phpMyAdmin verfügbar war, musste ich mysqldump verwenden:

$ mysqldump -u root -p -d datenbank > datenbankstruktur.sql

Der Parameter -d bewirkt, das nur die Struktur der Datenbank – also ohne Daten – gesichert wird. Alternativ kann auch —no-data angegeben werden. Dieses kleine Dump konnte ich dann Problemlos in MySQL Workbench einlesen und bearbeiten.

Weitere Informationen zum Thema:
http://www.mysql.de/downloads/workbench/
http://dev.mysql.com/doc/refman/5.1/de/mysqldump.html

MySQL Datenbankbackup auf einem entfernten Host einspielen

Mit Produktiv Datenbanken zu arbeiten kann unter Umständen eine heikle Sache sein. Besser ist es eine Arbeits- bzw. Testumgebung anzulegen. Um mit aktuellen Daten aus der Produktiv Umgebung zu testen, benötigt man für die Testumgebung ein SQL Dump.

Natürlich kann man eine MySQL Datenbank sichern und wiederherstellen. Es gibt aber noch einen einfacheren Weg. Ist die Testumgebung von der Produktivumgebung erreichbar, funktioniert folgendes:

mysqldump DATENBANK | mysql —host=ENTFERNTER_HOST -C DATENBANK

Selbstverständlich ist diese Variante nicht die einzige Lösung, aber um eine Normale Datenbank von einer MySQL Installation auf eine andere zu bekommen, reicht es alle mal.

MySQL Datenbank sichern

Das Thema Sicherung wird meist nicht ausreichend beachtet. Gerade bei Datenbanken wie z.B. MySQL kann das aber ein Fehler sein. Ist die Datenbank klein kann z.B. die Verwaltungsoberfläche phpMyAdmin genutzt werden. Bei größeren Datenbanken empfielt sich dann doch schon die Kommandozeile.

Eine sehr simple Variante einer Sicherung in der Kommandozeile lautet wie folgt:

mysqldump DATENBANK1 > /pfad/zur/mysqlsicherung.sql

Wobei DATENBANK1 mit dem Namen der zu sichernden Datenbank ersetzt wird. Natürlich kann man auch gleich mehrere Datenbanken sichern. Zum Beispiel so:

mysqldump –opt DATENBANK1, DATENBANK2, … > /pfad/zur/mysqlsicherung.sql

Um eine mit mysqldump erstellte Sicherung wieder herzustellen, benutzt man den folgenden Befehl:

mysql -uBENUTZER -pPASSWORT DATENBANK1 < /pfad/zur/mysqlsicherung.sql

Weitere Informationen zum Sichern von Datenbanken gibts in der MySQL-Dokumentation.
http://dev.mysql.com/doc/refman/5.1/de/mysqldump.html
http://dev.mysql.com/doc/refman/5.1/de/mysql-command-options.html
http://dev.mysql.com/doc/refman/5.1/de/disaster-prevention.html