2010-10-19 5 views
7

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?

+0

Was passiert, wenn Sie TMPDIR =/tmp2 vor dem Ausführen von mysql exportieren? –

+0

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) –

+0

Das Temp Dir gespeichert meine Tag mit LOAD DATA INFILE –

Antwort

1

Errno 13 ist möglicherweise auf SELinux zurückzuführen, falls Sie eine Linux-Server-Distribution verwenden (z. B. RedHat Enterprise Linux oder CentOS). Überprüfen Sie 'audit.log', um zu sehen, ob SELinux sich über Ihren /tmp2 Pfad beschwert. Sie können dann Ihren Pfad über semanage fcontext -a -t mysqld_db_t "/tmp2(/.*)?" hinzufügen und restorecon -R /tmp2 ausführen.

Allerdings könnte die Lösung viel einfacher sein, und ich hätte direkt unter Ihre Frage (anstelle der Bereitstellung einer Antwort), wenn ich nur wüsste, wie ..

+0

Für was es wert ist, verwende ich Ubuntu 10.04 Desktop Edition, mit MySQL von Ubuntu-Pakete installiert. –

+0

Okay, also ist SELinux nicht das Problem dort. Haben Sie versucht LOAD DATA LOCAL INFILE ...? Gibt es das gleiche Ergebnis? – Joachim

16
mysqlimport --local <database> <infile> 

ODER

LOAD DATA LOCAL INFILE... should fix the issue. 
+1

+1 ohne lokale wird im Rahmen des Serverprozesses aufgelöst - so können Sie Daten vom Client und vom Server laden – Unreason

2
antwortete

Ich habe ein ähnliches Problem (nicht in der Lage, eine Datei in /tmp lesen) und Hinzufügen von LOCAL nach LOAD DATA INFILE das Problem behoben.

Diese Launchpad bug report könnte einige Erklärungen haben, warum dies geschieht.

1

Errcode 13 bedeutet fehlende Berechtigungen (im Gegensatz zu Errcode 2, was bedeutet, dass die Datei nicht existiert). MySQL benötigt die Datei, damit sie von jedem gelesen werden kann. Die Berechtigungen Ihrer Dateien sind in Ordnung.

Wir hatten einmal das gleiche Problem auf einem CentOS-Server und es wurde von AppArmor verursacht, die die MySQL-Anwendung verboten den Zugriff auf Dateien nicht in einer weißen Liste in /etc/apparmor.d/usr aufgeführt werden. Sbin. mysqld. Vielleicht haben Sie eine Art Sicherheitsanzug, der ein ähnliches Verhalten verursacht?

Wie bereits erwähnt, kann die Verwendung von LOAD DATA INFILE LOCAL eine Umgehungslösung sein.

Verwandte Themen