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.