Respostas:
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.
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.mysqld
e recarregar o serviço apparmor.
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.
Ubuntu 14.04.2 LTS not working
também.
/mysql/my.cnf
não existe por padrão. Apenas crie o diretório e o arquivo e cole essas linhas no arquivo.
/etc/mysql/conf.d/enable-local-infile.cnf
Também não se esqueça de sudo service mysql restart
depois de fazer a alteração de configuração para que ele entre em vigor.
Substitua o driver php5-mysql pelo driver nativo
No debian
apt-get install php5-mysqlnd
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.
SET GLOBAL local_infile = true;
funciona. Minha versão do MySQL é 8.0.12. Talvez esta seja a solução mais recente. Muito obrigado.
8.0.12 MySQL Community Server
no Windows.
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 version
mas a conexão com o mysql com --load-infile = 1 funcionou #mysql --local-infile=1 -u root -p
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 infile
comando (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';
Veja a imagem abaixo ...
Eu adicionei --local-infile=1
ao comando mysql normal mysql -u root -p
Então a linha total seria:
mysql --local-infile = 1 -u raiz -p
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.
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,
},
}
}
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:
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);
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
Outra maneira é usar o mysqlimport
programa cliente.
Você o invoca da seguinte maneira:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
Isso gera uma LOAD DATA
instrução que carrega tableName.txt
notableName
tabela.
Lembre-se do 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 para a mesma mesa que você poderia distingui-los como tableName.1.txt
, tableName.2.txt
, ..., etc, por exemplo.
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.
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"
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
Para aqueles que procuram respostas para fazer o LOAD DATA LOCAL
INFILE funcionar como eu, isso provavelmente pode funcionar. Bem, funcionou para mim, então aqui vai. Instale percona
como 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 terminal
e digitando mysql -u root -p
e, em seguida, 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.
Adicione local_infile
ambos client
e mysqld
seção.
[client]
local_infile=1
...
[mysqld]
local_infile=1
...
Testado no MySQL 8.x no Windows e Linux.
Estou usando o xampp v3.2.4 e o mysql server 8.0.20.
Eu adicionei local-infile=1
a [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.
my.cnf
caminho está/etc/mysql/my.cnf
na minha máquina (AWS EC2).