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)
mysql
linux
permissions
dotancohen
quelle
quelle
in
ist sinnlos, wenn MySQL nicht darauf zugreifen kanndotanchoen
. 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. Ihrgs
Benutzer muss auch dieFILE
Berechtigung mysql haben , um diese Abfrage tatsächlich auszuführen.SELECT
Berechtigungen. Als dieser Benutzer durchsuche ich oft die Datenbank.FILE
die in den MySQL-Dokumenten beschriebenen Berechtigungen verfügt .Antworten:
Laut MySQL-Dokumentation zu SELECT ... INTO OUTFILE
Sie sollten das
SELECT INTO OUTFILE
to / var / lib / mysql wie folgt ausgebenNatü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
Methode 2
UPDATE 2012-05-01 07:09 EDT
Führen Sie die folgenden Schritte aus, um sich das Zugriffsrecht FILE zu erteilen:
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
quelle
SHOW GRANTS
. Es sieht so aus, als ob der DB-Benutzer die richtigen Berechtigungen haben sollte.GRANT ALL PRIVILEGES ON *.*
genau wieRELOAD
und erteiltSHUTDOWN
. Dies liegt daran, dass dies globale Administratorrechte sind. DasGRANT ALL
Privileg, das Sie haben, gilt nur für diegs
Datenbank.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
/tmp
Verzeichnis 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 .
Die Ausgabe ist standardmäßig tabulatorgetrennt. Für Kommas leiten Sie es einfach durch
sed
oder etwas, bevor Sie es in die Datei schreiben.quelle
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
quelle
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
--xml
Option wurde erwähnt, dass dasmysqldump
Exportieren 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.quelle