v1.11.1: LOAD DATA INFILE (Datenbankfähigkeit für Archivierung)

Hallo,
bei der Systemprüfung gibt Piwik-1.11.1 folgenden Fehler aus:
[quote="LOAD DATA INFILE
Die Benutzung von LOAD DATA INFILE erhöht die Geschwindigkeit des Piwik Archivierungsprozesses erheblich. Um dies für Piwik verfügbar zu machen setzen Sie bitte eine neuere PHP & MySQL Software ein und stellen Sie sicher, dass der gewählte Datenbankbenutzer das FILE Recht besitzt. Falls Ihr Piwik Server Webseiten mit erhöhtem Verkehrsaufkommen (z.B.: > 100.000 Seiten pro Monat) verarbeiten muss empfehlen wir dieses Problem zu beheben.

Fehler:
Try #1: LOAD DATA INFILE : SQLSTATE[28000]: Invalid authorization specification: 1045 Access denied for user ‘db1085127-piwik’@‘localhost’ (using password: YES)[28000],
Try #2: LOAD DATA LOCAL INFILE : SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version[42000]"][/quote]

Nach Rücksprache mit dem Hoster (HostEurope) scheint der notwendige Verbindungsparameter “–local-infile=1” von Piwik nicht gesetzt zu werden, der LOAD DATA LOCAL INFILE ermöglicht.
PHP (5.3.21) und MySQL (5.5.30-1) sind wohl ausreichend aktuell.

Wie verwaltet Piwik die Datenbank intern, wie/wo läßt sich dieser Parameter setzen?

Der Parameter muss vom Hoster für MySQL gesetzt werden. Piwik kann dies nicht machen, das ist Serverkonfiguration.

So, wie das seitens des HE-Suppoorts geklungen hat, gibt es zwei Wege, die mPiwik auch testet:

Try #1: LOAD DATA INFILE
Try #2: LOAD DATA LOCAL INFILE :

Der zweite, LOAD DATA LOCAL FILE, soll angeblich auch mit den genannten Start-Parametern ohne Zutun des Hosters funktionieren!?

[quote=“Thomas Seifert”]
Der Parameter muss vom Hoster für MySQL gesetzt werden. Piwik kann dies nicht machen, das ist Serverkonfiguration.[/quote]

Erst einmal guten Tag alle zusammen.

Ich habe das gleiche Problem nach einem Umzug auf einen neuen Server. Da ich einen großen Server mit 500 GB Speicherplatz angemietet habe, kann ich sehr viele Einstellungen des Servers selbst vornehmen. Nun suche ich seit 4 Wochen nach einer Antwort, wie dieses Problem zu lösen ist.

Ist es denn so schwer, eine eindeutige Antwort darauf zu geben?

Was muss wo in der Serverkonfiguration für ein Parameter gesetzt werden? Wie heißt dieser Parameter?

Ich kann z.B. save-mod oder mod-rewrite, perl usw. so wie etwa 30 weitere Parameter ein oder ausschalten. Wüsste ich, welcher Parameter, bzw. welche Konfigurationseinstellung verändert werden muss, so könnte ich das wahrscheinlich selbst machen, oder dem Hoster genau sagen, was er verändern muss.

Es wäre sehr freundlich, wenn jemand von euch Spezialisten dieses anscheinend bestgehütete Geheimnis preisgeben würde.

  • Der Piwik-Datenbank-User muss das Recht “FILE” besitzen
  • Das piwik/tmp Verzeichnis muss für mysql lesbar sein
  • in der /etc/my.cnf oder /etc/mysql/my.cnf auf dem Server muss unter [mysqld] der parameter local-infile=1 gesetzt sein.

@Peter:

Habe das gleiche Problem bei einem meiner Server - alles ist so eingestellt wie du sagst, aber es funktioniert nicht :frowning:
Mehr Info zu meiner Installation habe ich bereits in einem anderen Post geschrieben: 301 Moved Permanently

Das Dingen scheint’s in sich zu haben. Nun bin ich auf meinem Server root und darf alles, aber so ganz ausgegoren scheint die Geschichte nicht zu sein.

Das File-Recht wird vom MySQL-Administrator per SQL vergeben:

grant file on . to DB_USER@’%’;

Nun bekomme ich einen neuen Fehler:

LOAD DATA INFILE : SQLSTATE[HY000]: General error: 13 Can’t get stat of ‘/var/www/virtual/shopnix.de/htdocs/piwik/tmp/assets/p_option-778d25e0bb39e66e5a17f4c86bd7a2c9.csv’ (Errcode: 13)

Wobei der Fehlercode 13 fehlende Rechte bedeutet, das File aber rw für alle hat.

Nun könnte ich zwar dem MySQL-Dämon alle möglichen Rechte geben, aber das will ich eigentlich nicht, weil ich damit das Rechtesystem ausheble, über das sich Klügere als ich Gedanken gemacht haben.

Der Parameter in /etc/mysql/my.cnf ändert daran übrigens nichts.

Hi,

das mit der LOAD DATA INFILE Fehlermeldung ist definitiv ein Bug, ich weiß nur nicht wer dafür verantwortlich ist , Apache , Piwik, MySQL???

denn piwik interessiert sich nicht die Bohne dafür welche Setgid auf den /root/piwik root ordner oder /root/piwik/tmp gesetzt wurde und erstellt im Ordner /root/piwik/tmp/assets bei jedem Aufruf von

index.php?module=Installation&action=systemCheckPage&idSite=1&period=range&date=last30

stur .csv dateien als www-data.www-data bzw als der User/Gruppe die in /etc/apache2/envvars unter
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
angelegt ist.

Ich habe alle Änderungen wie hier beschrieben vorgenommen:
http://forum.piwik.org/read.php?5,102235,page=1#msg-102841

Probiert es aus.

  1. den mysql user einer fiktiven gruppe piwik zuordnen
  2. den apache user ebenfalls der gruppe piwik zuordnen
  3. sudo chown -R www-data.piwik /root/piwik && sudo chmod -R 0775 /root/piwik/tmp
  4. sudo chmod -R 0775 /root/piwik/tmp/tcpdf/ && sudo chmod -R 0775 /root/piwik/tmp/assets/ && sudo chmod -R 0775 /root/piwik/tmp/cache/ && sudo chmod -R 0775 /root/piwik/tmp/templates_c/
  5. apache und mysql server restart
  6. die Dateien in sudo chmod -R 0775 /root/piwik/tmp werden weiter als www.data.www-data angelegft, folglich für den mysql user nicht lesbar, der ja in der Gruppe piwik steckt.

Fügt man den mysql user der Gruppe www-data hinzu geht es plötzlich und die Fehlermeldung verschwindet. ABER das ist sicherheitstechnisch der Supergau deshalb ein absolutes NoGo da der mysql user sonst auf alle apache verzeichnisse Zugriff hätte.

Ändert man die Datei /etc/apache2/envvars in z.B.

export APACHE_RUN_GROUP=piwik

UND nimmt vorher den mysql user aus der gruppe www-data, und ruft dann wieder die Systemprüfung auf wird im Verzeichnis
/var/www/piwik/tmp/assets wieder eine .csv datei angelegt mit den nutzerrechten www-data.piwik wie es in der envvars datei steht und die Fehlermeldung kommt wieder.

Verstehe ich das falsch oder setzt man das Setgid per 0775 doch eigentlich damit die Benutzerrechte des übergeordnenten Ordner (in diesem Fall /root/piwik in die darunter liegenden übernommen werden und eben nicht aus der envvars ausgelesen werden?

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

Wenn ihr in eurer Umgebung die Variable open_basedir verwenden wollt (dann könnt ihr kein LOCAL verwenden;)) empfehle ich euch diesen Post durchzulesen. Dort habe ich auch den SQL Befehl ohne LOCAL zum Laufen bekommen. Aber bitte daran denken: Dann müssen SQL Server und PHP auf dem gleichen Server liegen - auf jeden Fall die gleiche Ordnerstruktur aufweisen: 301 Moved Permanently

Allgemeine Lösung für das Problemchen (da ich über Google hier gelandet bin):

  1. In der my.cnf von MySQL (/etc/mysql) muss im Abschnitt [mysqld] und [mysql] der Wert local-infile=1 gesetzt werden.
  2. In der Datenbank mysql muss in der Tabelle user für den entsprechenden Piwik-Benutzer das FILE-Privileg auf YES gesetzt werden (Plesk-Benutzer gehen hier über die Server-Einstellungen auf die phpMyAdmin-Oberfläche).
  3. Im Anschluss muss mysql bspw. per service mysql restart neu gestartet werden (vergessen viele).

Das funktioniert unabhängig einer Open-BaseDir-Restriktion und hat auch wenig mit der MySQL-Version zu tun (ich nutze noch verschiedene 5.3.x Versionen und habe keine Probleme damit).

Hallo,

ich verstehe den Punkt 2 leider nicht.

[quote=“2. In der Datenbank mysql muss in der Tabelle user für den entsprechenden Piwik-Benutzer das FILE-Privileg auf YES gesetzt werden (Plesk-Benutzer gehen hier über die Server-Einstellungen auf die phpMyAdmin-Oberfläche).”][/quote]

In der Tabelle user ist bei mir nur der Benutzer “anonymous” gelistet und bei dem gibt es auch keine Spalte “FILE-Privileg”.

Ich würde mich sehr freuen, wenn mir da jemand weiterhelfen könnte.
Vorab vielen Dank.

Bist Du sicher, dass Du in der richtigen Datenbank bist?

Im Zweifelsfall gibst Du als Tabelle den vollständigen Namen inkl. DB-Name an, also mysql.user

Hallo,

ich bin in der Piwik Datenbank und da gibt es folgende Tabellen:

  • user
  • user_dashboard
  • user_language

In der Tabelle user gibt es nur eine Zeile für den user anonymous.
Nach einem Serverwechsel und einem damit verbunden Wechsel auf eine aktuellere php Version hatte ich ein Update von Piwik 1.12 auf 2.02 ausgeführt.

Kann es sein, dass ich in der Tabelle keinen weiteren Benutzer finde, weil ich bisher immer nur den admin account verwendet habe?
Wenn dem so ist, verstehe ich nicht, warum dieser nicht auch in der Tabelle user aufgeführt ist.

Unabhängig davon finde ich grundsätzlich die Stelle nicht, wo man das FILE-Privileg ändern kann. Ist das keine eigene Tabellenspalte?

Eben. :wink:

Das File_priv steht in der Datenbank mysql, wo unter anderem die Benutzerrechte liegen.

Hier mal ein Ausschnitt:


+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |


Oha, jetzt stehe ich aber völlig auf dem Schlauch. :S

Wie komme ich den dahin?

Ich bin über Plesk in phpMyAdmin unterwegs und habe die piwik Datenbank auf. Ich nehme mal an, da bin ich falsch, oder?

Ich vermute Du hast keine Rechte dies zu ändern und wirst Deinen Hoster kontaktieren müssen.
Verwaltest Du Deinen eigenen Server?

Hallo,

ich habe einen neuen V-Server bei Host Europe und vollen Root-Zugriff.
Im Moment gehe ich eigentlich nur davon aus, dass ich nicht nachvollziehen kann, wo Du da gerade unterwegs bist und wie man dahin kommt.

… und es ist mir echt peinlich.

Kannst Du im phpMyAdmin von Plesk nicht die Datenbanken wechseln? In der linken Spalte?

Wenn Du vollen root Zugriff hast, versuchs mal über den nativen MySQL-Client. Einfach über die Befehlszeile:

mysql -uroot -pPASSWORD mysql

Sei aber vorsichtig bei Änderungen, die Datenbank mysql ist sozusagen Teil der MySQL-Serverkonfiguration. Wenn Dir das Recht fehlt, verwendest Du besser das grant-Statement um die Rechte zu gewähren.