Nie można wyprowadzić danych MySQL do pliku

13

Próbuję wyprowadzić dane z tabeli MySQL do pliku, ale otrzymuję błędy uprawnień:

$ 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>

Jeśli dany katalog ma chmod do 777, to dlaczego użytkownik MySQL nie może zapisać pliku? Co ciekawe, nie mogę pisać do / tmp /.

EDYCJA: Wygląda na to, że użytkownik DB ma odpowiednie uprawnienia MySQL:

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
źródło
2
Musisz przyznać prawa dostępu do MySQL na całym drzewie katalogów. Przyznawanie uprawnień nie inma sensu, jeśli MySQL nie może uzyskać dostępu dotanchoen. Innymi słowy, pole depostu bezpieczeństwa w skarbcu bankowym może być szeroko otwarte, ale jeśli drzwi skarbca są zamknięte, nie dostaniesz się do pudełka. Twój gsużytkownik musi również mieć mysql FILEprzywilej rzeczywiście wykonania tego zapytania.
Problem polega na tym, że możesz nie mieć wybranych perms? Uprawnienia do MySQL nie są kontrolowane przez uprawnienia do katalogu. Musisz użyć mysql -u <nazwa użytkownika> -p, aby uruchomić się jako określony użytkownik mysql. Aby dać użytkownikowi dostęp do bazy danych, spójrz na przyznanie MySql. dev.mysql.com/doc/refman/5.1/en/grant.html
Dziękujemy, ten użytkownik ma SELECTuprawnienia. Często przeglądam bazę danych jako ten użytkownik.
dotancohen
Dzięki, Marc, właśnie się tego obawiałem. Więc nie mogę mieć folderu „skrzynki odbiorczej”, do którego inni użytkownicy mogą pisać, nie pozwalając im również na odczyt / zapis w moim katalogu domowym?
dotancohen
2
Upewnij się, że użytkownik ma FILEuprawnienia opisane w dokumentach MySQL .
Mike Purcell,

Odpowiedzi:

12

Zgodnie z dokumentacją MySQL na temat SELECT ... INTO OUTFILE

Każdy plik utworzony przez INTO OUTFILE lub INTO DUMPFILE jest zapisywalny przez wszystkich użytkowników na hoście serwera. Powodem tego jest to, że serwer MySQL nie może utworzyć pliku, który jest własnością nikogo innego niż użytkownik, na którego koncie działa. (Nigdy nie należy uruchamiać mysqld jako root z tego i innych powodów.) Plik musi więc mieć możliwość zapisu na całym świecie, aby można było manipulować jego zawartością.

Powinieneś SELECT INTO OUTFILEwypisać plik / var / lib / mysql w następujący sposób

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

Oczywiście musisz upewnić się, że masz uprawnienia do PLIKU na gs @ localhost.

Istnieją dwa sposoby uzyskania tego pozwolenia

METODA nr 1

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

SPOSÓB 2

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

AKTUALIZACJA 2012-05-01 07:09 EDT

Aby nadać sobie uprawnienia do PLIKU, wykonaj następujące czynności:

  • KROK 01) service mysql restart --skip-networking --skip-grant-tables
  • KROK 02) mysql <hit enter>
  • KROK 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • KROK 04) exit
  • KROK 05) service mysql restart
RolandoMySQLDBA
źródło
Dzięki. Zaktualizowałem pytanie o wynik SHOW GRANTS. Wygląda na to, że użytkownik DB powinien mieć odpowiednie uprawnienia.
dotancohen
Użytkownik bazy danych nie ma odpowiednich uprawnień. Uprawnienie PLIK jest przyznawane tylko użytkownikowi z GRANT ALL PRIVILEGES ON *.*, podobnie jak RELOADi SHUTDOWN. Jest tak, ponieważ są to globalne uprawnienia administracyjne. GRANT ALLPrzywilej masz to za gsjedyną bazą danych.
RolandoMySQLDBA
1

Różne dystrybucje i systemy operacyjne nie wszystkie obsługują miejsc docelowych dla plików wyjściowych w taki sam sposób.

Na przykład podczas uruchamiania demona mysqld w systemie Linux, który korzysta z gniazda, OUTFILE czasami jest zapisywany w /tmpkatalogu. Nie jest to wielka sprawa, po prostu użycie metody OUTFILE ma wady, a mianowicie radzenie sobie z uprawnieniami i ustalanie, gdzie poszedł plik.

Ponieważ celem tego pytania nie jest konkretnie „Jak korzystać z pliku OUTFILE”, ale chcesz po prostu przechwycić niektóre dane MySQL do pliku, oto alternatywa, która nie wymaga od ciebie zmieniania uprawnień do PLIKU itp. .

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

Dane wyjściowe są domyślnie rozdzielane tabulatorami. W przypadku przecinków po prostu przeciągnij go sedlub coś przed zapisaniem go w pliku.

AaronDanielson
źródło
1

Spędziłem godziny próbując zrozumieć sugestie na tej stronie i wielu innych stronach StackOverflow.

Bez względu na to, jak zmieniłem uprawnienia w MySql, nie mogłem nic zrobić.

Wróciłem do uprawnień, od których zacząłem.

Ostatecznie to, co zadziałało, było prostsze niż sugestie innych:

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

Ryan
źródło
1
Twoja metoda jest dobra do użycia w interfejsie Bash CLI. Jednak pytanie w OP dotyczy tego, jak wyprowadzać dane do pliku z klienta CLI MySQL.
dotancohen
0

Jeśli chodzi o dwie metody przesyłania danych do CSV (powinien być rzeczywiście TSV) wspomniane powyżej, odkryłem, że jeśli w eksportowanych wpisach są puste wartości , istnieje ryzyko, że dane mogą zostać pomylone z powodu niewłaściwej alokacji dane do odpowiednich kolumn.

Z troską o integralność danych do odzyskiwania znalazłem tę stronę:

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

Wspomniał, że ta --xmlopcja mysqldumppozwala na eksport danych do formatu XML, który można następnie przeanalizować za pomocą skryptu niestandardowego do dowolnego wymaganego formatu, w tym TSV.

Nguyen H Chan
źródło