+++ d3Xt3r.org +++ d3Xters lab +++ d3Xter likes +++ d3Xters links +++
MySQL Duplicate entryBeim Einspielen eines mysqldumps aus einer funktionierenden Datenbank beliebiger Herkunft (es ist vollkommen egal ob die gedumpte Datenbank auf einem anderen Server unter einer anderen MySQL-Version läuft oder der Dump von der gleichen Maschiene bzw. sogar aus der identischen Datenbank stammt) kann es vorkommen das MySQL einen "Duplicate entry Error" ausspuckt.
ERROR 1062 (23000) at line 12345: Duplicate entry '4321' for key 'ABCD'
Eine Mögliche Ursache hierfür ist ein "0" Eintrag in einem auto_increment Feld, meist in der Zeile vor der gemeldeten.
CREATE TABLE abc (EINTRAEGE varchar(12) default NULL, ID integer NOT NULL auto_increment, PRIMARY KEY (ID))
...
...
...
INSERT INTO mww VALUES ('eintrag1',0);
INSERT INTO mww VALUES ('eintrag2',4321);
...
Ein auto_increment Feld, in unserem Beispiel ID, kann nicht mit dem Wert 0 befüllt werden. Aus irgendeinem Grund wird an Stelle des Wertes 0 der Inhalt der im Dump folgenden Zeile eingebaut anstatt, wie es richtig währe, eine Fehlermeldung zu werfen. Beim einfügen der folgenden Zeile wir nun versucht der gleiche, an dieser Stelle ja auch korrekte, Wert für ID einzufügen was natürlich zu der oben beschriebenen Fehlermeldung führt.
Wenn man nun trotzdem den Wert 0 in ID braucht so kann man im Dump die 0 durch einen Wert ersetzen der nicht für Spalte ID vorkommt.
...
INSERT INTO mww VALUES ('eintrag1',99999);
INSERT INTO mww VALUES ('eintrag2',4321);
...
Wenn das geschehen ist kann man den Dump einspielen. Zum Abschluß ersetzt man den geänderten Wert durch ein UPDATE-Statement wieder mit 0
UPDATE abc SET ID = 0 where ID = 99999;
Es macht Sinn dieses Vorgehen zu dokumentieren, damit beim nächsten Datenbankumzug nicht wieder die gleichen Probleme auftreten.
References:
mysql mysqldump Verzeichniss- und Dateiüberwachung mit inotifyMit inotify das seit Kernelversion 2.6.13 teil des Linuxkernels ist lassen sich auf einfache Weise Dateien und Verzeichnisse überwachen und bei Änerungen Aktionen anstoßen.
Es gibt verschiedene Möglichkeiten inotify zu nutzen, unter anderem bieten Perl, Python und PHP module mit denen sich der Dienst ansprechen läßt.
Um ihn von der Shell aus zu nutzen intallieren wir inotify-tools von Rohan McGovern.
Bei den meisten große Distributionen sollte inotify-tools inzwischen in den Repositorys enthalten sein, so das zur Installation der normale Packetmanager verwendet werden kann und somit ein einfaches
apt-get install inotify-tools
im Falle von z.B. Debian reichen sollte.
Sollten die inotify-tools in den Repositorys nicht vorhanden sein, so kann man sich die Sources von
http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz herunterladen und selber mit
./configure --prefix=/usr && make && su -c 'make install'
kompilieren und installieren.
Nun können wir inotifywait aus den inotify-tools nutzen um Verzeichnisse zu überwachen. Um das Ganze zu testen richten wir eine überwachung für /mein/ueberwachtes/verzeichniss auf der Kommandozeile ein und benutzen dabei die Option -r um rekursiv alle Unterverzeichnisse mit zu überwachen.
inotifywait -r /mein/ueberwachtes/verzeichniss
Der Befehl meldet sich zurück mit
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
Wenn wir jetzt mit
touch /mein/ueberwachtes/verzeichniss/inottest
eine Datei anlegen bekommen wir die Rückmeldung
/mein/ueberwachtes/verzeichniss/ CREATE inottest
und inotifywait beendet sich.
Um mehrere Ereignisse monitoren zu können müssen wir inotifywait im monitoring-Modus laufen lassen, hierzu ergänzen wir unseren aufruf mit der Option -m
inotifywait -r -m /mein/ueberwachtes/verzeichniss
Wenn wir jetzt innerhalb des Verzeichnisses Dateien oder Unterverzeichnisse anlegen, oder Dateien öffnen bekommen wir jedes mal ein Ereigniss gemeldet und inotifywait beendet sich nicht.
Die Ereignissmeldungen haben Standardmäßig die Syntax
<pfad/zur/datei/> <EREIGNISS> <datei>
Es lohnt sich, hiermit mal ein bischen herumzuspielen, man wundert sich wieviele Ereignisse beim simplen Anlegen einer Datei mit vi gemeldet werden.
Standardmäßig hört inotifywait auf alle überwachbaren Ereignisse, man kann jedoch durch die Benutzung der Option -e eingrenzen welche Ereignisse überwacht werden sollen. Eine genaue Beschreibung dieser Ereignisse findet sich unter
http://linux.die.net/man/1/inotifywait im Abschnitt Events, wir werden der einfachheit halber für unser Beispiel nur das Ereigniss create (erstellen einer Datei oder eines Verzeichnisses) nutzen.
Um nun /mein/ueberwachtes/verzeichniss/ zu überwachen und beim erstellen einer Datei oder eines Verzeichnisses eine Aktion auszulösen brauchen wir nut ein kleines Shellscript
#!/bin/bash
inotifywait -m -e create /mein/ueberwachtes/verzeichniss/ | while read notify; do
/mein/aktions/script "notify"
done
In diesem Script führen wir jedes mal wenn inotifywait ein Ereigniss liefert die Datei /mein/aktions/script aus und übergeben dabei in der Variabelen $notify das von inotifywait ausgegebene Ereigniss.
/mein/aktions/script kann nun den übergebenen String zerlegen und auf die von dem Ereigniss betroffene Datei oder das Verzeichniss eine Aktion ausführen.
Der übergebene String hat die Form
<pfad/zur/datei/> <EREIGNISS> <datei>
Als Aktion kann man z.B. die Dateien in ein anderes Verzeichniss wegkopieren und somit eine Sicherungskopie aller neuen Dateien in dem überwachten Verzeichniss erstellen, oder bei Veränderungen in sensibelen Dateibäume z.B. /etc eine mail an einen Administrator absetzen und somit eine sehr grundlegende Intrusion Detection aufsetzen.
References:
artikel inotify linux
+++ d3Xt3r.org +++ d3Xters lab +++ d3Xter likes +++ d3Xters links +++