Frage

Ich versuche, den Inhalt einer Tabelle in eine CSV-Datei mit einer MySQL SELECT INTO OUTFILE Anweisung dump. Wenn ich das tue:

SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

outfile.csv wird auf dem Server im selben Verzeichnis dieser Datenbank der Dateien in gespeichert erstellt werden.

Allerdings, wenn ich meine Abfrage zu ändern:

SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

ich:

ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)

Fehlermeldung Errcode 13 ist ein Berechtigungsfehler, aber ich habe es, auch wenn ich den Besitzer wechselt von / Daten zu mysql: mysql und gibt ihm 777 Berechtigungen. MySQL läuft als Benutzer "mysql".

Seltsamer kann ich die Datei in / tmp erstellen, einfach nicht in einem anderen Verzeichnis Ich habe versucht, auch mit Berechtigungen so eingestellt, dass Benutzer mysql Lage sein sollte, in das Verzeichnis zu schreiben.

Dies ist MySQL 5.0.75 läuft auf Ubuntu.

War es hilfreich?

Lösung

Welche spezielle Version von Ubuntu ist dies und das ist Ubuntu Server Edition?

Neue Ubuntu Server Edition (wie 10,04) Schiff mit AppArmor und MySQL Profil könnte Modus bei der Durchsetzung sein standardmäßig. Sie können dies überprüfen, indem sudo aa-status Ausführung wie folgt:

# sudo aa-status
5 profiles are loaded.
5 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /sbin/dhclient3
   /usr/sbin/tcpdump
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/sbin/mysqld
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/mysqld (1089)
0 processes are in complain mode.

Wenn mysqld in erzwingen-Modus enthalten ist, dann ist es das man wohl die Schreib leugnen. Einträge würden auch in /var/log/messages geschrieben werden, wenn AppArmor blockiert die Schreibvorgänge / zugreift. Was können Sie tun, ist bearbeiten /etc/apparmor.d/usr.sbin.mysqld und Add /data/ und /data/* nahe der Unterseite wie folgt:

...  
/usr/sbin/mysqld  {  
    ...  
    /var/log/mysql/ r,  
    /var/log/mysql/* rw,  
    /var/run/mysqld/mysqld.pid w,  
    /var/run/mysqld/mysqld.sock w,  
    **/data/ r,  
    /data/* rw,**  
}

Und dann machen AppArmor die Profile neu zu laden.

# sudo /etc/init.d/apparmor reload

ACHTUNG: die Änderung oben ermöglicht MySQL in das Verzeichnis / Data-Verzeichnis zu lesen und zu schreiben. Wir hoffen, Sie haben bereits die Auswirkungen auf die Sicherheit dieser berücksichtigt.

Andere Tipps

Ubuntu nutzt AppArmor und das ist was Sie den Zugriff auf / Daten zu verhindern /. Fedora nutzt SELinux und das würde dies auf einer RHEL / Fedora / CentOS Maschine verhindern.

AppArmor ändern MySQL-Zugriff / Daten zu ermöglichen / zu tun, die folgen:

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

Fügen Sie diese Zeile irgendwo in der Liste der Verzeichnisse:

/data/ rw,

dann ein:

sudo /etc/init.d/apparmor restart

Eine weitere Möglichkeit ist disable AppArmor für mysql zusammen, das ist ABGERATEN :

sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

Vergessen Sie nicht, AppArmor neu zu starten:

sudo /etc/init.d/apparmor restart

Ich weiß, Sie sagten, dass Sie bereits versucht, Berechtigungen auf 777 einstellen, aber wie ich einen Beweis für mich, dass es ein Berechtigungsproblem war Ich poste, was ich genau laufen gehofft, dass es helfen kann. Hier ist meine Erfahrung:

tmp $ pwd
/Users/username/tmp
tmp $ mkdir bkptest
tmp $ mysqldump -u root -T bkptest bkptest
mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
tmp $ chmod a+rwx bkptest/
tmp $ mysqldump -u root -T bkptest bkptest
tmp $ ls bkptest/
people.sql  people.txt
tmp $ 

MySQL bekommt hier dumm. Es wird versucht, Dateien zu erstellen, unter / tmp / data / .... Also, was Sie tun können, ist die folgende:

mkdir /tmp/data
mount --bind /data /tmp/data

Dann versuchen Sie Ihre Anfrage. Dieser arbeitete für mich nach Stunden Debuggen der Ausgabe.

Dieses Problem wurde stört mich für eine lange Zeit. Ich bemerkte, dass diese Diskussion darauf hin, nicht die Lösung auf RHEL / Fecora. Ich bin mit RHEL und ich finde nicht die Konfigurationsdateien AppArmer auf Ubuntu entsprechen, aber ich mein Problem gelöst, indem jedes Verzeichnis im Verzeichnispfad lesbar und zugänglich durch mysql machen. Zum Beispiel, wenn Sie ein Verzeichnis / tmp erstellen, werden die folgenden zwei Befehle machen SELECT INTO OUTFILE zur Ausgabe der Lage, die .sql UND SQL-Datei

chown mysql:mysql /tmp
chmod a+rx /tmp

Wenn Sie ein Verzeichnis in Ihrem Home-Verzeichnis / home / tom erstellen, müssen Sie dies sowohl für tun / home und / home / tom.

Sie können dies tun:

mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml

Einige Dinge versuchen:

  • die secure_file_priv Systemvariable gesetzt? Wenn ja, müssen alle Dateien in das Verzeichnis geschrieben werden.
  • sicherzustellen, dass die Datei nicht existiert -. MySQL wird nur neue Dateien erstellen, nicht überschreiben bestehende

Ich habe gleiches Problem und ich festgelegt dieses Problem durch folgende Schritte an:

  • Betriebssystem: Ubuntu 12.04
  • Lampe installiert
  • Angenommen, Ihr Verzeichnis zu speichern Ausgabedatei ist: / var / www / csv /

Führen Sie folgenden Befehl auf Terminal und bearbeiten diese Datei mit gedit Editor Ihrem Verzeichnis Ausgabedatei hinzuzufügen.

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

  • Jetzt würde Datei im Editor geöffnet werden fügen Sie bitte Ihr Verzeichnis dort

    / var / www / csv / * rw,

  • ebenfalls habe ich in meiner Datei, wie folgt festgelegt Bild hinzugefügt:

nächsten Befehl zum Neustart Dienst ausführen:

sudo /etc/init.d/apparmor Neustart

Zum Beispiel habe ich folgende Abfrage in phpMyAdmin Query Builder zur Ausgabe von Daten in CSV-Datei ausführen

SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;

Es erfolgreich getan und schreibt alle Zeilen mit ausgewählten Spalten in output.csv Datei ...

In meinem Fall war die Lösung jedes Verzeichnis im Verzeichnispfad lesbar und zugänglich durch mysql (chmod a+rx) zu machen. Das Verzeichnis wurde noch durch seinen relativen Pfad in der Befehlszeile angegeben.

chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.

Ich lief in das gleiche Problem. Mein Problem war das Verzeichnis, dass ich versuche, in dump keine Schreibberechtigung für den mysqld-Prozess hatte. Der ursprüngliche SQL-Dump schreiben würde, aber das Schreiben der CSV / TXT-Datei fehlschlagen würde. Sieht aus wie die SQL-Dump läuft als den aktuellen Benutzer und die Umstellung auf csv / txt als Benutzer ausgeführt, die mysqld ausgeführt wird. So ist das Verzeichnis benötigt Schreibberechtigungen für beiden Benutzer.

Sie müssen einen absoluten Pfad zu schaffen, nicht ein relativer Pfad.

Geben Sie den vollständigen Pfad zu dem Verzeichnis / data Sie schreiben zu versuchen.

Does Ubuntu verwenden SELinux? Überprüfen Sie, ob es aktiviert ist und die Durchsetzung. /var/log/audit/audit.log kann helpul (wenn das, wo Ubuntu es klebt - das ist die RHEL / Fedora Lage ist).

Ich hatte das gleiche Problem auf CentOS 6.7 In meinem Fall waren alle Berechtigungen gesetzt und der Fehler ist aufgetreten. Das Problem war, dass die SE Linux im Modus war „Erzwingen“.

Ich schaltete es auf "permissiven" mit dem Befehl sudo setenforce 0

gearbeitet Dann ist alles für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top