Ich habe jetzt noch mal etwas weiter gesucht, weil es in meinem Fall mit Sicherheit nichts mit Rechten zu tun hat.
Die Datei wird immer mit 0777 angelegt …
In einem anderen Forum habe ich gelesen, dass es sein kann, dass die Ordner, auf die MySQL zugreifen darf, durch eine dritte Software beschränkt werden können. In meinem Fall (Ubuntu 10.04) war es AppAmor (security - MySQL LOAD DATA INFILE user privilege settings - Server Fault). Dies ist nur wichtig, wenn der MySQL Server die Datei lesen soll.
Bei mir hat es, nach weiterem Testen, keine Änderung gebracht. Es hilft aber vielleicht jemandem das zu wissen…
Das Schlüsselwort “LOCAL” im zweiten SQL Befehl besagt, dass der MySQL Client diese Datei lesen soll statt dem Server.
Im Code sah ich, dass das Schlüsselwort “LOCAL” zum SQL Befehl hinzugefügt wird, wenn “open_basedir” und “safe_mode” deaktiviert sind. Die MySQL Funktion “local-infile” scheint bei gesetztem “open_basedir” echt komplett deaktiviert zu sein … (PHP :: Bug #55737 :: LOAD DATA LOCAL INFILE - The used command is not allowed with this MySQL versio) Der SafeMode ist auch sehr restrictiv, was das angeht. Ich könnte mir gut vorstellen, dass es dort genauso ist.
Um das Schlüsselwort LOCAL im SQL Statement zum funktionieren zu bekommen, muss der MySQL Server und der MySQL Client die Option “local-infile” aktiviert haben. Den Server kann man einfach in PhpMyAdmin nachsehen - beim Client wird’s schwieriger (MySQL PHP configuration does not allow LOAD DATA LOCAL INFILE - Server Fault). Auf der Kommandozeile ist das noch recht einfach - aber im PHP Code nicht.
In der Kommandozeile habe ich es bereits zum Funktionieren gebracht und habe mich gefragt “was nun”?
Nach weiterem Suchen fand ich heraus, dass meine Installation über den Treiber “PDO MySQL” läuft. Im Code von Piwik gab es den Hinweis:
/*
* Second attempt: using the LOCAL keyword means the client reads the file and sends it to the server;
* the LOCAL keyword may trigger a known PHP PDO_MYSQL bug when MySQL not built with --enable-local-infile
* @see http://bugs.php.net/bug.php?id=54158
*/
Nachdem ich dies las, setzte ich die folgende Einstellung in meiner Piwik Konfiguration:
adapter = MYSQLI
Jetzt funktioniert es.
Wenn jemand dafür eine Lösung hat, bei der es auch ohne das Schlüsselwort “LOCAL” funktioniert, bitte hier posten.
Zusammenfassung:
Aus irgendeinem Grunde funktioniert bei mir das SQL Statement nicht, wenn das Schlüsselwort “LOCAL” nicht enthalten ist.
Dieses Schlüsselwort wird nur hinzugefügt, wenn die PHP-Einstellungen “open_basedir” und “safe_mode” deaktiviert sind (nicht gesetzt oder leer). Warum das so gemacht wird ist eine Liste von Gründen, siehe oben.
Wenn das System den MySQL-Treiber PDO verwendet, gibt es einen bekannten Bug. Um diesen zu umgehen kannst du zu dem Treiber MySQLi wechseln.
English summary:
http://forum.piwik.org/read.php?2,101809,106306#msg-106306