accesso negato per caricamento dati infile in MySQL


105

Uso sempre le query MySQL in PHP, ma quando ci provo

LOAD DATA INFILE

Ottengo il seguente errore

# 1045 - Accesso negato per l'utente 'user' @ 'localhost' (utilizzando la password: YES)

Qualcuno sa cosa significa?

Risposte:


197

Mi sono appena imbattuto anche in questo problema. Ho dovuto aggiungere LOCALalla mia istruzione SQL.

Ad esempio, questo dà il problema di autorizzazione:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Aggiungi LOCALalla tua dichiarazione e il problema delle autorizzazioni dovrebbe scomparire. Così:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
Questo fa una cosa diversa. Carica il tuo file sul server in una directory temporanea. Questo è necessario a volte, ma se il file è già sul server MySQL, stai solo facendo un lavoro ridondante.
jeffcook2150

1
sì, questo ha fatto il trucco per me, stavo inoltrando la porta del server del database su ssh e immagino che stesse cercando il file sul server del database remoto senza la parte LOCALE
Mike

2
@jeremysawesome per me questo produce il seguente errore: Codice di errore: 1148 Il comando utilizzato non è consentito con questa versione di MySQL. Ho provato alcune risposte per questo problema come la modifica del file mysql in local-infile = 1 e anche questo non è riuscito.
OrwellHindenberg

un aggiornamento di mySQL a 6.2.5 ha risolto questo problema per me
OrwellHindenberg

4
potresti anche dover chiamare mysql con l' --local-infileopzione.
shabbychef

32

Ho avuto questo problema. Ho cercato in giro e non ho trovato una risposta soddisfacente. Riassumo di seguito i risultati delle mie ricerche.

L'errore di accesso negato potrebbe significare che:

  • 'user' @ 'localhost' non ha il privilegio FILE ( GRANT FILE on *.* to user@'localhost'); o,
  • il file che stai tentando di caricare non esiste sulla macchina che esegue il server mysql (se stai usando LOAD DATA INFILE); o,
  • il file che stai tentando di caricare non esiste sulla tua macchina locale (se usi LOAD DATA LOCAL INFILE); o,
  • il file che stai tentando di caricare non è leggibile in tutto il mondo (è necessario che il file e tutte le directory principali siano leggibili in tutto il mondo: directory chmod 755; e chmod 744 file.dat)

+1: per me ha funzionato: il file che stai tentando di caricare non è leggibile in tutto il mondo (è necessario che il file e tutte le directory principali siano leggibili in tutto il mondo: directory chmod 755; e chmod 744 file.dat) . Non avevo cambiato i permessi su tutte le mie directory
gavdotnet il

1
L'utente Tatiana sottolinea che non è possibile concedere il privilegio FILE per database, solo per l'intero server. Il comando di concessione sarebbe "GRANT FILE on . To user @ 'localhost' IDENTIFIED BY 'password');"
JAL

3
@ JAL Penso che tu intenda "CONCEDERE FILE SU *. * All'utente ..." - probabilmente i caratteri asterisco sono stati rimossi
Eugene M

come ha detto @Eugene M questo dà un errore Uso non corretto di DB GRANT e GLOBAL PRIVILEGES
Accountant م

19

Prova a usare questo comando:

load data local infile 'home/data.txt' into table customer;

Questo dovrebbe funzionare. Ha funzionato nel mio caso.


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Stewart

@Stewart, rimuovi "local" dal comando precedente. Le versioni successive di mysql non sembrano supportare questo flag quando la variabile globale "local_infile" è impostata su "ON" (come sotto). Il comando quindi sarà; mysql> carica i dati infile 'home / data.txt' nella tabella customer; + --------------- + ------- + | Nome_variabile | Valore | + --------------- + ------- + | file_locale | ON | + --------------- + ------- +
Kamran Hyder

@KamranHyder Sembra che tu abbia una buona risposta per me. Perché non aggiungerlo come risposta completa?
Stewart

10

Assicurati che il tuo utente MySQL abbia il privilegio FILE concesso.

Se utilizzi un hosting Web condiviso, è possibile che venga bloccato dal tuo provider di hosting.


Su un web hosting condiviso: sarebbe utile utilizzare "LOAD DATA LOCAL INFILE"?
Peter

3

La stringa di Lione mi ha dato un ottimo consiglio: su Windows, dobbiamo usare slah e non backslash. Questo codice funziona per me:

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();

2

Mi sono imbattuto nello stesso problema e l'ho risolto seguendo questi passaggi:

  • attiva la variabile load_infile
  • grande autorizzazione file per il mio utente mysql personalizzato
  • disattivare la variabile secure_file_priv (il mio file è stato caricato dal webserver nella cartella / tmp che ovviamente non è la directory protetta di myslq / var / lib / mysql-file)

Per questo terzo punto, puoi fare riferimento a: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR,

ANNO DOMINI


2

È successo anche a me e nonostante abbia seguito tutti i passaggi descritti da Yamir nel suo post non sono riuscito a farlo funzionare.

Il file era in /tmp/test.csv con autorizzazioni 777. L'utente MySQL aveva i permessi sui file, l'opzione LOCALE non era consentita dalla mia versione di MySQL, quindi ero bloccato.

Finalmente sono riuscito a risolvere il problema eseguendo:

sudo chown mysql:mysql /tmp/test.csv

2

Ne ho trovato uno facile se stai usando la riga di comando

Accedi comemysql -u[username] -p[password] --local-infile

poi SET GLOBAL local_infile = 1;

seleziona il tuo database per use [db_name]

e infine LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


L'aggiunta di --local-inline mi ha aiutato. Tuttavia, la variabile globale local_infile era già impostata su ON nel mio caso. Penso che gli utenti facciano meglio a capire prima quale valore hanno scritto in questa variabile prima di modificarla.
Eugene Maysyuk il

Per gli utenti RDS => L'aggiunta di --local-infile mi ha aiutato su RDS, tuttavia SET GLOBAL local_infile = 1;non sembra funzionare in RDS, ma comunque senza che --local-infileabbia funzionato
Fatto

0

Ho scoperto che caricare le tabelle MySQL può essere veloce e indolore (stavo usando gli script di gestione modelli python / Django):

1) crea una tabella con tutte le colonne VARCHAR (n) NULL es:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2) rimuovi le intestazioni (prima riga) da csv, quindi carica (se dimentichi LOCAL, otterrai "# 1045 - Accesso negato per l'utente 'utente' @ 'localhost' (utilizzando la password: SI)"):

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3) modifica colonne:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

Ecco!


-5

Probabilmente significa che la password che hai fornito 'user'@'localhost'non è corretta.


1
Non credo proprio. Posso fare altre domande con la stessa password.
Brian
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.