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

13

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 wurde, warum kann der MySQL-Benutzer dann die Datei nicht schreiben? Interessanterweise kann ich auch nicht nach / tmp / schreiben.

BEARBEITEN: Es sieht so aus, als hätte der DB-Benutzer die richtigen MySQL-Berechtigungen:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| 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)
dotancohen
quelle
2
Sie müssen MySQL Zugriffsrechte für den gesamten Verzeichnisbaum gewähren. Das Gewähren von Rechten für inist sinnlos, wenn MySQL nicht darauf zugreifen kann dotanchoen. Mit anderen Worten, der Sicherheitspostkasten im Banktresor kann weit geöffnet bleiben, aber wenn die Tür des Banktresors verriegelt ist, gelangen Sie nicht in den Kasten. Ihr gsBenutzer muss auch die FILEBerechtigung mysql haben , um diese Abfrage tatsächlich auszuführen.
Das Problem ist, dass Sie möglicherweise keine ausgewählten Dauerwellen haben? MySQL-Berechtigungen werden nicht durch Verzeichnisberechtigungen gesteuert. Sie müssen mysql -u <Benutzername> -p verwenden, um als bestimmter mysql-Benutzer ausgeführt zu werden. Schauen Sie sich MySql grant an, um Benutzern Zugriff auf eine Datenbank zu gewähren. dev.mysql.com/doc/refman/5.1/en/grant.html
Vielen Dank, dieser Benutzer hat SELECTBerechtigungen. Als dieser Benutzer durchsuche ich oft die Datenbank.
Dotancohen
Danke, Marc, davor hatte ich Angst. Ich kann also keinen "Posteingang" -Ordner haben, in den andere Benutzer schreiben können, ohne dass sie auch in mein Ausgangsverzeichnis lesen / schreiben können.
Dotancohen
2
Stellen Sie sicher, dass der Benutzer über FILEdie in den MySQL-Dokumenten beschriebenen Berechtigungen verfügt .
Mike Purcell

Antworten:

12

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 nicht 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 von der Welt beschreibbar sein, damit Sie ihren Inhalt bearbeiten können.

Sie sollten das SELECT INTO OUTFILEto / var / lib / mysql wie folgt ausgeben

SELECT * FROM data INTO OUTFILE 'data.csv';

Natürlich müssen Sie sicherstellen, dass Sie über die FILE-Berechtigung für gs @ localhost verfügen.

Es gibt zwei Möglichkeiten, diese Erlaubnis zu erteilen

METHODE 1

GRANT FILE ON *.* TO 'gs'@'localhost';

Methode 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

UPDATE 2012-05-01 07:09 EDT

Führen Sie die folgenden Schritte aus, um sich das Zugriffsrecht FILE zu erteilen:

  • 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
RolandoMySQLDBA
quelle
Vielen Dank. Ich habe die Frage mit der Ausgabe von aktualisiert SHOW GRANTS. Es sieht so aus, als ob der DB-Benutzer die richtigen Berechtigungen haben sollte.
Dotancohen
Der DB-Benutzer verfügt nicht über die erforderlichen Berechtigungen. Das DATEI-Privileg wird nur einem Benutzer mit GRANT ALL PRIVILEGES ON *.*genau wie RELOADund erteilt SHUTDOWN. Dies liegt daran, dass dies globale Administratorrechte sind. Das GRANT ALLPrivileg, das Sie haben, gilt nur für die gsDatenbank.
RolandoMySQLDBA
1

Unterschiedliche Distributionen und Betriebssysteme behandeln die Ziele für OUTFILEs nicht alle gleich.

Wenn Sie beispielsweise einen mysqld-Daemon unter Linux ausführen, der einen Socket verwendet, wird die Datei OUTFILE manchmal in das /tmpVerzeichnis geschrieben. Keine große Sache, nur die Verwendung des OUTFILE-Ansatzes weist Mängel auf, nämlich den Umgang mit Berechtigungen und das Ermitteln des Speicherorts der Datei.

Da das Ziel dieser Frage nicht spezifisch "Verwendung einer OUTFILE" ist, sondern Sie lediglich einige MySQL - Daten in einer Datei erfassen möchten, 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 tabulatorgetrennt. Für Kommas leiten Sie es einfach durch sedoder etwas, bevor Sie es in die Datei schreiben.

AaronDanielson
quelle
1

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.

Letztendlich war das, was für mich funktionierte, einfacher als die Vorschläge anderer:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv

Ryan
quelle
1
Ihre Methode eignet sich für die Verwendung in der Bash-CLI. Bei der Frage im OP wird jedoch gefragt, wie Daten von der MySQL-Client-CLI in eine Datei ausgegeben werden sollen.
Dotancohen
0

In Bezug auf die beiden oben genannten Methoden zur Ausgabe von Daten an CSV (sollte tatsächlich TSV sein) habe ich festgestellt, dass bei leeren Werten in den Einträgen, die Sie exportieren, die Gefahr besteht, dass die Daten aufgrund einer fehlerhaften Zuordnung von durcheinander gebracht werden die Daten in die entsprechenden Spalten.

Aus Sorge um die Integrität der Daten für die Wiederherstellung fand ich diese Website:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

In dieser --xmlOption wurde erwähnt, dass das mysqldumpExportieren der Daten in ein XML-Format möglich ist, das dann von einem benutzerdefinierten Skript in ein beliebiges Format, einschließlich TSV, analysiert werden kann.

Nguyen H Chan
quelle