Archiv der Kategorie ‘MySQL‘

 
 

Fehlerhafte Query bei MySQL Replikation überspringen

Replikationen können nur fehlerfrei arbeiten, wenn auch die zugreifenden Applikationen auf die Replikation abgestimmt sind. Ist das nicht der Fall wird die Replikation mit einem Fehler unterbrochen.

Mit der Anweisung SQL_SLAVE_SKIP_COUNTER hat man die Möglichkeit, die nächsten N Ereignisse auf dem Master zu überspringen. Anschließend muss der Slave-Thread neu gestartet werden.

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;

Wenn die Replikation nun wieder ohne Fehler läuft, sollte man die Konsistenz der Datenbankreplikation prüfen um evtl. Lücken aufzudecken.

Hinweis: Die Anweisung funktioniert nur, wenn der Slave-Thread nicht läuft.

Weitere Informationen zum Thema:
http://dev.mysql.com/doc/refman/5.1/de/set-global-sql-slave-skip-counter.html

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

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!