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

@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.

Also, ich wähle in Plesk die Domain aus, wechsle dann zu Datenbanken und klicke in der Zerile der Piwik-Datenbank auf Webadmin.
Es öffnet sich phpMyAdmin im Reiter “Struktur” und ich sehe die Tabellen von “access” bis “user_language”.

Links kann ich dann entweder eine der Tabellen auswählen, oder auf den link “Startseite” klicken.
Da dem User mit dem ich über Plesk in phpMyAdmin unterwegs bin nur eine Datenbank zugeordnet ist, kann ich nicht in eine andere wechseln.

Per SSH möchte ich eigentlich sehr ungern die Änderung vornehmen, weil mir für den Umgang mit der Konsole die Routine und das know-how fehlt.

Es wird Dir vermutlich nichts anderes übrig bleiben, als Dir das nötige KnowHow anzueignen. Es gehört nun mal dazu, wenn man einen Root-Server betreiben will.

Das Kommando, das ich Dir nannte, macht nichts weiter, als den native MySQL-Client zu öffnen. Wenn Du dort nur abfragst, kann Dir nichts passieren.

Offensichtlich ist mir unklar, welches Passwort gemeint ist.

Ich hatte mir mal notiert, dass ich das generelle mysql-Passwort in /etc/psa/.psa.shadow finde. Damit erhalte ich jedoch ein Access denied.
Auch mit dem Passwort und dem Benutzernamen für die Piwik-Datenbank erhalte ich keinen Zugang.

Wo finde ich denn das Root-Passwort mit dem ich da weiterkomme?

Ich komme mir mal wieder vor, wie der größte DAU.

Don’t panic. :wink:

MySQL hat ein eigenes root-Passwort. Wenn Du es verloren hast, kommst Du nur wieder dran, wenn Du den Server mit der entsprechenden Option neu startest.

Die Kommandozeile dazu müsstest Du Dir im Netz suchen.

Also nicht aufgeben, aller Anfang ist schwer. :wink:

Aufgeben ist nicht meine Art :wink:

Ich habe soeben mal bei Host Europe angerufen.
Mein fehler war wohl, dass ich direkt über den User der Piwik-Datenbank in phpMyAdmin gewechselt bin.

Der korrekte weg um Änderungen an den Userrechten vorzunehmen ist in Plesk (11.5.30) wie folgt:

Unter Serververwaltung in Tools & Einstellungen wechseln und dann unter Applikationen & Datenbanken auf Datenbankserver klicken.
Dann beim MYSQL am Ende der Zeile auf den Schraubenschlüssel (Webadmin) klicken.

Links kann ich dann mysql anwählen und dann ist da auch die gesuchte Tabelle user, in der auch der user der Piwik-Datenbank aufgeführt ist.
Denn kann man dann auswählen und bearbeiten, dann in der Zeile File_priv von N auf Y ändern und anschließend die Änderung mit einem klick auf OK speichern.

Wie auch immer, trotz der Änderung und einem anschließenden Neustart des MYSQL-Servers erhalte ich in Piwik unter Systemprüfung nach wie vor folgende Fehlermeldung:

Fehler: 
Try #1: LOAD DATA INFILE : SQLSTATE[HY000]: General error: 13 Can't get stat of '/var/www/vhosts/meine_domain.de/httpdocs/piwik/tmp/assets/option-ed07c762806474278d028479704c36bb.csv' (Errcode: 13)

Hab’ ich noch was vergessen?