Ich habe ein Skript, das versucht, einige Daten in MySQL mit LOAD DATA INFILE
zu laden. Aus irgendeinem Grund funktioniert es, wenn sich die Datei im Verzeichnis /tmp
befindet, aber nicht, wenn sich die Datei in einem anderen Verzeichnis mit identischen Berechtigungen befindet. Ich kann keine Möglichkeit finden, MySQL dazu zu bringen, Daten von außerhalb des Verzeichnisses /tmp
oder des Datenbankverzeichnisses zu importieren, aber ich kann im Handbuch nichts finden, das erklärt, warum dies der Fall ist.Welche Datei- und Verzeichnisberechtigungen sind für MySQL LOAD DATA INFILE erforderlich?
Die Situation:
$ ls -l/
...
drwxrwxrwt 21 root root 4096 2010-10-19 20:02 tmp
drwxrwxrwt 2 root root 4096 2010-10-19 20:14 tmp2
$ ls -l /tmp/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:02 /tmp/data.csv
$ ls -l /tmp2/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:14 /tmp2/data.csv
AFAICT diese sind identisch in den wichtigen Punkten. Wenn jedoch bei der MySQL-Kommandozeile I:
> LOAD DATA INFILE '/tmp2/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
ERROR 29 (HY000): File '/tmp2/data.csv' not found (Errcode: 13)
> LOAD DATA INFILE '/tmp/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
Query OK, 1 row affected, 1 warning (0.04 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
ich von Forenbeiträgen sammeln, die 13 zeigt eine Erlaubnis Problem errno. Es scheint, dass /tmp
speziell von MySQL behandelt wird, aber warum? Die nächste, die ich kommen kann, ist eine Zeile in der Bedienungsanleitung sagt:
Aus Sicherheitsgründen müssen beim Lesen Textdateien auf dem Server, die Dateien entweder im Datenbankverzeichnis befinden oder für alle lesbar sein.
/tmp
ist nicht im Datenbankverzeichnis, aber vielleicht wird es behandelt, als ob es ist. Also, wie sollte ich Dinge einrichten, damit es Dateien außerhalb von /tmp
lesen kann?
Was passiert, wenn Sie TMPDIR =/tmp2 vor dem Ausführen von mysql exportieren? –
Ich weiß nicht, wie man MySQL dazu bringt, Variablen aus meiner Umgebung zu verwenden, aber wenn ich den Wert von 'tmpdir' in der my.cnf ändere, hat dies keine Auswirkungen auf das Verhalten (tmp2 schlägt immer noch fehl, obwohl es jetzt die temp Verzeichnis) –
Das Temp Dir gespeichert meine Tag mit LOAD DATA INFILE –