Piwik: „LOAD DATA INFILE“ aktivieren

Piwik hat in seinen (optionalen) Systemvoraussetzungen den Punkt „Datenbankfähigkeiten: LOAD DATA INFILE“ stehen, was bei mir partout nicht verfügbar sein wollte.
Nachdem ich mir den Mechanismus etwas genauer angeschaut hatte, war meine grösste Befürchtung, dass ich Probleme bekomme, weil Datenbank-Server und Webserver in diesem Fall getrennte Systeme (jeweils Debian Wheezy) sind. Das konnte aber schnell zerstreut werden, da der Befehl mit dem Zusatz LOCAL (also: LOAD DATA LOCAL INFILE) genau diesen Umstand berücksichtigt und von Piwik automatisch als Fallback verwendet wird, sobald der erste Versuch scheitert.

Dafür müssen nur ein Paar kleine Konfigurationen vorgenommen werden:

Auf dem System des Datenbank-Servers muss in der Konfigurations-Datei /etc/mysql/my.cnf in dem Block [mysqld] local-infile aktiviert sein:

[mysqld]
local-infile=1

Das gleiche gilt für den Client-Server, also unser Webserver, nur diesmal in dem Block [mysql]:

[mysql]
local-infile=1

Ausserdem muss man aufpassen, dass genügend (Lese?-)Rechte auf dem Verzeichnis bzw den Dateien liegen, die ausgelesen werden sollen. Das war bei meinem Setup gar kein Problem, da PHP als FCGI-Modul geladen wird – und zwar mit den Rechten des jeweiligen System-Users für die jeweilige Webpräsenz.

Ein Test im phpMyAdmin hatte auch gar kein Problem, eine Testdatei einzulesen – einzig Piwik hat sich geweigert und behauptet, dass meine MySQL-Version diesen Befehl nicht unterstützt!

Dafür musste ich die Konfigurations-Datei von Piwik piwik/config/config.ini.php bearbeiten und den MySQL-Adapter auf MYSQLI umstellen:

[database]
adapter=MYSQLI

Jetzt zeigt mir Piwik diesen Punkt mit einem grünen Häkchen als „unterstützt“ an :-)
Ob die Einstellung für meinen Server notwendig war, lässt sich bezweifeln, da diese Performance-Optimierung für sehr grosse Datenmengen vorgesehen ist – was bei mir derzeit nicht wirklich der Fall ist…

Value ‚0000-00-00′ can not be represented as java.sql.Date

Habe gestern das Problem gehabt, per Quantum DB in Eclipse auf eine MySQL-Datenbank zugreifen zu müssen, in der Date-Felder mit dem Wert ‚0000-00-00′ belegt waren, was anscheinend ein Problem für den MySQL-Connector darstellt. Der meldet sich dann nur noch mit dem Text aus der Überschrift und SQL State: S1009 und Error Code: 0 und verweigert die Ausgabe der Suchanfrage.

Die vorläufige Lösung für mich bestand darin, die Connection URL um den Parameter zeroDateTimeBehavior=convertToNull zu erweitern, sodass solche Datums-Werte in NULL umgewandelt werden, da ‚0000-00-00′ kein valides Datum ist.

Die Connection URL sieht dann etwa so aus:
jdbc:mysql://host:3306/database?zeroDateTimeBehavior=convertToNull

Das reicht mir aktuell, um damit weiterarbeiten zu können, da ich nur SELECTs auf die Datenbank absetzen muss. Wie sich diese Einstellung verhält, wenn man in die Datenbank schreibt, muss sich erst noch zeigen.

PostgreSQL: interval

Wir hatten hier gerade einen schönen AHA-Effekt mit einem Query, bei dem mit Zeit-Intervallen gerechnet wurde.

SELECT INTERVAL '600' SECOND;
Das sieht doch gar nicht soo falsch aus und liefert auch keinen SQL-Fehler zurück. Leider ist das Ergebnis nicht gerade richtig: das Intervall zeigt ’00:00:00′ an.

Richtig wäre es so:
SELECT INTERVAL '600 SECOND';
Und siehe da: das Intervall ist ’00:10:00′, sprich: 10 Minuten. Yay!

Benutzerdefinierte Variablen in MySQL

MySQL unterstützt Variablen anscheinend bereits seit Version 3.23.6, aber ich habe diese Möglichkeit (ausserhalb von Stored Procedures) erst vor ein paar Monaten zu Kenntnis genommen und erst gestern wirklich wahrgenommen.
Es gibt ja in der Tat immer wieder Fälle, in denen Variablen einem die Arbeit erheblich erleichtern würden.
„Benutzerdefinierte Variablen in MySQL“ weiterlesen