Logging von Userconnections

MySQL bringt von Haus aus keine Loggingfunktion für Userconnections mit, mit einigen wenigen Schritten läßt sich diese Funktion allerdings sehr einfach nachbilden. Grundsätzlich besteht auch die Möglichkeit in eine Datei zu loggen, im folgenden wird aber die, meiner Meinung nach, elegantere Möglichkeit des Loggings in eine Datenbanktabelle beschrieben.
Als erstes braucht man natürlich eine Datenbank und eine Tabelle in die man loggt. Die Datenbank (in diesem Beispiel „admin“) erstellt man mit:

CREATE DATABASE admin;

Als nächstes erzeugt man die Tabelle in die geloggt werden soll:

CREATE TABLE `userlog` ( 
 `user` VARCHAR(50) NOT NULL,
 `connections` INT(10) UNSIGNED NOT NULL DEFAULT '0',
 `last` DATETIME NOT NULL,
 PRIMARY KEY (`user`) )

Nun wird die Variabele init_connect gesetzt. Diese Variabele enthält eine Abfrage die bei jeder neuen Verbindung ausgeführt wird.

SET GLOBAL init_connect = " INSERT INTO admin.userlog
 (`user`, `connections`, `last`)
 VALUES (CURRENT_USER(), 1, NOW())
 ON DUPLICATE KEY UPDATE `connections`=`connections`+1, lastconnect=NOW();"

Auf diese Weise wird mitgeloggt, welcher User sich wie oft und wann zuletzt angemeldet hat.

Natürlich kann ich auch jeder einzelnen Loginvorgang mit Loginzeitpunkt geloggt werden, dieses kann aber zu einem Recht hohen Datenaufkommen führen. Hierfür wird die Tabelle mit eine leicht anderen Struktur angelegt:

CREATE TABLE `userlog` ( 
 `user` VARCHAR(50) NOT NULL,
 `time` DATETIME NOT NULL)

Und die Variabele mit folgender Abfrage gefüllt:

SET GLOBAL init_connect = " INSERT INTO admin.userlog
 (`user`, `time`)
 VALUES (CURRENT_USER(), NOW())"

Für die erste Lösung muß jeder User SELECT-, INSERT- und UPDATE-Rechte auf die Tabelle admin.userlog gewährt bekommen, für die zweite Lösung reichen INSERT-Rechte.
Ein SET GLOBAL ist immer nur bis zum nächsten Neustart des Datenbankprozesses gültig, daher sollte man die Variabele init_connect in die my.cnf datei eintragen.