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?

Brian
fonte

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}
jeremysawesome
fonte
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)
Yamir Encarnacion
fonte
+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.

shreyas-agrawal
fonte
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.

Tanerkay
fonte
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();
Matthias Wuttke
fonte
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

user7996813
fonte
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
Giacomo
fonte
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;

Shantanu Khond
fonte
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à!

magula
fonte
-5

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

David Grant
fonte
1
Acho que não. Posso fazer outras consultas com a mesma senha.
Brian