Ich versuche, die Daten aus einer MySQL-Tabelle in eine Datei auszugeben, erhalte jedoch Berechtigungsfehler:
$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>
Wenn das betreffende Verzeichnis auf 777 geändert ist, warum kann der MySQL-Benutzer die Datei dann nicht schreiben? Interessanterweise kann ich auch nicht nach/tmp/schreiben.
EDIT : Es sieht so aus, als hätte der DB-Benutzer die richtigen MySQL-Berechtigungen:
mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for [email protected] |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword' |
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost' |
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)
Laut MySQL-Dokumentation zu SELECT ... INTO OUTFILE
Jede von INTO OUTFILE oder INTO DUMPFILE erstellte Datei kann von allen Benutzern auf dem Server-Host geschrieben werden. Der Grund dafür ist, dass der MySQL-Server keine Datei erstellen kann, deren Eigentümer nur der Benutzer ist, unter dessen Konto er ausgeführt wird. (Aus diesem und anderen Gründen sollten Sie mysqld niemals als root ausführen.) Die Datei muss daher weltweit beschreibbar sein, damit Sie ihren Inhalt bearbeiten können.
Sie sollten das SELECT INTO OUTFILE
nach/var/lib/mysql wie folgt
SELECT * FROM data INTO OUTFILE 'data.csv';
Natürlich müssen Sie sicherstellen, dass Sie die Berechtigung FILE für gs @ localhost haben.
Es gibt zwei Möglichkeiten, diese Berechtigung zu erhalten
METHODE 1
GRANT FILE ON *.* TO 'gs'@'localhost';
Methode Nr. 2
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
FLUSH PRIVILEGES;
Gehen Sie wie folgt vor, um sich das Privileg DATEI zu geben:
service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
exit
service mysql restart
Unterschiedliche Distributionen und Betriebssysteme behandeln nicht alle Ziele für OUTFILEs gleich.
Wenn Sie beispielsweise einen mysqld-Daemon unter Linux ausführen, der einen Socket verwendet, wird OUTFILE manchmal in das Verzeichnis /tmp
Geschrieben. Keine große Sache, es ist nur die Verwendung des OUTFILE-Ansatzes, der Mängel aufweist, nämlich den Umgang mit Berechtigungen und das Finden, wohin die Datei gegangen ist.
Da das Ziel dieser Frage nicht speziell "Verwendung einer OUTFILE" ist, sondern nur einige MySQL-Daten in einer Datei erfasst werden sollen, ist hier eine Alternative, bei der Sie nicht mit FILE-Berechtigungen usw. Herumspielen müssen .
$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv
Die Ausgabe ist standardmäßig durch Tabulatoren getrennt. Für Kommas leiten Sie es einfach durch sed
oder etwas anderes, bevor Sie es in die Datei schreiben.
Ich habe stundenlang versucht, die Vorschläge auf dieser Seite und vielen anderen Seiten von StackOverflow zu verstehen.
Egal wie ich die Berechtigungen in MySql geändert habe, ich konnte nichts zum Laufen bringen.
Ich kehrte zu den Berechtigungen zurück, mit denen ich begonnen hatte.
Was für mich letztendlich funktionierte, war einfacher als die Vorschläge anderer :
echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv
In Bezug auf die beiden oben genannten Methoden zur Ausgabe von Daten an CSV (sollte in der Tat TSV sein) habe ich festgestellt, dass in den von Ihnen eingegebenen Einträgen leere Werte vorhanden sind Beim Exportieren besteht die Gefahr, dass die Daten aufgrund einer falschen Zuordnung der Daten zu den entsprechenden Spalten durcheinander gebracht werden.
Aus Sorge um die Datenintegrität für die Wiederherstellung habe ich diese Website gefunden:
https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/
Es wurde erwähnt, dass die Option --xml
In mysqldump
das Exportieren der Daten in das XML-Format ermöglicht, das dann von einem benutzerdefinierten Skript in ein beliebiges Format, einschließlich TSV, analysiert werden kann.