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