Odpowiedzi:
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.
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.
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.
Ubuntu 14.04.2 LTS not working.
/mysql/my.cnfdomyś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ż o sudo service mysql restartdokonaniu zmiany konfiguracji, aby odniosła skutek.
Zastąp sterownik php5-mysql natywnym sterownikiem
W debianie
apt-get install php5-mysqlnd
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.
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 Serverw 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 versionale 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 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';
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
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):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'myname',
'PASSWORD': 'mypass',
'HOST': 'myserver',
'PORT': '3306',
'OPTIONS' : {
'local_infile':1,
},
}
}
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):
$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);
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
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.
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.
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"
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
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.
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.
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ć.
my.cnfścieżka jest/etc/mysql/my.cnfw moim komputerze (AWS EC2).