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

IP Addressen in MySQL speichern

IP Adressen speichern ist ein heikles Thema – nicht nur in Hinsicht auf die Datenschutzbestimmungen. Kann man nun auf die Speicherung (aus welchen Gründen auch immer) nicht verzichten, so ist es aus verschiedenen Gründen z.B. Speicherbelegung, Performance, … besser die IP als INTEGER und nicht im „Klartext“ als VARCHAR abzuspeichern.

MySQL bietet von Haus die Funktion INET_ATON() und INET_NTOA() um IP Adressen umzuwandeln.

Mit INET_ATON() kann eine IP kann nun wie folgt umgewandelt werden:

mysql> SELECT INET_ATON('192.168.192.0') AS IP;
+------------+
| IP         |
+------------+
| 3232284672 |
+------------+
1 row in set (0.00 sec)

Und anders herum verwendet man INET_NTOA():

mysql> SELECT INET_NTOA('3232284672') AS IP;
+---------------+
| IP            |
+---------------+
| 192.168.192.0 |
+---------------+
1 row in set (0.00 sec)

Hinweis: Beim Umwandeln kann eine Zahl entstehen, die die maximale Größe des INT Datentyps (max. Wert 2147483648) überschreitet. Das Feld zum Speichern des INTEGERS muss UNSIGNED (also nicht vorzeichenbehaftet) sein (max. Wert 4294967295).

Leider scheint diese Methode noch nicht kompatibel zu IPv6. Aber bis zur endgültigen Einführung wird es bestimmt auch hierfür eine Lösung geben.

Weitere Informationen zum Thema:
http://dev.mysql.com/doc/refman/5.1/de/miscellaneous-functions.html
http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html

MySQL Root Passwort zurücksetzen

Anders als beim Ändern eines MySQL Benutzer Passworts, ist das Zurücksetzen des root Passworts schon etwas aufwendiger und benötigt zugriff auf das darunterliegende System – in meinem Fall Ubuntu 10.04.

Zunächst muss der MySQL Server beendet werden.

$ sudo /etc/init.d/mysql stop

Als nächstes wird MySQL ohne Berechtigungssystem wieder gestartet .

$ sudo mysqld –skip-grant-tables &

Jetzt kann man sich als root ohne Passwort an MySQL anmelden …

$ mysql -u root

… und das Passwort „GEHEIM“ vergeben.

mysql> SET PASSWORD FOR ‚root’@’localhost‘ = PASSWORD(‚GEHEIM‚);
mysql> FLUSH PRIVILEGES;

Als alternative zum FLUSH PRIVILEGES beende ich lieber den Prozess und starte den Dienst neu.

Fertig!

MySQL Passwort ändern

Mir ist es schon oft passiert, dass ich ein Passwort für einen MySQL Benutzer vergessen habe. Hier sind 2 Möglichkeiten, ein Passwort unter MySQL zu ändern.

1. Mit dem MySQL Client und SET PASSWORD Befehl:

$ mysql -u root
mysql> SET PASSWORD FOR ‚benutzer‚@’localhost‘ = PASSWORD(‚GEHEIM‚);

2. Mit dem Programm mysqladmin:

$ mysqladmin -u benutzer password GEHEIM

Natürlich kann man auch GUIs wie z.B. MySQL Workbench oder phpMyAdmin verwenden, aber die hat man auf den wenigstens Produktiv Servern zur Verfügung.

MySQL System Error Codes nachschlagen

Die Fehlermeldungen von MySQL enthalten oft einen Fehlercode am Ende der Meldung. z.B.

ERROR 1 (HY000): Can't create/write to file '/tmp/xxxx' (Errcode: 13)

Es handelt sich hier um den Fehlercode des Systems (OS). Diesen kann man sich z.B. mit dem Befehl perror erklären lassen. Die Verwendung ist denkbar einfach – einfach den oder die gesuchten Fehlercodes als Parameter übergeben.

$ perror 13
OS error code 13: Permission denied

Der oben aufgeführte Fehler liegt also an mangelnden Schreibrechten auf das Verzeichnis /tmp/xxxx.

Kommt der Fehler von einem MySQL Cluster so muss man zusätzlich den Parameter –ndb anhängen.