MySQL (MariaDB): MySQL- Result in csv datei speichern

canju

Erfahrenes Mitglied
Hallo zusammen,

Ich versuche gerade eine SQL-Abfrage in eine csv Datei zu speichern. Ich habe allerdings probleme mit den Zugriffsrechten des Datenbankbenutzers. Dieser hat anscheinend keine File-Permission.

Wenn ich diese Abfrage ausführe:
SQL:
SELECT
    *  
FROM user

INTO OUTFILE '/path/to/output/test.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Kommt der Fehler SQL Fehler (105) Access denied for user 'XXX'@'%' ...

Der DB-User hat auf jeden fall alle rechte für alle Datenbanken auf diesem Server. Den Server "verwalte" ich über Plesk Onyx Version 17.8.11 Update #88.
Kann mit jemand bzgl. den Permissions (Gerne auch für das Speichern in eine csv Datei, falls hier optimierungsbedarf besteht) weiterhelfen?

Das Endziel soll sein, die erstellte Datei einmal täglich per Mail als Anhang zu versenden, wobei der Versenden-Part wahrscheinlich mit PHP erfolgen muss.
 
Und ich bezweifle, dass es Fehler 105 überhaupt bei MySQL gibt.....
AFAIK, sind die Fehler 4-stellig bei MySQL....

EDIT: Hab das hier gefunden:
https://www.itoctopus.com/mysqls-select-into-outfile-should-joomla-administrators-be-afraidder DB-User hat eben nicht gleichzeitig die File-Permissions auf dem drunter liegenden FileSystem.
Was auch irgendwie logisch ist.
Mein DB-User heisst z.B. "'FredFeuerstein'@'%'.
Dieser User ist aber auf dem drunter liegenden OS aber nicht als USer angelegt, und kann demzufolge auch keine Dateien erzeugen.
Mal davon abgesehen, dass die meisten MySQL-Server soweiso als "mysql:mysql" laufen, würde ich mal eher darauf als Lösung tippen, einen/den designierten Zielordner entweder mit "777" zu versehen, oder eben chown auf "mysql:mysql"
Hatte vom Prinzip dasselbe Problem auf meinem FreeBSD-Server mit dem Log-Verzeichnis von MySQL: Musste das Verzeichnis "/var/log/mysql" explizit "chown mysql:mysql" machen, weil "chmod 777 /Verzeichnis" dann irgendwann für einen Atomraketen-Start in Nordkorea verantwortlich gemacht werden kann........

EDIT2: Ähnlich:
https://www.tutorials.de/threads/mysql-mariadb-unerwuenschte-tabs-in-output.408155/
 
Zuletzt bearbeitet:
Hey @Zvoni ,

danke dir. Die Fehlernummer ist natürlich die 1045 (4 hat gehakt :))
"chown mysql:mysql" werde ich nacher mal auprobieren, um nicht für einen Raktenstart verantwortlich zu sein.

Derweil habe ich rausgefunden wie man dem Datenbankbenutzer über Plesk die FILE Permission geben kann.
Hierzu einfach auf den Datenbankbenutzer gehen und dann das häckchen bei "FILE" setzen. Das war die erste hürde.

Bis hierhin (erstmal mit 777) funktioniert folgendes, das UNION um den Spaltennamen mit auszugeben:

SQL:
SELECT
    'id' AS 'id',
FROM user

UNION

SELECT
    id
INTO OUTFILE '/tmp/test.csv'
FIELDS TERMINATED BY '|'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM user

Hast du eine Idee wie ich noch das aktuelle Datetime mit an den Dateinamen (INTO OUTFILE '/tmp/test.csv') anhängen kann?
 
Du meinst Dateinamen dynamisch erstellen nach Tagesdatum?
Autsch! Müsste ich selbst erst mal recherchieren.
 
So weit ich jetzt herausgefunden habe geht das nur indem ich die komplette Abfrage in eine SQL Variable setze, weil INTO OUTPUTFILE leider keine direkten SQL-Variabelen unterstützt. Muss ich mir also was andere einfallen lassen. Das wäre eine riesen Abfrage die aus mehreren UNIONs besteht. Daher eher nicht so schön.
 
Benutz doch eine Stored Procedure (optional mit IN-Parameter für den Dateinamen?).
Innerhalb der SP eben das Getöse mit den Variablen.
Schreibt man in dem Sinne einmal und gut ist.
Denk aber dran, falls du Datum und/oder Zeit benutzt, dass da unter Umständen unerlaubte (Trenn-) Zeichen für einen Dateinamen enthalten sein können. (Klassiker sind die Doppelpunkte bei Zeit oder Schrägstriche beim Datum)
 
Zurück