MySQL: Włącz LOAD DATA LOCAL INFILE

127

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”

Krt_Malta
źródło

Odpowiedzi:

197

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.

dAm2K
źródło
4
dzięki. przy okazji, my.cnfścieżka jest /etc/mysql/my.cnfw moim komputerze (AWS EC2).
SparkAndShine
Co ciekawe, plik my.cnf był dla mnie w katalogu / etc.
SgtRock
Wszelkie pomysły, dokąd się udać, jeśli to nadal się nie powiedzie. Dodałem local-infile = 1 do pliku my.cnf w katalogach [client], [mysqld] i [mysql] i użyłem ich kombinacji. Wszystko z tymi samymi skutkami. Próbowałem ponownie uruchomić Środowisko pracy, ale bez powodzenia. Zatrzymałem się i uruchomiłem również środowisko mySQL między każdą zmianą.
OrwellHindenberg
2
aktualizacja mySQL do 6.2.5 rozwiązała ten problem za mnie
OrwellHindenberg
Odpowiedź jest we właściwym kierunku. Ale dla tych, którzy borykają się z tym problemem, jest kolejna wpadka. Jeśli masz włączony apparmor w swoim systemie, a problem nadal występuje, sprawdź syslog, aby zobaczyć, czy demon mysqld jest blokowany. Miałem ten problem: 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.mysqldi załaduj ponownie usługę apparmor.
Leo
60

Plik my.cnf, który należy edytować, to /etc/mysql/my.cnf . Właśnie:

sudo nano /etc/mysql/my.cnf

Następnie dodaj:

[mysqld]
local-infile 

[mysql]
local-infile 

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.

hlosukwakha
źródło
1
To zdecydowanie naprawiło to dla mnie w Ubuntu 12.04.
John Fiala,
4
Ja też mogę to potwierdzić Ubuntu 14.04.2 LTS not working.
Ain Tohvri
Działa też na komputerach Mac. Dla użytkownika Mac /mysql/my.cnfdomyślnie nie istnieje. Po prostu utwórz katalog i plik i wklej te linie do pliku.
Zheng Liu
Jeśli nie chcesz, aby ta konfiguracja została nadpisana, gdy mysql zostanie zaktualizowany, powinieneś umieścić to w. /etc/mysql/conf.d/enable-local-infile.cnf Nie zapomnij również o sudo service mysql restartdokonaniu zmiany konfiguracji, aby odniosła skutek.
Stephen Ostermiller
To jest właściwe rozwiązanie. Rozwiązanie, które uzyskało najwyższe uznanie, nie wspomina, że ​​musisz umieścić [mysqld] jako pierwsze przed linią local-infile.
user3260912
30

Zastąp sterownik php5-mysql natywnym sterownikiem

W debianie

apt-get install php5-mysqlnd
BeniSK
źródło
To zadziałało! Używając standardowego aws 12.04 ubuntu, potrzebowałem „lokalnego”, ponieważ łączę się z RDS. Stukrotne dzięki!
James Bowler
Wielkie dzięki, to rozwiązanie zadziałało dla mnie. Zadałem pytanie stackoverflow.com/questions/36526102/…
user75472
Brak sukcesu ubuntu 12.04
Zbyszek
kolejny szczęśliwy klient! ubuntu 14.04 mysql 5.7
nodoze
27

Rozwiązałem ten problem w MySQL 8.0.11 za pomocą polecenia terminala mysql:

SET GLOBAL local_infile = true;

Mam na myśli to, że zalogowałem się najpierw ze zwykłym:

mysql -u user -p*

Następnie możesz zobaczyć status za pomocą polecenia:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Powinien być włączony. Nie będę tutaj pisał o bezpieczeństwie związanym z ładowaniem lokalnych plików do bazy danych.

Oleksiy Muzalyev
źródło
Próbowałem wielu innych rozwiązań, ale 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.
mathsyouth
1
Niestety zmienna jest ponownie WYŁĄCZONA po ponownym uruchomieniu serwera.
Pedro
Mohit, jakoś to rozwiązałem, ponieważ teraz globalna zmienna „local_infile” jest zawsze WŁĄCZONA, nawet po restarcie. Wygląda na to, że nie użyłem do tego pliku my.cnf. Czy mógłbyś spróbować zalogować się do PhpMyAdmin, najnowsza wersja, jako root, przejdź do sekcji Zmienne, wyszukaj „plik_lokalny”, następnie kliknij Edytuj i zmień go na WŁ., A na koniec naciśnij Enter. Zadziałało?
Oleksiy Muzalyev
2
Tylko ta odpowiedź działała dla mnie 8.0.12 MySQL Community Serverw systemie Windows.
endo64
Mam MySQL 8.0.16 zainstalowany na serwerze Windows 2016, wykonałem 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 versionale połączenie z mysql z --load-infile = 1 działałomysql --local-infile=1 -u root -p
Junior
13

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 infilepolecenie (nie zapomnij zakończyć średnikiem; )

lubię to:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
tony gil
źródło
9

Zobacz poniższy obrazek ...

dodałem --local-infile=1 do zwykłego polecenia mysql mysql -u root -p

Zatem całkowita linia byłaby:

mysql --local-infile = 1 -u root -p

wprowadź opis obrazu tutaj

Jagadeesh Pulamarasetti
źródło
To działało dla mnie, kiedy 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.
toddkaufmann
5

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):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}
brfox
źródło
3

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:

  • Dodaj local-infile = 1 do sekcji [mysqld] i [mysql] my.cnf (jak wyjaśniono w komentarzach powyżej)
  • Użyj funkcji mysqli_real_connect ( dokumentacja PHP ).

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):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

lub obiektowy

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);
sieppl
źródło
1
@Mask Nie można potwierdzić. Moje rozwiązanie działa na 5.5.46 (Ubuntu)
sieppl
3

jeśli twój plik csv znajduje się tak samo jak db, musisz usunąć LOCAL w LOAD DATA INFILE , albo otrzymasz błąd

Użyte polecenie nie jest dozwolone w tej wersji MySQL

wingoo
źródło
Zrobiło to dla mnie, ale potem musiałem również podążać za odpowiedzią Nelsona tutaj
Dominic
1

Innym sposobem jest użycie mysqlimportprogramu klienta.

Wywołujesz go w następujący sposób:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

To generuje LOAD DATAinstrukcję, która ładuje tableName.txtsię dotableName tabeli.

Pamiętaj o następujących kwestiach:

mysqlimportokreś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 jak tableName.1.txt, tableName.2.txt... itd, na przykład.

Schalk
źródło
1

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:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.
Oscar Nevarez
źródło
1

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)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

następnie:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
Jawad Al Shaikh
źródło
1

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;".

Midhunlal
źródło
0

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:

sudo service mysql restart

Następnie, jeśli chcę „odtworzyć” błąd, po prostu ponownie uruchamiam usługę Apache:

sudo service apache2 restart

Które można następnie naprawić, wprowadzając następujące polecenie:

sudo service mysql restart

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.

service mysqld restart
service httpd restart

Obowiązuje w dystrybucjach opartych na RedHat

bradymiller
źródło
0

Dla tych z Was, którzy szukają odpowiedzi, które sprawią, że LOAD DATA LOCALINFILE będzie działać tak jak ja, prawdopodobnie to zadziała. Cóż, to zadziałało dla mnie, więc oto jest. Zainstaluj perconajako 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 do terminali wpisując, mysql -u root -pa następnie hasło. Spróbuj uruchomić polecenie LOAD DATA LOCAL INFILEteraz .. Mam nadzieję, że zadziała :)

Przy okazji, pracowałem na Railsach 2.3 z Ruby 1.9.3 na Ubuntu 12.04.

Varun Natraaj
źródło
0

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 .

viejo
źródło
0

Dodaj local_infilew obu clienti mysqldsekcji.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Testowane w MySQL 8.x zarówno w systemie Windows, jak i Linux.

Madan Sapkota
źródło
0

Używam Xampp w wersji 3.2.4 i serwera mysql 8.0.20.

Dodałem local-infile=1do [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ć.

user7849670
źródło