MySQL: abilita LOAD DATA LOCAL INFILE


127

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

Ho provato ad aggiungere local-infile nella mia configurazione in vari punti ma sto ancora ottenendo il "comando utilizzato non è consentito con questa versione di MySQL"

Risposte:


197

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.


4
grazie. a proposito, il my.cnfpercorso è /etc/mysql/my.cnfnella mia macchina (AWS EC2).
SparkAndShine,

È interessante notare che il file my.cnf era nella directory / etc per me.
SgtRock,

Qualche idea su dove andare se questo non riesce ancora. Ho aggiunto local-infile = 1 al file my.cnf in [client], [mysqld] e [mysql] e ho usato combinazioni di questi. Tutti con gli stessi risultati. Ho provato a riavviare il banco di lavoro, ma senza fortuna. Ho interrotto e avviato anche il workbench mySQL tra ogni modifica.
OrwellHindenberg,

2
un aggiornamento di mySQL alla 6.2.5 ha risolto questo problema per me
OrwellHindenberg,

La risposta è nella giusta direzione Ma per coloro che affrontano questo problema ecco un altro gotcha. Se hai abilitato Apparmor sul tuo sistema e il problema persiste, controlla il syslog per vedere se il demone mysqld è bloccato. Ho avuto questo problema: 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.
Leone

60

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.


1
Questo ha sicuramente risolto il problema con Ubuntu 12.04.
John Fiala,

4
Posso anche confermare Ubuntu 14.04.2 LTS not working.
Ain Tohvri,

Funziona anche per Mac. Per l'utente Mac, /mysql/my.cnfnon esiste per impostazione predefinita. Basta creare la directory e il file e incollare queste righe nel file.
Zheng Liu,

Se non vuoi che questa configurazione venga sovrascritta quando mysql viene aggiornato, dovresti metterlo in /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.
Stephen Ostermiller,

Questa è la soluzione corretta La soluzione più votata non menziona la necessità di inserire [mysqld] prima della riga local-infile.
user3260912,


27

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.


Ho provato molte altre soluzioni, ma funziona solo il comando SET GLOBAL local_infile = true; . La mia versione di MySQL è 8.0.12. Forse questa è l'ultima soluzione. Grazie mille.
Mathsyouth,

1
Sfortunatamente la variabile è di nuovo OFF dopo aver riavviato il server.
Pedro,

Mohit, in qualche modo l'ho risolto, perché ora la variabile globale 'local_infile' è sempre attiva, anche dopo il riavvio. E sembra che non abbia usato il file my.cnf per questo. Potresti, per favore, provare ad accedere a PhpMyAdmin, ultima versione, come root, andare alla sezione Variabili, cercare 'local_infile', quindi fare clic su Modifica e cambiarlo in ON, e infine premere Invio. Ha funzionato?
Oleksiy Muzalyev,

2
Solo questa risposta ha funzionato per me 8.0.12 MySQL Community Serversu Windows.
endo64,

Ho MySQL 8.0.16 installato su Windows Server 2016, ho eseguito il 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
Junior

13

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';

9

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

inserisci qui la descrizione dell'immagine


Questo ha funzionato per me quando 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.
toddkaufmann,

5

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,
        },
    }
}

3

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:

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

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

1
@Mask Impossibile confermare. La mia soluzione è in esecuzione su 5.5.46 (Ubuntu)
sieppl

3

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


Questo è stato per me, ma poi ho anche dovuto seguire la risposta di Nelson qui
Dominic,

1

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.


1

È 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.

1

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"

1

Nel caso in cui Mysql 5.7 è possibile utilizzare "mostra variabili globali come" local_infile ";" che fornirà lo stato del file locale, È possibile attivarlo utilizzando "set global local_infile = ON;".


0

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


0

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.


0

Tutto: evidentemente funziona come previsto. Si prega di consultare il nuovo referente datato 2019-7-23, Sezione 6.1.6, Problemi di sicurezza con LOAD DATA LOCAL .


0

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.


0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.