Foreign Keys in MySQL temporär deaktivieren

Eines der besten Funktionen die mit InnoDB Einzug bei MySQL gehalten haben, ist die Unterstützung von Fremd Schlüsseln (Foreign Keys). Doch diese tolle Funktion kann schnell nervig sein, wenn zum Beispiel Tabellen mit Fremdschlüsseln gelöscht oder geleert werden sollen. Auch das Einspielen von mehreren Datenzeilen zum Testen kann somit schnell nerven, wenn die Beziehungen nicht erfüllt sind.

Mit einem einfachen SQL Befehl kann man jedoch kurzzeitig die Fremdschlüsselüberprüfung ausschalten.

mysql> SET FOREIGN_KEY_CHECKS = 0;

Aktivieren lässt sich die Überprüfung mit

mysql> SET FOREIGN_KEY_CHECKS = 1;

Doch Vorsicht! Die Fremdschlüsselüberprüfung lässt sich nur wieder einschalten, wenn auch alle Einträge konform sind.

SVN Repository auf readonly setzen

In letzter Zeit bin ich dabei meine Projekte von Subversion auf Git umzuziehen. Nicht überall nehme ich dabei die Historie von Subversion mit. Diese Projekte halte ich quasi als Archiv weiterhin im Subversion vor. Um nun zu verhindern das ein Benutzer doch noch eine Änderung vornimmt muss das Repository auf reinen Lesezugriff beschränkt werden.

Wie so oft gibt es hier verschiedene Möglichkeiten. Meine Lieblingsmethode ist die Verwendung von Hooks.

Hierzu muss nur das Hook Script pre-commit editiert werden.

$ nano /pfad/zum/repository/hooks/pre-commit

Der Befehlt exit bricht dann den Commit mit einem „Fehler“ ab.

#!/bin/sh
echo "Keine Aenderungen moeglich! Bitte ab sofort Git verwenden!"
exit 1

Eine andere Variante ist die Verwendung der authz Datei. Hier genügt der folgende Eintrag um allen Benutzern nur einen Lesezugriff zu gewähren.

[repositoryname:/]
* = r

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.

MSSQL Datetime in MySQL Datetime konvertieren

In einem aktuellen Projekt erhalte ich Exporte aus einer MSSQL Datenbank. Diese wiederum sollen in eine MySQL Datenbank eingespielt werden. Mein Problem: Felder des Typs Datetime werden im Format 24.06.2013 07:26:20 geliefert, benötigt wird aber 2013-06-24 07:26:20.

Der MySQL CAST liefert leider keine gültigen Werte.

SELECT CAST( '24.06.2013 07:26:20' AS DATETIME);

Mit einem kleinen Umweg bekommt man es aber doch formatiert.

SELECT DATE_FORMAT( STR_TO_DATE('24.06.2013 07:26:20', '%d.%m.%Y %H:%i:%s'), '%Y-%m-%d %H:%i:%s' );

MySQL Server mit mytop überwachen

mytopVielen Linuxanwendern sind Befehle wie top oder htop ein gängiger Begriff. Auch für den Datenbankserver MySQL gibt ein top-ähnliches Überwachungstool – mytop. Dieses kleine Programm bietet dem Admin einen schnellen Überblick der derzeitigen Serverauslastung und Nutzung.

mytop findet sich in den Ubuntu Paketquellen und lässt sich wie folgt installieren.

$ sudo apt-get install mytop

Nach der Installation könnte ein Beispielaufruf so aussehen:

mytop -u BENUTZER -p PASSWORT -h HOST-d DATENBANK

Alternativ zu diesem Aufruf kann man sich auch die Parameter sparen und diese in der Konfigurationsdatei ~/.mytop ablegen.

user=BENUTZER
pass=PASSWORT
host=HOST
db=DATENBANK
delay=5
port=3306
batchmode=0
header=1
color=1
idle=1

Achtung! Das Speichern von Passwörtern im Klartext kann gefährlich sein! Man sollte sicher gehen das kein Dritter Zugriff auf die Datei ~/.mytop erlangen kann! Verwendung also auf eigene Gefahr!