Używam MySQL 5.5 na Ubuntu 12 LTS. Jak włączyć LOAD DATA LOCAL INFILE w my.cnf?
Próbowałem dodać plik lokalny do mojej konfiguracji w różnych miejscach, ale nadal otrzymuję komunikat „Użyte polecenie nie jest dozwolone w tej wersji MySQL”
Ze strony podręcznika MySQL 5.5:
LOKALNY działa tylko wtedy, gdy zarówno serwer, jak i klient są skonfigurowane tak, aby na to zezwalać. Na przykład, jeśli mysqld został uruchomiony z --local-infile = 0, LOCAL nie działa. Zobacz Sekcja 6.1.6, „Kwestie bezpieczeństwa związane z LOAD DATA LOCAL”.
Powinieneś ustawić opcję:
local-infile=1
w swoim [mysql] wpisie pliku my.cnf lub wywołaj klienta mysql z opcją --local-infile :
mysql --local-infile -uroot -pyourpwd yourdbname
Musisz mieć pewność, że ten sam parametr jest zdefiniowany w Twoim [mysqld] sekcji aby włączyć po stronie serwera funkcji „local infile”.
To ograniczenie bezpieczeństwa.
my.cnf
ścieżka jest/etc/mysql/my.cnf
w moim komputerze (AWS EC2).apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33
. Rozwiązanie jest bardzo proste. Po prostu zaktualizuj/etc/apparmor.d/local/usr.sbin.mysqld
i załaduj ponownie usługę apparmor.Plik my.cnf, który należy edytować, to /etc/mysql/my.cnf . Właśnie:
Następnie dodaj:
Nagłówki [mysqld] i [mysql] są już podane, po prostu zlokalizuj je w pliku i dodaj plik local-infile pod każdym z nich.
U mnie działa na MySQL 5.5 na Ubuntu 12.04 LTS.
źródło
Ubuntu 14.04.2 LTS not working
./mysql/my.cnf
domyślnie nie istnieje. Po prostu utwórz katalog i plik i wklej te linie do pliku./etc/mysql/conf.d/enable-local-infile.cnf
Nie zapomnij również osudo service mysql restart
dokonaniu zmiany konfiguracji, aby odniosła skutek.Zastąp sterownik php5-mysql natywnym sterownikiem
W debianie
źródło
Rozwiązałem ten problem w MySQL 8.0.11 za pomocą polecenia terminala mysql:
Mam na myśli to, że zalogowałem się najpierw ze zwykłym:
Następnie możesz zobaczyć status za pomocą polecenia:
Powinien być włączony. Nie będę tutaj pisał o bezpieczeństwie związanym z ładowaniem lokalnych plików do bazy danych.
źródło
SET GLOBAL local_infile = true;
działa tylko polecenie . Wersja MySQL to 8.0.12. Może to jest najnowsze rozwiązanie. Dziękuję bardzo.8.0.12 MySQL Community Server
w systemie Windows.SET GLOBAL local_infile = true;
polecenie, ale nadal pojawia się ten sam błąd,ERROR 1148 (42000): The used command is not allowed with this MySQL version
ale połączenie z mysql z --load-infile = 1 działałomysql --local-infile=1 -u root -p
w przypadku, gdy twój smak mysql na ubuntu w żadnych okolicznościach NIE działa i nadal pojawia się błąd 1148, możesz uruchomić
load data infile
polecenie z wiersza poleceńotwórz okno terminala
biegać
mysql -u YOURUSERNAME -p --local-infile YOURDBNAME
zostaniesz poproszony o wpisanie hasła mysqluser
będziesz uruchamiać MySQLMonitor, a wiersz poleceń będzie
mysql>
uruchom
load data infile
polecenie (nie zapomnij zakończyć średnikiem;
)lubię to:
źródło
Zobacz poniższy obrazek ...
dodałem
--local-infile=1
do zwykłego polecenia mysqlmysql -u root -p
Zatem całkowita linia byłaby:
źródło
SET GLOBAL ..
nie. Czy polecenie 'source' (\. file.sql
) w jakiś sposób uruchamia nową sesję lub resetuje to? Nie próbowałem jednak umieszczać tego ustawienia w skrypcie mmy sql.Również dla innych czytelników, jeśli próbujesz to zrobić w Django ORAZ twój serwer zezwala na local_infile (możesz to sprawdzić wpisując SHOW VARIABLES przez klienta mysql), możesz dodać to do swojego pliku settings.py (ponieważ MySQLdb python nie robi t domyślnie przeczytaj plik .my.cnf):
źródło
Musisz uważać na sposób ustanowienia połączenia mysqli. Pełne uznanie za to rozwiązanie należy do Jorge Albarenque, źródło
Aby to naprawić, musiałem:
Problem polega na tym, że dzięki tej funkcji możesz jawnie włączyć obsługę LOAD DATA LOCAL INFILE. Na przykład (styl proceduralny):
lub obiektowy
źródło
jeśli twój plik csv znajduje się tak samo jak db, musisz usunąć LOCAL w LOAD DATA INFILE , albo otrzymasz błąd
źródło
Innym sposobem jest użycie
mysqlimport
programu klienta.Wywołujesz go w następujący sposób:
To generuje
LOAD DATA
instrukcję, która ładujetableName.txt
się dotableName
tabeli.Pamiętaj o następujących kwestiach:
mysqlimport
określa nazwę tabeli na podstawie dostarczonego pliku; używając całego tekstu od początku nazwy pliku do pierwszego okresu jako nazwy tabeli. Tak więc, jeśli chcesz, aby załadować kilka plików do tej samej tabeli można odróżnić je jaktableName.1.txt
,tableName.2.txt
... itd, na przykład.źródło
To było dla mnie trochę dziwne, z dnia na dzień skrypt, który działał od wielu dni, po prostu przestał działać. Nie było nowszej wersji mysql ani żadnego innego uaktualnienia, ale otrzymywałem ten sam błąd, więc próbuję ostatni raz z plikiem CSV i zauważam że koniec linii używa \ n zamiast oczekiwanego (według mojego skryptu ) \ r \ n, więc zapisuję go z odpowiednim EOL i uruchamiam skrypt ponownie bez żadnych problemów.
Myślę, że to trochę dziwne, aby mysql powiedział mi, że użyte polecenie nie jest dozwolone w tej wersji MySQL, ponieważ przyczyna była zupełnie inna.
Moje polecenie robocze wygląda następująco:
źródło
Użyłem poniższej metody, która nie wymaga żadnych zmian w konfiguracji , przetestowana na mysql-5.5.51-winx64 i 5.5.50-MariaDB:
wstaw 'załaduj dane ...' do pliku .sql (np: LoadTableName.sql)
następnie:
źródło
W przypadku Mysql 5.7 możesz użyć "pokaż zmienne globalne, takie jak" local_infile ";" co da lokalny status infile. Możesz go włączyć używając "set global local_infile = ON;".
źródło
Ok, dzieje się tu coś dziwnego. Aby to zadziałało, NIE trzeba dokonywać żadnych zmian w konfiguracji w /etc/mysql/my.cnf. Wszystko, co musisz zrobić, to zrestartować bieżącą usługę mysql w terminalu:
Następnie, jeśli chcę „odtworzyć” błąd, po prostu ponownie uruchamiam usługę Apache:
Które można następnie naprawić, wprowadzając następujące polecenie:
Wygląda więc na to, że apache2 robi coś, aby nie zezwolić na tę funkcję podczas uruchamiania (co jest następnie odwracane / poprawiane, jeśli ponownie uruchomisz usługę mysql).
Obowiązuje w dystrybucjach opartych na Debianie.
Obowiązuje w dystrybucjach opartych na RedHat
źródło
Dla tych z Was, którzy szukają odpowiedzi, które sprawią, że LOAD DATA
LOCAL
INFILE będzie działać tak jak ja, prawdopodobnie to zadziała. Cóż, to zadziałało dla mnie, więc oto jest. Zainstalujpercona
jako serwer i klienta mysql, wykonując czynności z linku. Podczas instalacji zostanie wyświetlony monit o hasło, więc podaj hasło, które zapamiętasz i użyjesz później. Po zakończeniu instalacji zrestartuj system i sprawdź, czy serwer działa, przechodząc doterminal
i wpisując,mysql -u root -p
a następnie hasło. Spróbuj uruchomić polecenieLOAD DATA LOCAL INFILE
teraz .. Mam nadzieję, że zadziała :)Przy okazji, pracowałem na Railsach 2.3 z Ruby 1.9.3 na Ubuntu 12.04.
źródło
Wszyscy: Najwyraźniej to działa zgodnie z projektem. Zobacz nowy dokument referencyjny z dnia 23.07.2019, Rozdział 6.1.6, Problemy z bezpieczeństwem w przypadku LOAD DATA LOCAL .
źródło
Dodaj
local_infile
w obuclient
imysqld
sekcji.Testowane w MySQL 8.x zarówno w systemie Windows, jak i Linux.
źródło
Używam Xampp w wersji 3.2.4 i serwera mysql 8.0.20.
Dodałem
local-infile=1
do[mysql]
iw[mysqld]
pliku „my.ini”. Plik znajduje się w „C: \ xampp \ mysql \ bin \ my.ini”.Następnie wstawiłem dane z pliku csv za pomocą poniższego kodu
LOAD DATA INFILE ...
. Ważne jest, aby przenieść się LOKALNIE. W przeciwnym razie to nie zadziała.Dzięki za wszystkie sugestie powyżej. W końcu udało mi się połączyć.
źródło