Próbuję zrzucić zawartość tabeli do pliku CSV przy użyciu instrukcji MySQL SELECT INTO OUTFILE. Jeśli zrobię:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Plik outfile.csv zostanie utworzony na serwerze w tym samym katalogu, w którym przechowywane są pliki tej bazy danych.
Jednak gdy zmieniam zapytanie na:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Dostaję:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Errcode 13 to błąd uprawnień, ale otrzymuję go, nawet jeśli zmienię własność / data na mysql: mysql i nadam mu 777 uprawnień. MySQL działa jako użytkownik „mysql”.
O dziwo mogę utworzyć plik w / tmp, ale nie w żadnym innym katalogu, którego próbowałem, nawet z uprawnieniami ustawionymi tak, że użytkownik mysql powinien mieć możliwość zapisu w katalogu.
To jest MySQL 5.0.75 działający na Ubuntu.
mysql
sql
into-outfile
Ryan Olson
źródło
źródło
/tmp
.Odpowiedzi:
Która konkretna wersja Ubuntu to jest i czy jest to wersja Ubuntu Server Edition?
Najnowsze wersje Ubuntu Server (takie jak 10.04) są dostarczane z AppArmor, a profil MySQL może być domyślnie w trybie wymuszania. Możesz to sprawdzić, wykonując w ten
sudo aa-status
sposób:Jeśli mysqld jest włączony w tryb wymuszania, to prawdopodobnie on odmawia zapisu. Wpisy byłyby również zapisywane,
/var/log/messages
gdy AppArmor blokuje zapis / dostęp. Możesz edytować/etc/apparmor.d/usr.sbin.mysqld
i dodawać/data/
i/data/*
u dołu w następujący sposób:A następnie spraw, aby AppArmor ponownie załadował profile.
UWAGA: powyższa zmiana pozwoli MySQL na odczyt i zapis w katalogu / data. Mamy nadzieję, że już rozważyłeś konsekwencje tego dla bezpieczeństwa.
źródło
/your/abs/folder/ r, /your/abs/folder/** rwk, }
nie zapomnij dodać przecinka na końcu!Ubuntu używa AppArmor i właśnie to uniemożliwia dostęp do / danych /. Fedora używa selinux, a to zapobiegłoby temu na maszynie RHEL / Fedora / CentOS.
Aby zmodyfikować AppArmor, aby umożliwić MySQL dostęp / dane / wykonaj następujące czynności:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
dodaj tę linię w dowolnym miejscu listy katalogów:
/data/ rw,
następnie wykonaj:
sudo /etc/init.d/apparmor restart
Inną opcją jest całkowite wyłączenie AppArmor dla mysql, NIE jest to ZALECANE :
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
Nie zapomnij ponownie uruchomić apparmor:
sudo /etc/init.d/apparmor restart
źródło
Wiem, że powiedziałeś, że próbowałeś już ustawić uprawnienia na 777, ale ponieważ mam dowody, że dla mnie był to problem z uprawnieniami, publikuję to, co dokładnie uruchamiam, mając nadzieję, że może to pomóc. Oto moje doświadczenie:
źródło
MySQL robi się tu głupi. Próbuje utworzyć pliki w katalogu / tmp / data / .... Więc co możesz zrobić, to:
Następnie spróbuj zapytać. To zadziałało po wielu godzinach debugowania problemu.
źródło
Ten problem trapi mnie od dawna. Zauważyłem, że ta dyskusja nie wskazuje rozwiązania na RHEL / Fecora. Używam RHEL i nie znajduję plików konfiguracyjnych odpowiadających AppArmerowi na Ubuntu, ale rozwiązałem swój problem, czyniąc KAŻDY katalog w katalogu PATH czytelnym i dostępnym dla mysql. Na przykład, jeśli utworzysz katalog / tmp, następujące dwie komendy sprawią, że SELECT INTO OUTFILE będzie w stanie wyprowadzić plik .sql AND .sql
Jeśli tworzysz katalog w swoim katalogu domowym / home / tom, musisz to zrobić zarówno dla / home, jak i / home / tom.
źródło
chown mysql:mysql
rozwiązanie mojego problemuMożesz to zrobić :
źródło
Kilka rzeczy do wypróbowania:
secure_file_priv
zmienna systemowa jest ustawiona? Jeśli tak, wszystkie pliki muszą zostać zapisane w tym katalogu.źródło
Mam ten sam problem i rozwiązałem go, wykonując następujące czynności:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
teraz plik zostałby otwarty w edytorze, dodaj tam swój katalog
/ var / www / csv / * rw,
podobnie dodałem w moim pliku, jak podany obraz:
sudo /etc/init.d/apparmor restart
Udało się i zapisał wszystkie wiersze z wybranymi kolumnami do pliku OUTPUT.csv ...
źródło
W moim przypadku rozwiązaniem było uczynienie każdego katalogu w ścieżce katalogu czytelnym i dostępnym przez
mysql
(chmod a+rx
). Katalog był nadal określony przez swoją ścieżkę względną w wierszu poleceń.źródło
Właśnie napotkałem ten sam problem. Mój problem polegał na tym, że katalog, do którego próbowałem zrzucić, nie miał uprawnień do zapisu dla procesu mysqld. Początkowy zrzut sql zostałby zapisany, ale zapis pliku csv / txt nie powiódł się. Wygląda na to, że zrzut sql działa jako bieżący użytkownik, a konwersja do csv / txt jest uruchamiana jako użytkownik, który uruchamia mysqld. Dlatego katalog wymaga uprawnień do zapisu dla obu użytkowników.
źródło
Musisz podać ścieżkę bezwzględną, a nie ścieżkę względną.
Podaj pełną ścieżkę do katalogu / data, w którym próbujesz pisać.
źródło
touch /data/outfile.csv
su --shell=/bin/sh nameofaccount
Czy Ubuntu używa SELinux? Sprawdź, czy jest włączona i wymusza. /var/log/audit/audit.log może być helpul (jeśli to jest miejsce, w którym Ubuntu go umieszcza - to jest lokalizacja RHEL / Fedora).
źródło
Miałem ten sam problem na CentOs 6.7 W moim przypadku wszystkie uprawnienia były ustawione i nadal występował błąd. Problem polegał na tym, że SE Linux był w trybie „wymuszania”.
Zmieniłem to na „przyzwolenie” za pomocą polecenia
sudo setenforce 0
Wtedy wszystko mi się udało.
źródło