MySQL: Abilita LOAD DATA INFILE LOCALE

Sto eseguendo Mysql 5.5 su Ubuntu 12 LTS. Come dovrei abilitare LOAD DATA LOCAL INFILE in my.cnf?

Ho provato ad aggiungere local-infile nella mia configurazione in vari punti, ma sto ancora ricevendo il messaggio “Il comando usato non è permesso con questa versione di MySQL”

Dalla pagina di manuale di MySQL 5.5:

LOCAL funziona solo se il tuo server e il tuo client sono stati entrambi configurati per permetterlo. Ad esempio, se mysqld è stato avviato con –local-infile = 0, LOCAL non funziona. Vedi Sezione 6.1.6, “Problemi di sicurezza con LOAD DATA LOCAL”.

Dovresti 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 tua sezione [mysqld] per abilitare il lato del server di funzionalità “local infile”.

È una limitazione di sicurezza.

Il file my.cnf da 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à fornite, basta individuarle nel file e aggiungere infile localmente sotto ciascuna di esse.

Funziona per me su MySQL 5.5 su Ubuntu 12.04 LTS.

Sostituisci il driver php5-mysql con il driver nativo

Su debian

 apt-get install php5-mysqlnd 

Nel caso in cui il tuo gusto di mysql su ubuntu NON funzioni in nessun caso e tu riceva ancora l’errore 1148, puoi eseguire il comando load data infile tramite la riga di comando

apri una finestra di terminale

esegui mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

ti verrà richiesto di inserire la password di mysqluser

eseguirai MySQLMonitor e il tuo prompt dei comandi sarà mysql>

esegui il tuo comando di load data infile (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'; 

Inoltre, per altri lettori, se stai cercando di farlo in Django E il tuo server consente local_infile (puoi controllare digitando SHOW VARIABLES tramite un client mysql) quindi puoi aggiungerlo al tuo file settings.py (dal momento che python MySQLdb non lo fa) 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 fare attenzione a come stabilisci la tua connessione mysqli. Pieno merito per questa soluzione va a Jorge Albarenque, fonte

Per sistemarlo ho dovuto:

  • Aggiungi local-infile = 1 alle sezioni [mysqld] e [mysql] di my.cnf (come spiegato nei commenti sopra)
  • Utilizzare la funzione mysqli_real_connect ( documentazione PHP ).

Il problema è che con quella funzione puoi 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); 

Ho risolto questo problema su MySQL 8.0.11 con il comando terminale mysql:

 SET GLOBAL local_infile = true; 

Voglio dire, ho effettuato l’accesso prima con il solito:

 mysql -u user -p* 

Dopodiché puoi vedere lo stato con il comando:

 SHOW GLOBAL VARIABLES LIKE 'local_infile'; 

Dovrebbe essere ON. Non scriverò sulla sicurezza rilasciata con il caricamento dei file locali nel database qui.

Un altro modo è utilizzare il programma client mysqlimport .

Lo invochi come segue:

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

Questo genera un’istruzione LOAD DATA che carica tableName.txt nella tabella tableName .

Tieni presente quanto segue:

mysqlimport determina il nome della tabella dal file che fornisci; utilizzando tutto il testo dall’inizio del nome del file fino al primo periodo come nome della tabella. Quindi, se si desidera caricare più file sulla stessa tabella, è ansible distinguerli come tableName.1.txt , tableName.2.txt , …, etc, ad esempio.

Vedi sotto immagine …

Ho aggiunto --local-infile=1 al normale comando mysql -u root -p

Quindi la linea totale sarebbe:

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

inserisci la descrizione dell'immagine qui

se il tuo file csv si trova nello stesso modo con db, devi rimuovere LOCAL in LOAD DATA INFILE , o otterrai l’errore

Il comando usato non è permesso con questa versione di MySQL

Questo è stato un po ‘strano per me, da un giorno all’altro il copione che ha funzionato da giorni non funziona più. Non c’era una versione più recente di MySQL o alcun tipo di aggiornamento, ma stavo ottenendo lo stesso errore, quindi proverò il file CSV e noterò che la fine delle righe stava usando \ n invece del previsto (secondo il mio script ) \ r \ n quindi lo salvo con il giusto EOL ed eseguo di nuovo lo script senza problemi.

Penso che sia un po ‘strano per mysql dirmi che il comando usato non è permesso con questa versione di MySQL poiché la ragione era completamente diversa.

Il mio comando di lavoro si presenta così:

 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. 

Nel caso in cui Mysql 5.7 puoi usare “mostra variabili globali come” local_infile “;” che darà lo stato di infile locale, Puoi triggersrlo usando “set global local_infile = ON;”.

Ok, sta succedendo qualcosa di strano qui. Per fare in modo che funzioni, NON è necessario apportare modifiche alla configurazione in /etc/mysql/my.cnf. Tutto quello che devi fare è riavviare il servizio mysql corrente 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 riparato inserendo il seguente comando:

 sudo service mysql restart 

Quindi, sembra che apache2 stia facendo qualcosa per non permettere questa funzione all’avvio (che viene poi invertita / corretta se si 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 funzionare LOAD DATA INFILE LOCAL come me, questo potrebbe probabilmente funzionare. Beh, ha funzionato per me, quindi ecco qui. Installa percona come server e client mysql seguendo i passaggi dal link. Durante l’installazione verrà richiesta una password, quindi fornisci quella che ricorderai e userai in seguito. Una volta completata l’installazione, riavviare il sistema e verificare se il server è attivo e in esecuzione andando al terminal e digitando mysql -u root -p e quindi la password. Prova a eseguire il comando LOAD DATA LOCAL INFILE ora .. Spero che funzioni 🙂

A proposito, stavo lavorando su Rails 2.3 con Ruby 1.9.3 su Ubuntu 12.04.

Ho usato il metodo below, che non richiede alcuna modifica nella configurazione , testato su mysql-5.5.51-winx64 e 5.5.50-MariaDB:

inserisci “carica dati …” nel file .sql (ad esempio: 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 [email protected] -Ddatabasename -e "source D:\Work\LoadTableName.sql"