CARICAMENTO DATI INFILE Codice errore: 13

Nel mio MySQL remoto, quando provo a eseguire questa query, ottengo il codice di errore MySQL: 13.

Query –

LOAD DATA INFILE '/httpdocs/.../.../testFile.csv' INTO TABLE table_temp FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\r \\n' (sku, qty); 

Codice errore: 13 Can't get stat of '/httpdocs/.../.../testFile.csv' (Errcode: 2)

un. Il database userlogin ha tutti i privilegi di concessione.

 CREATE USER 'userName'@'%' IDENTIFIED BY '************'; GRANT ALL PRIVILEGES ON * . * TO 'userName'@'%' IDENTIFIED BY '************' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON `userName\_%` . * TO 'userName'@'%'; 

b. Ho anche impostato l’authorization per file e cartelle su chmod 777 (rwxrwxrwx) usando FTP Tool

So che questo post è vecchio, ma questo risulta ancora nei risultati di ricerca. Non sono riuscito a trovare la soluzione a questo problema online, quindi ho finito per capirlo da solo. Se stai usando Ubuntu, c’è un programma chiamato “Apparmor” che impedisce a MySQL di vedere il file. Ecco cosa devi fare se vuoi che MySQL sia in grado di leggere i file dalla directory “tmp”:

 sudo vim /etc/apparmor.d/usr.sbin.mysqld 

Una volta che sei nel file, vedrai un sacco di directory che MySQL può usare. Aggiungi la riga /tmp/** rwk al file (non sono sicuro che sia importante dove, ma ecco un esempio di dove l’ho messo):

  /etc/mysql/*.pem r, /etc/mysql/conf.d/ r, /etc/mysql/conf.d/* r, /etc/mysql/*.cnf r, /usr/lib/mysql/plugin/ r, /usr/lib/mysql/plugin/*.so* mr, /usr/sbin/mysqld mr, /usr/share/mysql/** r, /var/log/mysql.log rw, /var/log/mysql.err rw, /var/lib/mysql/ r, /var/lib/mysql/** rwk, /tmp/** rwk, /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid w, /var/run/mysqld/mysqld.sock w, /run/mysqld/mysqld.pid w, /run/mysqld/mysqld.sock w, 

Ora tutto ciò che devi fare è ricaricare Apparmor:

 sudo /etc/init.d/apparmor reload 

Nota Ho usato “vim”, ma lo sostituisco con qualunque sia il tuo editor di testo preferito che sai come usare.

L’aggiunta della parola chiave “LOCAL” alla mia query ha funzionato per me:

 LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name 

Una descrizione dettagliata della parola chiave può essere trovata qui .

Questo è normalmente un problema di permessi di accesso ai file, ma vedo già il tuo indirizzo al punto b, ma vale la pena di andare oltre nel caso. Un’altra opzione è quella di usare LOAD DATA LOCAL INFILE che supera molti di questi problemi di permessi di accesso ai file. Per utilizzare questo metodo è necessario copiare il file localmente (nella cartella mysql è meglio) prima. • Se viene specificato LOCAL, il file viene letto dal programma client sull’host del client e inviato al server.

Autorizzazioni directory insufficienti

L’errore in questo esempio è dovuto al fatto che il file che stai tentando di importare non si trova in una directory che è leggibile dall’utente in cui il server MySql è in esecuzione. Si noti che tutte le directory madri della directory devono essere leggibili dall’utente MySql affinché funzioni. Il salvataggio del file in / tmp funzionerà normalmente in quanto è generalmente leggibile (e scrivibile) da tutti gli utenti. Il numero del codice di errore è 13. Origine

MODIFICARE:

Ricorda che avrai bisogno di permessi non solo sulla cartella che contiene il file ma anche sulle directory superiori.

Esempio da questo post sui forum MySql.

Se il file era contenuto nella seguente strucutre: /tmp/imports/site1/data.file

avresti bisogno (penso, 755 ha funzionato) r + x per “altro” su queste directory:

/ tmp

/ tmp / importazioni

Così come i due principali:

/ Tmp / importazioni / sito1

/tmp/imports/site1/data.file

È necessario che il file e la directory siano leggibili da tutti. Mi scuso se hai già provato questo metodo ma potrebbe valere la pena di ripercorrere i tuoi passi, non fa mai male ricontrollare.

C’è una proprietà nel file di configurazione mysql nella sezione [mysqld] con nome – tmpdir

per esempio:

 tmpdir = c:/temp (Windows) or tmpdir = /tmp (Linux) 

e il comando LOAD DATA INFILE può eseguire operazioni di lettura e scrittura solo su questa posizione.

quindi se metti il ​​tuo file nella posizione specificata, LOAD DATA INFILE può leggere / scrivere facilmente qualsiasi file.

Un’altra soluzione

possiamo importare i dati anche seguendo il comando

 load data local infile 

In questo caso non è necessario spostare il file su tmpdir, è ansible fornire il percorso assoluto del file, ma per eseguire questo comando, è necessario modificare un valore di flag. La bandiera è

 --local-infile 

puoi cambiarne il valore con il prompt dei comandi mentre accedi a mysql

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

Saluti

L’errore 13 non è altro che i problemi di authorization. Anche io ho avuto lo stesso problema e non è stato in grado di caricare i dati nella tabella mysql e quindi ho risolto il problema da solo.

Ecco la soluzione:

Di default il

–local-infile è impostato su 0

, per poter utilizzare LOAD DATA LOCAL INFILE, deve essere abilitato.

Quindi avvia mySQL in questo modo:

mysql -u username -p –local-infile

Ciò renderà LOCAL INFILE abilitato durante l’avvio e quindi non ci saranno problemi ad usarlo!

Io uso Ubuntu 12.04, ho dovuto creare la tabella, quindi fare uno di questi:

Usando local dà un errore (mysql 5.5):

 > LOAD DATA LOCAL INFILE "file.csv" INTO table inverter FIELDS TERMINATED BY ','; ERROR 1148 (42000): The used command is not allowed with this MySQL version 

Il comando LOAD DATA INFILE è disabilitato per impostazione predefinita per motivi di sicurezza, ritriggerslo qui e dovrebbe funzionare: https://stackoverflow.com/a/16286112/445131

Puoi importare il file csv usando mysqlimport:

 mysqlimport -u root -p --fields-terminated-by=',' --local dbname tablename.csv 

Nota che il file csv deve avere lo stesso nome prima dell’estensione della tabella.

Se stai usando Fedora / RHEL / CentOO puoi disabilitare temporaneamente SELinux:

 setenforce 0 

Carica i tuoi dati e poi riabilitali:

 setenforce 1 

per gli utenti di Ubuntu

Sto eseguendo mysql 5.6.28 su Ubuntu 15.10 e mi sono imbattuto nello stesso identico problema, ho avuto tutti i flag necessari in my.cnf tmpdir = / tmp local-infile = 1 ha riavviato mysql e vorrei ancora ottenere LOAD DATA INFILE Codice di errore: 13

Proprio come Nelson ha menzionato che il problema era “apparmor”, una specie di mysql condiscendente sulle autorizzazioni, quindi ho trovato la soluzione grazie a questo tutorial rapido e facile.

in pratica, supponendo che la tua directory tmp sia /tmp :

Aggiungi nuove voci di tmpdir a /etc/apparmor.d/local/usr.sbin.mysqld

 sudo nano /etc/apparmor.d/local/usr.sbin.mysqld 

*Aggiungi questo

 /tmp/ r, /mnt/foo/tmp/** rw, 

Ricarica AppArmor

 sudo service apparmor reload 

Riavvia MySQL

 sudo service mysql restart 

Spero che possa aiutare alcuni Ubuntu-ers

Ho avuto un sacco di problemi per risolvere questo problema, ci sono due cose da fare:

  • aggiorna il file /etc/mysql/my.cnf con local-infile =1 in due posizioni dopo i paragrafi [mysql] (questo permette di usare il comando sql LOCALE INFILE).

  • aggiorna tramite sudo gedit /etc/apparmor.d/usr.sbin.mysqld modo che apparmor ti permetta di scrivere nei file speciali di /var/www/ aggiungendo le linee:

/name of your directory/ r,

/name of your directory/* rw,

Il nome della directory può essere come /var/www/toto/ (questo consente di utilizzare la directory in cui si trovano i file).

Ho riscontrato lo stesso problema e ho applicato le soluzioni di cui sopra.

Prima di tutto il mio ambiente di test sono i seguenti

  • Ubuntu 14.04.3 64 bit
  • mysql Ver 14.14 Distrib 5.5.47, per debian-linux-gnu (x86_64) usando readline 6.3 (installato solo dal comando ‘sudo apt-get install …’)

I miei risultati dei test sono

i) La soluzione AppArmor funziona solo per i casi / tmp.

ii) La seguente soluzione funziona senza la soluzione AppArmor. Mi piacerebbe apprezzare Avnish Mehta per la sua risposta.

 $ mysql -u root -p --in-file=1 ... mysql> LOAD DATA LOCAL INFILE '/home/hongsoog/study/mysql/member.dat' -> INTO TABLE member_table; 

Importanti tre punti sono

  • avvia il client mysql con l’opzione –in-file = 1
  • utilizzare LOAD DATA INFILE LOCALE invece di LOAD DATA INFILE
  • controlla tutti gli elementi del percorso hanno l’authorization di lettura mondiale dal / al percorso del file di dati. Ad esempio, il seguente sottopath dovrebbe essere leggibile dal mondo o il gruppo mysql leggibile se INFILE ha il targeting per “/home/hongsoog/study/mysql/memer.dat”

    • /casa
    • / Home / hongsoog
    • / Home / hongsoog / studio / mysql
    • /home/hongsoog/study/mysql/member.data

Quando si avvia mysql client WITHOUT “–in-file = 1” opzione e uso

  CARICARE DATI LOCALI INFILE ... 

, otterrete

ERRORE 1148 (42000): il comando usato non è consentito con questa versione di MySQL


In sintesi, l’opzione “–in-file = 1” nel comando client mysql e “LOAD DATA INFILE LOCALE …” dovrebbero andare di pari passo.

Spero di essere utile a chiunque.

load data infile '/root/source/in.txt' into table employee; ==> Codice errore: 13

load data infile '/tmp/in.txt' into table employee; ==> funziona

CentOS versione 6.6 (Finale) – 5.5.32 MySQL Community Server (GPL)

qualcosa relativo alle autorizzazioni dei file Linux

Se stai utilizzando cPanel o phpmyadmin per importare il CSV using LOAD DATA assicurati di abilitare Use LOCAL keyword . Questo ha funzionato per me in un ambiente server condiviso.

VECCHIO:

 LOAD DATA INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; File '/home/root12/Downloads/task1.csv' not found (Errcode: 13 - Permission denied) 

NUOVO LAVORO PER ME:

 LOAD DATA LOCAL INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; Query OK, 500 rows affected, 284 warnings (1.24 sec) Query OK, 5000 rows affected, 2846 warnings (1.24 sec) 

Se stai usando XAMPP su Mac, questo ha funzionato per me:

Spostando il file CSV / TXT in / Applicazioni / XAMPP / xamppfiles / htdocs / come segue

 LOAD DATA LOCAL INFILE '/Applications/XAMPP/xamppfiles/htdocs/file.csv' INTO TABLE `tablename` FIELDS TERMINATED BY ',' LINES TERMINATED BY ';'