MySQL: Ativar LOAD DATA INFILE LOCAL

127

Estou executando o Mysql 5.5 no Ubuntu 12 LTS. Como habilitar LOAD DATA LOCAL INFILE no my.cnf?

Eu tentei adicionar infile local na minha configuração em vários lugares, mas ainda estou recebendo o "O comando usado não é permitido nesta versão do MySQL"

Krt_Malta
fonte

Respostas:

197

Na página de manual do MySQL 5.5:

LOCAL funciona apenas se o servidor e o cliente tiverem sido configurados para permitir isso. Por exemplo, se o mysqld foi iniciado com --local-infile = 0, LOCAL não funcionará. Consulte a Seção 6.1.6, “Problemas de segurança com LOAD DATA LOCAL”.

Você deve definir a opção:

local-infile=1

na sua entrada [mysql] do arquivo my.cnf ou chame o cliente mysql com a opção --local-infile :

mysql --local-infile -uroot -pyourpwd yourdbname

Você precisa ter certeza de que o mesmo parâmetro também está definido na sua seção [mysqld] para ativar o recurso "local infile" do lado do servidor.

É uma restrição de segurança.

dAm2K
fonte
4
THX. Aliás, o my.cnfcaminho está /etc/mysql/my.cnfna minha máquina (AWS EC2).
SparkAndShine
Curiosamente, o arquivo my.cnf estava no diretório / etc para mim.
SgtRock 01/07/2015
Alguma idéia de onde ir se isso ainda falhar. Adicionei local-infile = 1 ao arquivo my.cnf em [client], [mysqld] e [mysql] e usei combinações deles. Tudo com os mesmos resultados. Eu tentei reiniciar o ambiente de trabalho, mas sem sorte. Parei e iniciei o ambiente de trabalho mySQL entre cada alteração também.
OrwellHindenberg
2
uma atualização do MySQL para 6.2.5 resolveu este problema para mim
OrwellHindenberg
A resposta está na direção certa. Mas para quem enfrenta esse problema, aqui está outra pegadinha. Se você tiver o apparmor ativado no sistema e o problema persistir, verifique o syslog para ver se o daemon mysqld está sendo bloqueado. Eu tive esse problema: apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33. A solução é muito simples. Basta atualizar o seu /etc/apparmor.d/local/usr.sbin.mysqlde recarregar o serviço apparmor.
Leo
60

O arquivo my.cnf que você deve editar é o arquivo /etc/mysql/my.cnf . Somente:

sudo nano /etc/mysql/my.cnf

Adicione então:

[mysqld]
local-infile 

[mysql]
local-infile 

Os cabeçalhos [mysqld] e [mysql] já são fornecidos, basta localizá-los no arquivo e adicionar local-infile embaixo de cada um deles.

Funciona para mim no MySQL 5.5 no Ubuntu 12.04 LTS.

hlosukwakha
fonte
1
Definitivamente, isso foi corrigido para mim com o Ubuntu 12.04.
31812 John Fiala
4
Eu posso confirmar Ubuntu 14.04.2 LTS not workingtambém.
Ain Tohvri
Também funciona para Mac. Para usuários de Mac, /mysql/my.cnfnão existe por padrão. Apenas crie o diretório e o arquivo e cole essas linhas no arquivo.
Zheng Liu
Se você não quiser que esta configuração para obter substituído quando mysql é atualizado, você deve colocar isso em /etc/mysql/conf.d/enable-local-infile.cnf Também não se esqueça de sudo service mysql restartdepois de fazer a alteração de configuração para que ele entre em vigor.
Stephen Ostermiller 29/10/19
Esta é a solução adequada. A solução mais votada não menciona que você deve colocar o [mysqld] primeiro antes da linha local-infile.
user3260912 12/02
30

Substitua o driver php5-mysql pelo driver nativo

No debian

apt-get install php5-mysqlnd
BeniSK
fonte
Isso funcionou! Usando o stock aws 12.04 ubuntu, eu precisava de 'local', pois estou me conectando ao RDS. Graças um milhão!
James Bowler
Muito obrigado, esta solução funcionou para mim. Eu fiz a pergunta stackoverflow.com/questions/36526102/…
user75472
Sem sucesso ubuntu 12.04
Zbyszek
outro cliente feliz! Ubuntu 14.04 mysql 5.7
nodoze
27

Resolvi esse problema no MySQL 8.0.11 com o comando do terminal mysql:

SET GLOBAL local_infile = true;

Quero dizer, entrei primeiro com o habitual:

mysql -u user -p*

Depois disso, você pode ver o status com o comando:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Deve estar ligado. Não escreverei sobre segurança emitida com o carregamento de arquivos locais no banco de dados aqui.

Oleksiy Muzalyev
fonte
Eu tentei muitas outras soluções, mas apenas o comando SET GLOBAL local_infile = true; funciona. Minha versão do MySQL é 8.0.12. Talvez esta seja a solução mais recente. Muito obrigado.
Mathsyouth # 16/18
1
Infelizmente, a variável está desativada novamente após reiniciar o servidor.
Pedro
Mohit, de alguma forma eu resolvi, porque agora a variável global 'local_infile' está sempre LIGADA, mesmo após a reinicialização. E parece que não usei o arquivo my.cnf para isso. Você poderia, por favor, tentar fazer login no PhpMyAdmin, versão mais recente, como root, ir para a seção Variáveis, procurar por 'local_infile', clicar em Editar e alterá-lo para ON e, finalmente, pressionar Enter. Funcionou?
Oleksiy Muzalyev
2
Somente esta resposta funcionou para mim 8.0.12 MySQL Community Serverno Windows.
Endo64
Eu tenho o MySQL 8.0.16 instalado no servidor Windows 2016, eu executei o SET GLOBAL local_infile = true;comando, mas ainda estou recebendo o mesmo erro, ERROR 1148 (42000): The used command is not allowed with this MySQL versionmas a conexão com o mysql com --load-infile = 1 funcionou #mysql --local-infile=1 -u root -p
Junior
13

caso o seu sabor do mysql no ubuntu NÃO funcione sob nenhuma circunstância e você ainda receba o erro 1148, poderá executar o load data infile comando via linha de comando

abrir uma janela do terminal

corre mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

você será solicitado a inserir a senha do mysqluser

você estará executando o MySQLMonitor e seu prompt de comando será mysql>

execute seu load data infilecomando (não esqueça de terminar com um ponto e vírgula; )

como isso:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Tony Gil
fonte
9

Veja a imagem abaixo ...

Eu adicionei --local-infile=1ao comando mysql normal mysql -u root -p

Então a linha total seria:

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

insira a descrição da imagem aqui

Jagadeesh Pulamarasetti
fonte
Isso funcionou para mim quando SET GLOBAL ..não. Um comando 'source' ( \. file.sql) de alguma forma inicia uma nova sessão ou redefine isso? Eu não tentei colocar a configuração no script mmy sql.
toddkaufmann
5

Além disso, para outros leitores, se você estiver tentando fazer isso no Django E seu servidor permitir local_infile (você pode verificar digitando SHOW VARIABLES por meio de um cliente mysql), poderá adicioná-lo ao seu arquivo settings.py (já que o python MySQLdb não ' Por padrão, leia o arquivo .my.cnf):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}
brfox
fonte
3

Você deve tomar cuidado ao estabelecer sua conexão mysqli. Crédito total para esta solução vai para Jorge Albarenque, fonte

Para corrigi-lo, tive que:

  • Adicione local-infile = 1 às seções [mysqld] e [mysql] do my.cnf (como explicado nos comentários acima)
  • Use a função mysqli_real_connect ( documentação do PHP ).

O problema é que, com essa função, você pode ativar explicitamente o suporte para LOAD DATA LOCAL INFILE. Por exemplo (estilo processual):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

ou orientado a objeto

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);
sieppl
fonte
1
@Mask Não pode confirmar. Minha solução está sendo executada em 5.5.46 (Ubuntu)
sieppl
3

se o seu arquivo csv estiver localizado da mesma forma que o db, você precisará remover LOCAL no LOAD DATA INFILE ou obterá o erro

O comando usado não é permitido com esta versão do MySQL

wingoo
fonte
Isso fez isso por mim, mas então eu também tinha que seguir a resposta de Nelson aqui
Dominic
1

Outra maneira é usar o mysqlimportprograma cliente.

Você o invoca da seguinte maneira:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

Isso gera uma LOAD DATAinstrução que carrega tableName.txtnotableName tabela.

Lembre-se do seguinte:

mysqlimportdetermina o nome da tabela do arquivo que você fornece; usando todo o texto desde o início do nome do arquivo até o primeiro período como o nome da tabela. Então, se você deseja carregar vários arquivos para a mesma mesa que você poderia distingui-los como tableName.1.txt, tableName.2.txt, ..., etc, por exemplo.

Schalk
fonte
1

Isso foi um pouco estranho para mim, de um dia para o outro o script que trabalha desde os dias para de funcionar. Não havia uma versão mais recente do mysql ou qualquer tipo de atualização, mas eu estava recebendo o mesmo erro, então eu dou uma última tentativa ao arquivo CSV e percebo que o final das linhas estava usando \ n em vez do esperado (de acordo com meu script ) \ r \ n, salve-o com a EOL correta e execute o script novamente sem problemas.

Eu acho que é meio estranho o mysql me dizer. O comando usado não é permitido nesta versão do MySQL, pois o motivo foi completamente diferente.

Meu comando de trabalho é assim:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.
Oscar Nevarez
fonte
1

Eu usei o método abaixo, que não requer nenhuma alteração na configuração , testado no mysql-5.5.51-winx64 e 5.5.50-MariaDB:

coloque 'carregar dados ...' no arquivo .sql (ex: LoadTableName.sql)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

então:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
Jawad Al Shaikh
fonte
1

No caso do Mysql 5.7, você pode usar "show variáveis ​​globais como" local_infile ";" que fornecerá o status de infile local. Você pode ativá-lo usando "set global local_infile = ON;".

Midhunlal
fonte
0

Ok, algo estranho está acontecendo aqui. Para fazer isso funcionar, NÃO é necessário fazer alterações na configuração do /etc/mysql/my.cnf. Tudo que você precisa fazer é reiniciar o serviço mysql atual no terminal:

sudo service mysql restart

Então, se eu quiser "recriar" o bug, simplesmente reinicio o serviço apache:

sudo service apache2 restart

Que pode ser corrigido novamente digitando o seguinte comando:

sudo service mysql restart

Portanto, parece que o apache2 está fazendo algo para não permitir esse recurso ao iniciar (que é revertido / corrigido se reiniciar o serviço mysql).

Válido em distribuições baseadas no Debian.

service mysqld restart
service httpd restart

Válido em distribuições baseadas em RedHat

bradymiller
fonte
0

Para aqueles que procuram respostas para fazer o LOAD DATA LOCALINFILE funcionar como eu, isso provavelmente pode funcionar. Bem, funcionou para mim, então aqui vai. Instale perconacomo servidor e cliente mysql seguindo as etapas do link. Uma senha será solicitada durante a instalação, portanto, forneça uma que você lembrará e a use mais tarde. Quando a instalação estiver concluída, reinicie o sistema e teste se o servidor está em funcionamento, indo para terminale digitando mysql -u root -pe, em seguida, a senha. Tente executar o comando LOAD DATA LOCAL INFILEagora .. Espero que funcione :)

BTW eu estava trabalhando no Rails 2.3 com Ruby 1.9.3 no Ubuntu 12.04.

Varun Natraaj
fonte
0

Todos: Evidentemente, isso está funcionando como projetado. Consulte o novo ref man datado de 2019-7-23, Seção 6.1.6, Problemas de segurança com LOAD DATA LOCAL .

viejo
fonte
0

Adicione local_infileambos cliente mysqldseção.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Testado no MySQL 8.x no Windows e Linux.

Madan Sapkota
fonte
0

Estou usando o xampp v3.2.4 e o mysql server 8.0.20.

Eu adicionei local-infile=1a [mysql]e [mysqld]no arquivo "my.ini". O arquivo está localizado em "C: \ xampp \ mysql \ bin \ my.ini".

Em seguida, inseri os dados do arquivo csv usando o seguinte código LOAD DATA INFILE .... É importante mover LOCAL. Caso contrário, não funcionará.

Obrigado por todas as sugestões acima. Uma combinação finalmente funcionou para mim.

user7849670
fonte