Irgendwelche Ideen?
SELECT * INTO OUTFILE '/home/myacnt/docs/mysqlCSVtest.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '*'
LINES TERMINATED BY '\n'
FROM tbl_property
WHERE managerGroupID = {$managerGroupID}
Error:
Access denied for user 'asdfsdf'@'localhost' (using password: YES)
mysql
mysql-error-1045
into-outfile
Shackrock
quelle
quelle
FILE
ist das fürSELECT INTO OUTFILE
Anweisungen erforderliche Privileg nicht enthalten . Ich hatte mehrere Probleme mit dieser Nichtübereinstimmung zwischen Englisch und MySQL: dba.stackexchange.com/a/96894/53784Antworten:
Versuchen Sie, diesen SQL-Befehl auszuführen:
> grant all privileges on YOUR_DATABASE.* to 'asdfsdf'@'localhost' identified by 'your_password'; > flush privileges;
Es scheint, dass Sie Probleme mit der Verbindung zur Datenbank haben und nicht in den Ordner schreiben, den Sie erwähnen.
Stellen Sie außerdem sicher, dass Sie dem
FILE
Benutzer gewährt haben'asdfsdf'@'localhost'
.> GRANT FILE ON *.* TO 'asdfsdf'@'localhost';
quelle
FILE
dem Benutzer gewährt haben .FLUSH PRIVILEGES
nachGRANT
. Dies ist nur erforderlich, wenn Sie die Berechtigungstabelle mit SQL ändern, anstatt sie zu verwendenGRANT
.Ehrlich gesagt habe ich mich nicht um die Stipendien gekümmert und das hat auch ohne die Privilegien funktioniert:
echo "select * from employee" | mysql --host=HOST --port=PORT --user=UserName --password=Password DATABASE.SCHEMA > output.txt
quelle
Wie @fijaaron sagt,
GRANT ALL
bedeutet nichtGRANT FILE
GRANT FILE
funktioniert nur mit*.*
Dann mach's
GRANT FILE ON *.* TO user;
quelle
Da cP / WHM die Möglichkeit zum Ändern von Benutzerrechten als Root in PHPMyAdmin aufgehoben hat, müssen Sie die Befehlszeile verwenden, um:
mysql> GRANT FILE ON *.* TO 'user'@'localhost';
Schritt 2 besteht darin, diesem Benutzer das Speichern einer Datei in einem bestimmten Ordner zu ermöglichen. Es gibt einige Möglichkeiten, dies zu tun, aber am Ende habe ich einen Ordner abgelegt:
und
Dadurch kann der MySQL-Benutzer die Datei schreiben. Wie bereits in früheren Postern erwähnt, können Sie auch den temporären MySQL-Ordner verwenden. Ich nehme an, dass dies nicht wirklich wichtig ist, aber Sie möchten definitiv keine 0777-Berechtigung (weltweit beschreibbar) festlegen, es sei denn, Sie möchten, dass die Welt Ihre Daten sieht. Es gibt ein potenzielles Problem, wenn Sie den Vorgang spülen und wiederholen möchten, da dies
INTO OUTFILE
nicht funktioniert, wenn die Datei vorhanden ist. Wenn Ihre Dateien einem anderen Benutzer gehören,unlink($file)
funktioniert der Versuch, dies zu tun, nicht. Wenn Sie wie ich sind (paranoid um 0777), können Sie Ihr Zielverzeichnis festlegen mit:also kurz vor dem SQL-Befehl
unmittelbar danach, gefolgt von
unlink(file)
Löschen der Datei. Auf diese Weise läuft alles unter Ihrem Webbenutzer und Sie müssen den MySQL-Benutzer nicht aufrufen.quelle
Ich habe alle Lösungen ausprobiert, aber es war immer noch nicht ausreichend. Nach einigem weiteren Graben stellte ich schließlich fest, dass ich auch das Flag 'file_priv' setzen und mysql neu starten musste.
Wieder aufzunehmen :
Gewähren Sie die Privilegien:
> GRANT ALL PRIVILEGES ON my_database.* to 'my_user'@'localhost'; > GRANT FILE ON *.* TO my_user; > FLUSH PRIVILEGES;
Setzen Sie die Flagge:
> UPDATE mysql.user SET File_priv = 'Y' WHERE user='my_user' AND host='localhost';
Starten Sie zum Schluss den MySQL-Server neu:
Danach konnte ich in das
secure_file_priv
Verzeichnis schreiben . Für mich war es / var / lib / mysql-files /, aber Sie können es mit dem folgenden Befehl überprüfen:> SHOW VARIABLES LIKE "secure_file_priv";
quelle
Für zukünftige Leser ist ein einfacher Weg wie folgt, wenn sie mit Bash in großen Mengen exportieren möchten:
akshay@ideapad:/tmp$ mysql -u someuser -p test -e "select * from offices" Enter password: +------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+ | officeCode | city | phone | addressLine1 | addressLine2 | state | country | postalCode | territory | +------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+ | 1 | San Francisco | +1 650 219 4782 | 100 Market Street | Suite 300 | CA | USA | 94080 | NA | | 2 | Boston | +1 215 837 0825 | 1550 Court Place | Suite 102 | MA | USA | 02107 | NA | | 3 | NYC | +1 212 555 3000 | 523 East 53rd Street | apt. 5A | NY | USA | 10022 | NA | | 4 | Paris | +33 14 723 4404 | 43 Rue Jouffroy D'abbans | NULL | NULL | France | 75017 | EMEA | | 5 | Tokyo | +81 33 224 5000 | 4-1 Kioicho | NULL | Chiyoda-Ku | Japan | 102-8578 | Japan | | 6 | Sydney | +61 2 9264 2451 | 5-11 Wentworth Avenue | Floor #2 | NULL | Australia | NSW 2010 | APAC | | 7 | London | +44 20 7877 2041 | 25 Old Broad Street | Level 7 | NULL | UK | EC2N 1HN | EMEA | +------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+
Wenn Sie von Nicht-Root-Benutzern exportieren, legen Sie die Berechtigung wie unten festgelegt fest
root@ideapad:/tmp# mysql -u root -p MariaDB[(none)]> UPDATE mysql.user SET File_priv = 'Y' WHERE user='someuser' AND host='localhost';
Starten Sie mysqld neu oder laden Sie es neu
akshay@ideapad:/tmp$ sudo su root@ideapad:/tmp# systemctl restart mariadb
Beispielcode-Snippet
akshay@ideapad:/tmp$ cat test.sh #!/usr/bin/env bash user="someuser" password="password" database="test" mysql -u"$user" -p"$password" "$database" <<EOF SELECT * INTO OUTFILE '/tmp/csvs/offices.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM offices; EOF
Ausführen
akshay@ideapad:/tmp$ mkdir -p /tmp/csvs akshay@ideapad:/tmp$ chmod +x test.sh akshay@ideapad:/tmp$ ./test.sh akshay@ideapad:/tmp$ cat /tmp/csvs/offices.csv "1"|"San Francisco"|"+1 650 219 4782"|"100 Market Street"|"Suite 300"|"CA"|"USA"|"94080"|"NA" "2"|"Boston"|"+1 215 837 0825"|"1550 Court Place"|"Suite 102"|"MA"|"USA"|"02107"|"NA" "3"|"NYC"|"+1 212 555 3000"|"523 East 53rd Street"|"apt. 5A"|"NY"|"USA"|"10022"|"NA" "4"|"Paris"|"+33 14 723 4404"|"43 Rue Jouffroy D'abbans"|\N|\N|"France"|"75017"|"EMEA" "5"|"Tokyo"|"+81 33 224 5000"|"4-1 Kioicho"|\N|"Chiyoda-Ku"|"Japan"|"102-8578"|"Japan" "6"|"Sydney"|"+61 2 9264 2451"|"5-11 Wentworth Avenue"|"Floor #2"|\N|"Australia"|"NSW 2010"|"APAC" "7"|"London"|"+44 20 7877 2041"|"25 Old Broad Street"|"Level 7"|\N|"UK"|"EC2N 1HN"|"EMEA"
quelle