Risposte:
Dalla pagina di manuale di MySQL 5.5:
LOCAL funziona solo se il server e il client sono stati entrambi configurati per consentirlo. Ad esempio, se mysqld è stato avviato con --local-infile = 0, LOCAL non funziona. Vedere la Sezione 6.1.6, "Problemi di sicurezza con LOAD DATA LOCAL".
È necessario impostare l'opzione:
local-infile=1
nella tua voce [mysql] del file my.cnf o chiama il client mysql con l' opzione --local-infile :
mysql --local-infile -uroot -pyourpwd yourdbname
Devi essere sicuro che lo stesso parametro sia definito anche nella sezione [mysqld] per abilitare il lato server della funzione "local infile".
È una limitazione di sicurezza.
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. La soluzione è molto semplice. Basta aggiornare il tuo /etc/apparmor.d/local/usr.sbin.mysqlde ricaricare il servizio apparmor.
Il file my.cnf che dovresti modificare è il file /etc/mysql/my.cnf . Appena:
sudo nano /etc/mysql/my.cnf
Poi aggiungi:
[mysqld]
local-infile
[mysql]
local-infile
Le intestazioni [mysqld] e [mysql] sono già indicate, basta localizzarle nel file e aggiungere local-infile sotto ciascuna di esse.
Funziona per me su MySQL 5.5 su Ubuntu 12.04 LTS.
Ubuntu 14.04.2 LTS not working.
/mysql/my.cnfnon esiste per impostazione predefinita. Basta creare la directory e il file e incollare queste righe nel file.
/etc/mysql/conf.d/enable-local-infile.cnf Inoltre non dimenticare di sudo service mysql restartaver fatto la modifica della configurazione in modo che abbia effetto.
Sostituire il driver php5-mysql con il driver nativo
Su debian
apt-get install php5-mysqlnd
Ho risolto questo problema su MySQL 8.0.11 con il comando mysql terminal:
SET GLOBAL local_infile = true;
Voglio dire, ho effettuato prima l'accesso con il solito:
mysql -u user -p*
Dopodiché puoi vedere lo stato con il comando:
SHOW GLOBAL VARIABLES LIKE 'local_infile';
Dovrebbe essere acceso. Non scriverò sulla sicurezza rilasciata con il caricamento di file locali nel database qui.
SET GLOBAL local_infile = true; . La mia versione di MySQL è 8.0.12. Forse questa è l'ultima soluzione. Grazie mille.
8.0.12 MySQL Community Serversu Windows.
SET GLOBAL local_infile = true;comando ma sto ancora ottenendo lo stesso errore ERROR 1148 (42000): The used command is not allowed with this MySQL versionma la connessione a mysql con --load-infile = 1 ha funzionatomysql --local-infile=1 -u root -p
nel caso in cui il tuo sapore di mysql su Ubuntu NON funzioni in nessun caso e tu ricevi ancora l'errore 1148, puoi eseguire il load data infilecomando dalla riga di comando
aprire una finestra terminale
correre mysql -u YOURUSERNAME -p --local-infile YOURDBNAME
ti verrà richiesto di inserire la password mysqluser
eseguirai MySQLMonitor e il tuo prompt dei comandi sarà mysql>
esegui il tuo load data infilecomando (non dimenticare di terminare con un punto e virgola ; )
come questo:
load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Vedi sotto l'immagine ...
Ho aggiunto --local-infile=1al normale comando mysql mysql -u root -p
Quindi la linea totale sarebbe:
mysql --local-infile = 1 -u root -p
SET GLOBAL ..no. Un comando 'source' ( \. file.sql) in qualche modo avvia una nuova sessione o reimposta? Non ho provato a mettere l'impostazione nello script mmy sql.
Inoltre, per altri lettori, se stai provando a farlo in Django E il tuo server consente local_infile (puoi verificare digitando SHOW VARIABLES tramite un client mysql), puoi aggiungerlo al tuo file settings.py (dal momento che python MySQLdb non lo fa ' t per impostazione predefinita leggere il file .my.cnf):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'myname',
'PASSWORD': 'mypass',
'HOST': 'myserver',
'PORT': '3306',
'OPTIONS' : {
'local_infile':1,
},
}
}
Devi stare attento a come stabilire la tua connessione mysqli. Il merito completo di questa soluzione va a Jorge Albarenque, fonte
Per risolverlo ho dovuto:
Il problema è che con quella funzione è possibile abilitare esplicitamente il supporto per LOAD DATA LOCAL INFILE. Ad esempio (stile procedurale):
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);
o orientato agli oggetti
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);
se il tuo file csv si trova nello stesso modo con db, devi rimuovere LOCAL in LOAD DATA INFILE , altrimenti otterrai l'errore
Il comando utilizzato non è consentito con questa versione di MySQL
Un altro modo è utilizzare il mysqlimportprogramma client.
Lo invochi come segue:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
Questo genera LOAD DATAun'istruzione che viene caricata tableName.txtnella tableNametabella.
Tieni presente quanto segue:
mysqlimportdetermina il nome della tabella dal file fornito; usando tutto il testo dall'inizio del nome del file fino al primo punto come nome della tabella. Quindi, se si desidera caricare più file nella stessa tabella, è possibile distinguerli come tableName.1.txt, ad esempio tableName.2.txt, ..., ecc.
È stato un po 'strano per me, da un giorno all'altro la sceneggiatura che ha funzionato da giorni smette di funzionare. Non c'era una versione più recente di mysql o alcun tipo di aggiornamento ma stavo ottenendo lo stesso errore, quindi faccio un ultimo tentativo sul file CSV e noto che la fine delle righe utilizzava \ n invece del previsto (secondo il mio script ), quindi lo salvo con l'EOL giusto ed eseguo di nuovo lo script senza problemi.
Penso che sia strano per mysql dirmi che il comando usato non è permesso con questa versione di MySQL poiché il motivo era completamente diverso.
Il mio comando funzionante è simile al seguente:
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.
Ho usato il metodo seguente, che non richiede alcun cambiamento nella configurazione , testato su mysql-5.5.51-winx64 e 5.5.50-MariaDB:
inserisci 'load data ...' nel file .sql (es: 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);
poi:
mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
Ok, sta succedendo qualcosa di strano qui. Per farlo funzionare, NON è necessario apportare modifiche alla configurazione in /etc/mysql/my.cnf. Tutto quello che devi fare è riavviare l'attuale servizio mysql nel terminale:
sudo service mysql restart
Quindi, se voglio "ricreare" il bug, riavvio semplicemente il servizio apache:
sudo service apache2 restart
Che può quindi essere risolto di nuovo inserendo il seguente comando:
sudo service mysql restart
Quindi, sembra che apache2 stia facendo qualcosa per non consentire questa funzione all'avvio (che viene quindi invertita / corretta se riavvia il servizio mysql).
Valido nelle distribuzioni basate su Debian.
service mysqld restart
service httpd restart
Valido nelle distribuzioni basate su RedHat
Per quelli di voi che cercano risposte per far LOCALfunzionare LOILE DATA INFILE come me, questo potrebbe probabilmente funzionare. Bene ha funzionato per me, quindi eccolo qui. Installa perconacome server e client mysql seguendo i passaggi dal link. Durante l'installazione verrà richiesta una password, quindi fornirne una che ricorderete e usarla in seguito. Una volta terminata l'installazione, riavvia il sistema e verifica se il server è attivo e funzionante andando su terminale digitando mysql -u root -pe quindi la password. Prova a eseguire il comando LOAD DATA LOCAL INFILEora .. Spero che funzioni :)
A proposito, stavo lavorando su Rails 2.3 con Ruby 1.9.3 su Ubuntu 12.04.
Aggiungere local_infilein entrambi cliente mysqldsezione.
[client]
local_infile=1
...
[mysqld]
local_infile=1
...
Testato in MySQL 8.x sia in Windows che in Linux.
Sto usando xampp v3.2.4 e mysql server 8.0.20.
Ho aggiunto local-infile=1al [mysql]e [mysqld]nel file "my.ini". Il file si trova in "C: \ xampp \ mysql \ bin \ my.ini".
Quindi ho inserito i dati dal file CSV utilizzando il seguente codice LOAD DATA INFILE .... È importante spostare LOCAL. Altrimenti non funzionerà.
Grazie per tutti i suggerimenti sopra. Una combinazione finalmente ha funzionato per me.
my.cnfpercorso è/etc/mysql/my.cnfnella mia macchina (AWS EC2).