MySQL:启用LOAD DATA LOCAL INFILE

时间:2012-05-25 23:00:14

标签: mysql

我在Ubuntu 12 LTS上运行Mysql 5.5。我应该如何在my.cnf中启用LOAD DATA LOCAL INFILE?

我已经尝试在我的配置中在各个地方添加local-infile,但我仍然得到“此MySQL版本不允许使用的命令”

18 个答案:

答案 0 :(得分:191)

从MySQL 5.5手册页:

  

LOCAL仅在您的服务器和客户端都已用时才有效   配置为允许它。例如,如果启动了mysqld   --local-infile = 0,LOCAL不起作用。请参见第6.1.6节“LOAD DATA LOCAL的安全问题”。

您应该设置选项:

local-infile=1

进入my.cnf文件的 [mysql] 条目或使用 - local-infile 选项调用mysql客户端:

mysql --local-infile -uroot -pyourpwd yourdbname

您必须确保在 [mysqld] 部分中定义了相同的参数,以启用“本地infile”功能服务器端。

这是一项安全限制。

答案 1 :(得分:55)

您应编辑的my.cnf文件是 /etc/mysql/my.cnf 文件。只是:

sudo nano /etc/mysql/my.cnf

然后添加:

[mysqld]
local-infile 

[mysql]
local-infile 

标题 [mysqld] [mysql] 已经给出,只需在文件中找到它们并在每个文件下面添加 local-infile 他们。

它适用于Ubuntu 12.04 LTS上的MySQL 5.5。

答案 2 :(得分:29)

用本机驱动程序替换驱动程序php5-mysql

关于debian

apt-get install php5-mysqlnd

答案 3 :(得分:13)

如果您在ubuntu上的mysql风格在任何情况下都没有工作并且您仍然得到1148错误,您可以通过命令行运行load data infile命令

打开终端窗口

运行mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

您将被要求插入mysqluser密码

您将运行MySQLMonitor,您的命令提示符将为mysql>

运行您的load data infile命令(别忘了以分号结尾;

像这样:

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

答案 4 :(得分:13)

我在mysql 8.0.11上使用mysql终端命令解决了这个问题:

SET GLOBAL local_infile = true;

我的意思是我先用通常的方式登录:

mysql -u user -p*

之后,您可以使用以下命令查看状态:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

它应该是开的。在这里,我不会写有关将本地文件加载到数据库中发出的安全性的信息。

答案 5 :(得分:6)

见下图...

我已将--local-infile=1添加到正常的mysql命令mysql -u root -p

所以总计将是:

  

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

enter image description here

答案 6 :(得分:4)

此外,对于其他读者,如果您尝试在Django中执行此操作并且您的服务器允许local_infile(您可以通过mysql客户端键入SHOW VARIABLES进行检查),那么您可以将其添加到 settings.py < / strong>文件(因为python MySQLdb默认不读取.my.cnf文件):

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

答案 7 :(得分:3)

您必须注意如何建立mysqli连接。这个解决方案完全归功于Jorge Albarenque,source

为了解决这个问题,我不得不:

  • 将local-infile = 1添加到my.cnf的[mysqld]和[mysql]部分(如上面的评论所述)
  • 使用mysqli_real_connect函数(PHP documentation)。

使用该功能可以明确启用对LOAD DATA LOCAL INFILE的支持。例如(程序风格):

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

或面向对象

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

答案 8 :(得分:2)

另一种方法是使用mysqlimport客户端程序。

您可以按如下方式调用它:

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

这会生成LOAD DATA语句,将tableName.txt加载到tableName表中。

请记住以下内容:

mysqlimport根据您提供的文件确定表名;使用从文件名开头到第一个句点的所有文本作为表名。因此,如果您希望将多个文件加载到同一个表格中,则可以将它们区分为tableName.1.txttableName.2.txt,...等等。

答案 9 :(得分:2)

local_infileclient部分中添加mysqld

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

在Windows和Linux的MySQL 8.x中进行了测试。

答案 10 :(得分:1)

这对我来说有点奇怪,从一天到下一天,自从几天停止工作以来一直在工作的剧本。没有更新版本的mysql或任何类型的升级,但我得到了相同的错误,所以我最后尝试CSV文件,并注意到行的结尾使用\ n而不是预期的(根据我的脚本) )\ r \ n所以我用正确的EOL保存它并再次运行脚本没有任何麻烦。

我觉得mysql有点奇怪告诉我这个MySQL版本不允许使用这个命令,原因完全不同。

我的工作命令如下:

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.

答案 11 :(得分:1)

我使用了以下方法,其中不需要对配置进行任何更改,在mysql-5.5.51-winx64和5.5.50-MariaDB上进行测试:

放入&#39;加载数据......&#39;在.sql文件中(例如: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);

然后:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"

答案 12 :(得分:1)

如果是Mysql 5.7,你可以使用“show global variables like”local_infile“;”它将提供本地infile状态,您可以使用“set global local_infile = ON;”打开它。

答案 13 :(得分:1)

如果您的csv文件与db 相同,则需要删除 LOAD DATA INFILE 中的 LOCAL , 或者你会得到错误

  

此MySQL版本不允许使用used命令

答案 14 :(得分:0)

对于那些寻找让LOAD DATA LOCAL INFILE像我一样工作的答案的人来说,这可能会有用。嗯它对我有用,所以就这样吧。按照链接中的步骤安装percona作为您的mysql服务器和客户端。在安装过程中将提示输入密码,因此请提供您将记住并稍后使用的密码。一个安装完成,重新启动系统并通过转到terminal并输入mysql -u root -p然后输入密码来测试服务器是否已启动并运行。现在尝试运行命令LOAD DATA LOCAL INFILE ..希望它有效:)

BTW我在Ubuntu 12.04上使用Ruby 1.9.3开发Rails 2.3。

答案 15 :(得分:0)

全部:显然,这按设计进行。请参阅日期为2019-7-23的新参考资料的第6.1.6节 LOAD DATA LOCAL的安全问题

答案 16 :(得分:0)

好的,这里发生了一些奇怪的事情。要使其工作,不需要在/etc/mysql/my.cnf中进行任何配置更改。您需要做的就是在终端重新启动当前的mysql服务:

sudo service mysql restart

然后,如果我想“重新创建”该错误,我只需重新启动apache服务:

sudo service apache2 restart

然后可以通过输入以下命令再次修复:

sudo service mysql restart

因此,似乎apache2正在做一些不允许此功能的事情 当它启动时(如果重启mysql服务则反转/纠正)。

在基于Debian的发行版中有效。

service mysqld restart
service httpd restart

在基于RedHat的发行版中有效

答案 17 :(得分:0)

我知道这不完全是 OP 所要求的,但是由于该线程已经很老了,而且这里提出的解决方案都不适合我,所以我决定分享这个。

如果有人在 MySql 版本 8 中启用 local_infile 时遇到问题,这里的这个命令对我有用:

SET PERSIST local_infile = 1;

它将配置保存在“mysqld-auto.cnf”配置文件中,然后在服务或服务器重启后更改将被记住。