acesso negado para carregamento de dados infil em MySQL


105

Eu uso consultas MySQL o tempo todo em PHP, mas quando tento

LOAD DATA INFILE

Estou tendo o erro a seguir

# 1045 - Acesso negado para o usuário 'usuário' @ 'localhost' (usando senha: SIM)

Alguém sabe o que isso significa?

Respostas:


197

Eu também encontrei esse problema. Eu tive que adicionar LOCALà minha instrução SQL.

Por exemplo, isso dá o problema de permissão:

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

Acrescente LOCALà sua declaração e o problema de permissões deve desaparecer. Igual a:

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

12
Isso faz uma coisa diferente. Ele carrega seu arquivo para o servidor em um diretório temporário. Isso às vezes é necessário, mas se o infile já estiver no servidor MySQL, você está apenas fazendo um trabalho redundante.
jeffcook2150

1
sim, isso funcionou para mim, eu estava encaminhando a porta do servidor de banco de dados por ssh e acho que ele estava procurando o arquivo no servidor de banco de dados remoto sem a parte LOCAL
mike

2
@jeremysawesome para mim, isso produz o seguinte erro: Código de erro: 1148 O comando usado não é permitido com esta versão do MySQL. Tentei algumas respostas para esse problema, como modificar o arquivo mysql para local-infile = 1 e também falhou.
OrwellHindenberg

uma atualização do mySQL para 6.2.5 resolveu este problema para mim
OrwellHindenberg

4
você também pode ter que chamar mysql com a --local-infileopção.
shabbychef

32

Eu tive esse problema. Procurei e não encontrei uma resposta satisfatória. Resumo abaixo os resultados das minhas pesquisas.

O erro de acesso negado pode significar que:

  • 'user' @ 'localhost' não tem o privilégio FILE ( GRANT FILE on *.* to user@'localhost'); ou,
  • o arquivo que você está tentando carregar não existe na máquina que está executando o servidor mysql (se estiver usando LOAD DATA INFILE); ou,
  • o arquivo que você está tentando carregar não existe em sua máquina local (se estiver usando LOAD DATA LOCAL INFILE); ou,
  • o arquivo que você está tentando carregar não pode ser lido por todos (você precisa que o arquivo e todos os diretórios pais sejam legíveis por todos: diretório chmod 755; e chmod 744 arquivo.dat)

+1: Isso funcionou para mim: o arquivo que você está tentando carregar não pode ser lido por todos (você precisa que o arquivo e todos os diretórios pai sejam legíveis por todos: diretório chmod 755; e chmod 744 arquivo.dat) . Eu não tinha alterado as permissões em todos os meus diretórios
gavdotnet

1
A usuária Tatiana ressalta que você não pode conceder o privilégio FILE por banco de dados, apenas para todo o servidor. O comando de concessão seria "GRANT FILE on . To user @ 'localhost' IDENTIFIED BY 'password');"
JAL

3
@JAL Acho que você quer dizer "GRANT FILE ON *. * To user ..." - provavelmente os caracteres de asterisco foram removidos
Eugene M

como @Eugene M disse que isso dá um erro Uso incorreto de DB GRANT e GLOBAL PRIVILEGES
Contador م

19

Tente usar este comando:

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

Isso deve funcionar. Funcionou no meu caso.


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

@Stewart, remova 'local' do comando acima. Versões posteriores do mysql parecem não suportar este sinalizador quando a variável global 'local_infile' é definida como 'ON' (como abaixo). O comando, portanto, será; mysql> carregar dados infile 'home / data.txt' na tabela do cliente; + --------------- + ------- + | Variable_name | Valor | + --------------- + ------- + | local_infile | ON | + --------------- + ------- +
Kamran Hyder de

@KamranHyder Parece que você tem uma boa resposta para mim. Por que não adicioná-lo como uma resposta completa?
Stewart de

10

Certifique-se de que seu usuário MySQL tenha o privilégio FILE concedido.

Se você estiver em hospedagem compartilhada na web, existe uma chance de que isso seja bloqueado pelo seu provedor de hospedagem.


Em uma hospedagem compartilhada na web: seria útil usar "LOAD DATA LOCAL INFILE"?
Peter,

3

A string de Lyon me deu uma dica muito boa: no Windows, precisamos usar slahes e não backslashes. Este código funciona para mim:

    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

Encontrei o mesmo problema e resolvi-o seguindo estas etapas:

  • ativar a variável load_infile
  • permissão de grande arquivo para meu usuário mysql personalizado
  • desative a variável secure_file_priv (meu arquivo foi enviado pelo servidor da web para a pasta / tmp que, obviamente, não é o diretório seguro de myslq / var / lib / mysql-file)

Para este terceiro ponto, você pode consultar: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR,

DE ANÚNCIOS


2

Isso também aconteceu comigo e apesar de ter seguido todos os passos descritos por Yamir em seu post não consegui fazer funcionar.

O arquivo estava em /tmp/test.csv com 777 permissões. O usuário do MySQL tinha permissões de arquivo, a opção LOCAL não era permitida pela minha versão do MySQL, então eu estava preso.

Finalmente, consegui resolver o problema executando:

sudo chown mysql:mysql /tmp/test.csv

2

Achei fácil se você estiver usando linha de comando

Entrar comomysql -u[username] -p[password] --local-infile

então SET GLOBAL local_infile = 1;

selecione seu banco de dados por use [db_name]

e finalmente 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;


Adicionar --local-inline me ajudou. No entanto, a variável global local_infile já foi definida como ON no meu caso. Acho melhor os usuários descobrirem primeiro que valor escreveram nesta variável antes de modificá-la.
Eugene Maysyuk

Para usuários de RDS => Adicionar o --local-infile me ajudou no RDS, porém SET GLOBAL local_infile = 1;não parece funcionar no RDS, mas de qualquer forma sem isso --local-infilefuncionou
Fato

0

Descobri que carregar tabelas MySQL pode ser rápido e fácil (eu estava usando scripts de gerenciador de modelos python / Django):

1) criar tabela com todas as colunas VARCHAR (n) NULL, por exemplo:

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


 2) remova os cabeçalhos (primeira linha) do csv e carregue (se você esquecer o LOCAL, receberá “# 1045 - Acesso negado para o usuário 'usuário' @ 'localhost' (usando senha: SIM)”):

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) alterar colunas:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voilà!


-5

Provavelmente significa que a senha fornecida 'user'@'localhost'está incorreta.


1
Acho que não. Posso fazer outras consultas com a mesma senha.
Brian
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.