2010-11-18 24 views
45

Nel mio MySQL remoto, quando provo ad eseguire questa query, io sono sempre il codice di errore MySQL: 13.LOAD DATA INFILE Codice di errore: 13

Query -

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

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

a. 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 impostare l'autorizzazione di file e cartelle a chmod 777 (rwxrwxrwx) mediante FTP Strumento

+0

Stai dicendo che mysql remoto, è il posto csv in mysql remoto? – ajreal

+0

Da sistema MS Windows usando mysqlbench connesso al mysqldatabase remoto. Sì, il file csv risiede effettivamente nel server Linux remoto. – user292049

risposta

19

Questo è normalmente un problema di autorizzazioni di accesso ai file, ma io vedere la tua già indirizzamento che al punto B, ma vale la pena di andare oltre ogni evenienza . 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.

insufficiente autorizzazioni delle directory

L'errore in questo esempio ha portato perché il file che si sta tentando di importazione non è in una directory che è leggibile da parte dell'utente al server MySQL è in esecuzione come. Si noti che tutte le directory madri della directory devono essere leggibili dall'utente MySql affinché funzioni. Salvando il file il file in/tmp funzionerà normalmente come , di solito è leggibile (e scrivibile) da tutti gli utenti. Il codice di errore numero è 13. Source

EDIT:

Ricordate dovrai autorizzazioni non solo la cartella contiene il file, ma anche le directory superiori.

Esempio da this post sui forum MySql.

Se il file era contenuto all'interno del seguente strucutre: /tmp/imports/site1/data.file

si avrebbe bisogno (penso, 755 lavoravano) r + x per 'altri' su queste directory:

/tmp

/tmp/importazioni

oltre i due principali:

/tmp/importazioni/Site1

/tmp/imports/site1/data.file

È necessario il file e directory per essere leggibile 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.

+0

Ho provato ad usare LOAD DATA INFILE LOCALE. Ma sto ricevendo l'errore - Il comando usato non è permesso con questa versione di MySQL. La versione di mysql è 5.0.77 – user292049

+0

Ciao grazie per tornare indietro. Ho dato il permesso a tutte le directory, sottodirectory, file con drwxrwxrwx. Ricollegato i database, aggiornato e ancora non funziona. – user292049

+0

Wow, quello è davvero cattivo. Farò una caccia in giro. – JonVD

93

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 dovete fare se si vuole MySQL per essere in grado di leggere i file dalla directory "tmp":

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

Una volta che siete nel file, si sta andando a vedere un gruppo di directory che MySQL può uso. Aggiungere la riga /tmp/** rwk al file (non sono sicuro che sia importante dove, ma ecco un esempio di dove lo metto):

/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 quello che dovete 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 usare.

+0

Grazie, questo ha funzionato per me. – QCar

+1

L'aparmor è molto immaturo. Questa soluzione stava funzionando bene anche per me. Ma oggi è stato rifiutato il file perfettamente lavorato prima della sottocartella, che è stato registrato nel file con/UPPERFOLDER/* notazione rw. Ho dovuto aggiungere una riga che denomina quella sottocartella in modo esplicito! – halxinate

+0

Grazie, ha risolto anche il mio problema. – josete

12

C'è una proprietà nel file di configurazione di MySQL nella sezione [mysqld] con il nome - tmpdir

ad esempio:

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

e LOAD DATA INFILE comando può effettuare leggere e scrivere su questa posizione unica.

quindi se si inserisce il file nella posizione specificata, allora LOAD DATA INFILE può leggere/scrivere facilmente qualsiasi file.

Un'altra soluzione

possiamo importare dati dal seguente comando troppo

load data local infile 

In questo caso non v'è alcuna necessità di spostare file da TMPDIR, si può dare il percorso assoluto del file, ma per eseguire questo comando, è necessario modificare un valore di flag. La bandiera è

--local-infile 

si può cambiare il suo valore dal prompt dei comandi mentre ottenere l'accesso del mysql

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

Acclamazioni

+2

Grazie per questo, ha funzionato per me. Ho semplicemente copiato ciascun CSV che avevo bisogno di leggere prima in/tmp, poi ho eseguito LOAD DATA e ho risolto il problema del 'codice di errore 13'. – Botman

+0

Questo ha risolto anche il mio problema al codice 13. Ho migrato il mio file di registro lì e come per magia, ha funzionato (caricare i dati locali in infile "c: /temp/kmwdw.log") – abelito

46

Aggiungendo la parola 'LOCALE' alla mia domanda ha funzionato per me:

LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name 

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

+0

Questo ha funzionato per me. – SexyBeast

+1

Questo non funziona con MariaDB (almeno versione 10.0.22 su Linux x86_64): "Il comando usato non è permesso con questa versione di MariaDB" – jciloa

+1

@jciloa, Puoi aggiungere --local-infile = 1 o usare un [client ] opzione config di loose-local-infile (dalla memoria un po ', leggi su di esso) per consentire che sia permesso. L'accesso ai file locali tramite questo comando è un rischio per la sicurezza quindi non attivo per impostazione predefinita. – Breezer

4

io uso Ubuntu 12.04, ho dovuto creare la tabella, quindi effettuare una di queste:

Utilizzando locale dà un errore (mysql 5.5): comando

> 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 

LOAD DATA INFILE è disabilitato per default per ragioni di sicurezza, riattivare qui e dovrebbe funzionare: https://stackoverflow.com/a/16286112/445131

È possibile importare il file CSV utilizzando mysqlimport:

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

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

1

Se si utilizza Fedora/RHEL/CentOO è possibile disattivare temporaneamente SELinux:

setenforce 0 

caricare i dati e quindi attivare indietro:

setenforce 1 
+0

Per eseguire questa operazione sono necessarie le autorizzazioni di root. – bryant1410

5

errore 13 è nulla, ma i problemi di autorizzazione . Anche io avevo lo stesso numero e non ero in grado di caricare i dati nella tabella mysql e quindi ho risolto il problema da solo.

ecco la soluzione:

Bydefault il

--local-infile sia impostata sul valore 0

, inorder per usare CARICO DATA LOCAL INFILE deve essere abilitato .

Così Inizio mySQL come questo:

mysql -u nomeutente -p --local-infile

Questo renderà INFILE LOCALE attivato durante l'avvio e quindi non vi sia abituato qualsiasi problemi di utilizzo!

1

per gli utenti di Ubuntu

Io corro MySQL 5.6.28 su Ubuntu 15.10 e Ho appena incontrato lo stesso identico problema, ho avuto tutte le bandiere necessari in my.cnf tmpdir =/tmp local-infile = 1 mysql riavviato e vorrei ancora ottenere caricare codice DATA iNFILE errore: 13

Proprio come Nelson menzionate la questione era "AppArmor", sorta di mysql condiscendente sulle autorizzazioni, poi ho trovato la soluzione grazie a this quick & facile tutorial.

fondamentalmente, supponendo che il dir tmp sarebbe /tmp:

aggiungere nuove voci TMPDIR a /etc/apparmor.d/local/usr.sbin.mysqld

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

* aggiungere questo

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

Ricarica AppArmor

sudo service apparmor reload 

Riavvia MySQL

sudo service mysql restart 

Spero che ti aiuto pochi Ubuntu-ers

1

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

  • file di aggiornamento /etc/mysql/my.cnf con local-infile =1 a due posizioni dopo [mysql] paragrafi (questo permette di utilizzare LOCALE comando INFILE sql).

  • aggiornamento tramite sudo gedit /etc/apparmor.d/usr.sbin.mysqld così AppArmor vi permetterà 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).

0

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

Prima di tutto il mio ambiente di test sono le seguenti

  • Ubuntu 14.04.3 64bit
  • mysql Ver 14.14 Distrib 5.5.47, per debian-linux-gnu (x86_64) utilizzando readline 6.3 (installato da solo 'sudo apt-get install ...' comando)

miei risultati dei test sono

i) soluzione AppArmor funzionano solo per/tmp casi.

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

  • inizio client mysql con --in-file = 1 opzione
  • uso LOAD DATA LOCAL INFILE invece di LOAD DATA INFILE
  • controllo tutto elemento del percorso avere l'autorizzazione di lettura mondiale dal/al percorso del file di dati. Ad esempio, il seguente sottopath dovrebbe essere leggibile dal mondo o mysql leggibile dal gruppo se INFILE ha come target '/ home/hongsoog/study/mysql/memer.dat'

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

Quando si avvia l'opzione mysql client WITHOUT "--in-file = 1" e si utilizza

LOAD DATA LOCAL INFILE ...
, si otterrà

ERROR 1148 (42000): Il comando utilizzato non è consentito con questa versione di MySQL


In sintesi, "--in-file = 1" nel comando del client mysql e " LOAD DATA INFILE LOCALE ... "dovrebbe andare di pari passo.

Spero di essere utile a chiunque.

0

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

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

CentOS rilasciano 6.6 (finale) - 5.5.32 MySQL Community Server (GPL)

qualcosa legato al file di Linux autorizzazioni

+0

Questo non fornisce una risposta alla domanda. Puoi [cercare domande simili] (// stackoverflow.com/search), o fare riferimento alle domande correlate e collegate sul lato destro della pagina per trovare una risposta. Se hai una domanda correlata ma diversa, [fai una nuova domanda] (// stackoverflow.com/questions/ask) e includi un collegamento a questo per aiutare a fornire il contesto. Vedi: [Fai domande, ottieni risposte, senza distrazioni] (// stackoverflow.com/tour) –

0

Se si utilizza cPanel o phpmyadmin per importare CSV using LOAD DATA, assicurarsi di abilitare Use LOCAL keyword. Questo ha funzionato per me in un ambiente server condiviso.

0

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 lavorando 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) 
0

Se si sta utilizzando XAMPP su Mac, questo ha funzionato per me:

Lo spostamento del file CSV/TXT a/Applicazioni/XAMPP/xamppfiles/htdocs/come successivo

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