it-swarm-eu.dev

MySQL-Daten können nicht in eine Datei ausgegeben werden

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)
13
dotancohen

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;

UPDATE 2012-05-01 07:09 EDT

Gehen Sie wie folgt vor, um sich das Privileg DATEI zu geben:

  • SCHRITT 01) service mysql restart --skip-networking --skip-grant-tables
  • SCHRITT 02) mysql <hit enter>
  • SCHRITT 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
  • SCHRITT 04) exit
  • SCHRITT 05) service mysql restart
12
RolandoMySQLDBA

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.

1
AaronDanielson

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

1
Ryan

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.

0
Nguyen H Chan