Ich versuche, den Inhalt einer Tabelle mit einer MySQL SELECT INTO OUTFILE-Anweisung in eine CSV-Datei zu kopieren. Wenn ich mache:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
outfile.csv wird auf dem Server in demselben Verzeichnis erstellt, in dem die Dateien dieser Datenbank gespeichert sind.
Wenn ich jedoch meine Abfrage in Folgendes ändere:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Ich bekomme:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Errcode 13 ist ein Berechtigungsfehler, aber ich erhalte ihn auch dann, wenn ich den Besitz von / data in mysql: mysql ändere und ihm 777 Berechtigungen erteile. MySQL läuft als Benutzer "mysql".
Seltsamerweise kann ich die Datei in / tmp erstellen, nur in keinem anderen Verzeichnis, das ich ausprobiert habe, selbst wenn die Berechtigungen so festgelegt sind, dass der Benutzer mysql in das Verzeichnis schreiben kann.
Dies ist MySQL 5.0.75, das unter Ubuntu ausgeführt wird.
quelle
/tmp
.Antworten:
Welche spezielle Version von Ubuntu ist das und ist das Ubuntu Server Edition?
Neuere Ubuntu Server-Editionen (z. B. 10.04), die mit AppArmor und MySQL-Profil geliefert werden, befinden sich möglicherweise standardmäßig im Erzwingungsmodus. Sie können dies überprüfen, indem Sie Folgendes ausführen
sudo aa-status
:Wenn mysqld im Durchsetzungsmodus enthalten ist, ist es derjenige, der wahrscheinlich das Schreiben verweigert. Einträge werden auch geschrieben,
/var/log/messages
wenn AppArmor die Schreibvorgänge / Zugriffe blockiert. Was Sie tun können, ist bearbeiten/etc/apparmor.d/usr.sbin.mysqld
und hinzufügen/data/
und/data/*
in der Nähe des unteren wie folgt :Lassen Sie AppArmor dann die Profile neu laden.
WARNUNG: Mit der obigen Änderung kann MySQL in das Verzeichnis / data lesen und schreiben. Wir hoffen, Sie haben die Auswirkungen auf die Sicherheit bereits berücksichtigt.
quelle
/your/abs/folder/ r, /your/abs/folder/** rwk, }
Vergessen Sie nicht, das Komma am Ende einzufügen!Ubuntu verwendet AppArmor und das hindert Sie daran, auf / data / zuzugreifen. Fedora verwendet Selinux und dies würde dies auf einem RHEL / Fedora / CentOS-Computer verhindern.
Um AppArmor so zu ändern, dass MySQL auf / data / zugreifen kann, gehen Sie wie folgt vor:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
Fügen Sie diese Zeile an einer beliebigen Stelle in der Liste der Verzeichnisse hinzu:
/data/ rw,
dann mache ein:
sudo /etc/init.d/apparmor restart
Eine weitere Option ist das Deaktivieren von AppArmor für MySQL. Dies wird NICHT EMPFOHLEN :
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
quelle
Ich weiß, dass Sie gesagt haben, dass Sie bereits versucht haben, Berechtigungen auf 777 festzulegen, aber da ich den Beweis habe, dass es sich bei mir um ein Berechtigungsproblem handelt, veröffentliche ich das, was ich genau ausgeführt habe, in der Hoffnung, dass es helfen kann. Hier ist meine Erfahrung:
quelle
MySQL wird hier dumm. Es wird versucht, Dateien unter / tmp / data / .... zu erstellen. Sie können also Folgendes tun:
Dann versuchen Sie Ihre Anfrage. Dies funktionierte für mich nach stundenlangem Debuggen des Problems.
quelle
Dieses Problem hat mich schon lange beschäftigt. Mir ist aufgefallen, dass diese Diskussion nicht auf die Lösung für RHEL / Fecora hinweist. Ich verwende RHEL und finde die Konfigurationsdateien für AppArmer unter Ubuntu nicht, aber ich habe mein Problem gelöst, indem ich JEDES Verzeichnis im Verzeichnis PATH für MySQL lesbar und zugänglich gemacht habe. Wenn Sie beispielsweise ein Verzeichnis / tmp erstellen, kann SELECT INTO OUTFILE mit den folgenden beiden Befehlen die Datei .sql AND .sql ausgeben
Wenn Sie ein Verzeichnis in Ihrem Home-Verzeichnis / home / tom erstellen, müssen Sie dies sowohl für / home als auch für / home / tom tun.
quelle
chown mysql:mysql
mein Problem gelöstDu kannst das :
quelle
Einige Dinge zu versuchen:
secure_file_priv
Systemvariable gesetzt? Wenn dies der Fall ist, müssen alle Dateien in dieses Verzeichnis geschrieben werden.quelle
Ich habe das gleiche Problem und habe dieses Problem durch die folgenden Schritte behoben:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
Jetzt wird die Datei im Editor geöffnet. Fügen Sie dort Ihr Verzeichnis hinzu
/ var / www / csv / * rw,
Ebenso habe ich in meiner Datei folgendes Bild hinzugefügt:
sudo /etc/init.d/apparmor neu starten
Es wurde erfolgreich durchgeführt und alle Zeilen mit ausgewählten Spalten in die Datei OUTPUT.csv geschrieben ...
quelle
In meinem Fall bestand die Lösung darin, jedes Verzeichnis im Verzeichnispfad für
mysql
(chmod a+rx
) lesbar und zugänglich zu machen . Das Verzeichnis wurde weiterhin durch seinen relativen Pfad in der Befehlszeile angegeben.quelle
Ich bin gerade auf dasselbe Problem gestoßen. Mein Problem war, dass das Verzeichnis, in das ich einen Dump ausführen wollte, keine Schreibberechtigung für den mysqld-Prozess hatte. Der anfängliche SQL-Dump würde ausschreiben, aber das Schreiben der CSV / TXT-Datei würde fehlschlagen. Der SQL-Dump wird anscheinend als aktueller Benutzer ausgeführt, und die Konvertierung in csv / txt wird als Benutzer ausgeführt, der mysqld ausführt. Das Verzeichnis benötigt daher Schreibberechtigungen für beide Benutzer.
quelle
Sie müssen einen absoluten Pfad angeben, keinen relativen Pfad.
Geben Sie den vollständigen Pfad zum Verzeichnis / data an, in das Sie schreiben möchten.
quelle
touch /data/outfile.csv
su --shell=/bin/sh nameofaccount
Verwendet Ubuntu SELinux? Überprüfen Sie, ob es aktiviert und erzwungen ist. /var/log/audit/audit.log kann hilfreich sein (wenn Ubuntu es dort festhält - das ist der RHEL / Fedora-Speicherort).
quelle
Ich hatte das gleiche Problem mit einem CentOs 6.7. In meinem Fall wurden alle Berechtigungen festgelegt und der Fehler trat trotzdem auf. Das Problem war, dass sich SE Linux im Modus "Durchsetzen" befand.
Ich habe es mit dem Befehl auf "freizügig" umgestellt
sudo setenforce 0
Dann hat alles für mich geklappt.
quelle