MySQL: Ativar LOFI DATA LOCAL INFILE

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

Eu tentei adicionar local-infile na minha configuração em vários lugares, mas eu ainda estou recebendo o “O comando usado não é permitido com esta versão do MySQL”

Na página de manual do MySQL 5.5:

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

Você deve definir a opção:

local-infile=1 

na sua input [mysql] do arquivo my.cnf ou ligue para 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 seção [mysqld] para ativar o lado do servidor de resources do “infil local”.

É uma restrição de segurança.

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

 sudo nano /etc/mysql/my.cnf 

Em seguida, adicione:

 [mysqld] local-infile [mysql] local-infile 

Os headers [mysqld] e [mysql] já são fornecidos, apenas localize-os no arquivo e adicione o infile local abaixo de cada um deles.

Isso funciona para mim no MySQL 5.5 no Ubuntu 12.04 LTS.

Substitua o driver php5-mysql pelo driver nativo

No debian

 apt-get install php5-mysqlnd 

no caso de seu sabor do mysql no Ubuntu não sob quaisquer circunstâncias funcionar e você ainda obter o erro 1148, você pode executar o comando load data infile via linha de comando

abrir uma janela de terminal

execute 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 comando load data infile (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'; 

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 via um cliente mysql) então você pode adicionar isto ao seu arquivo settings.py (já que python MySQLdb não faz isso) 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, }, } } 

Você tem que cuidar de como você estabelece sua conexão mysqli. O crédito total por esta solução vai para Jorge Albarenque, fonte

Para consertar eu tive que:

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

O problema é que com essa function você pode habilitar explicitamente o suporte para LOAD DATA LOCAL INFILE. Por exemplo (estilo de procedimento):

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

ou object orientado

 $mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true); $mysqli->real_connect($host, $username, $password, $database); 

Outra maneira é usar o programa cliente mysqlimport .

Você invoca da seguinte maneira:

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

Isso gera uma instrução LOAD DATA que carrega tableName.txt na tabela tableName .

Tenha em mente o seguinte:

mysqlimport determina 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 na mesma tabela, você poderia distingui-los como tableName.1.txt , tableName.2.txt , …, etc, por exemplo.

Veja abaixo a imagem …

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

Então linha total seria:

mysql –local-infile = 1 -u root -p

insira a descrição da imagem aqui

Eu resolvi este problema no MySQL 8.0.11 com o comando mysql terminal:

 SET GLOBAL local_infile = true; 

Quer dizer, eu 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 ON. Eu não estarei escrevendo sobre segurança emitida com o carregamento de arquivos locais no database aqui.

Se o seu arquivo csv localizado mesmo com db, você precisa remover LOCAL em LOAD DATA INFILE , ou você receberá o erro

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

Isso foi um pouco estranho para mim, de um dia para o próximo o script que tem funcionado desde os dias simplesmente parou de funcionar. Não havia uma versão mais nova do mysql ou qualquer tipo de atualização, mas eu estava recebendo o mesmo erro, então eu dei uma última tentativa ao arquivo CSV e notei que o fim das linhas estava usando \ n em vez do esperado (por meu script ) \ r \ n, portanto, salve-o com o EOL correto e execute o script novamente sem problemas.

Eu acho que é meio estranho para o mysql me dizer que o comando usado não é permitido com esta versão do MySQL já que o motivo era 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. 

No caso, se o Mysql 5.7 você pode usar “show global variables like” local_infile “;” que dará o status infile local, Você pode ativá-lo usando “set global local_infile = ON;”.

Ok, algo estranho está acontecendo aqui. Para que isso funcione, NÃO é necessário fazer nenhuma alteração na configuração em /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 reinicie o serviço do apache:

 sudo service apache2 restart 

O qual 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 quando ele é inicializado (o que é então invertido / corrigido se o serviço mysql for reiniciado).

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

 service mysqld restart service httpd restart 

Válido em distribuições baseadas em RedHat

Para aqueles que estão procurando respostas para fazer o LOAD DATA LOCAL INFILE funcionar como eu, isso provavelmente funcionará. Bem, funcionou para mim, então aqui vai. Instale o percona como seu servidor e cliente mysql, seguindo os passos do link. Uma senha será solicitada durante a instalação, portanto, forneça uma que você se lembre e use-a posteriormente. Uma vez terminada a instalação, reinicie o seu sistema e teste se o servidor está funcionando, indo ao terminal e digitando mysql -u root -p e então a senha. Tente executar o comando LOAD DATA LOCAL INFILE agora .. Espero que funcione 🙂

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

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 ‘load data …’ 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"