MySQL:启用LOAD DATA LOCAL INFILE


127

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

我曾尝试在各个位置的配置中添加local-infile,但仍收到“此MySQL版本不允许使用的命令”

Answers:


197

在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”功能服务器端。

这是安全限制。


4
谢谢。顺便说一句,该my.cnf路径/etc/mysql/my.cnf在我的机器(AWS EC2)中。
SparkAndShine 2015年

有趣的是,my.cnf文件在我的/ etc目录中。
SgtRock

如果仍然失败,关于去哪里的任何想法。我已经在[client],[mysqld]和[mysql]下的my.cnf文件中添加了local-infile = 1,并使用了它们的组合。所有结果相同。我尝试过重新启动工作台,但是没有运气。在每个更改之间,我也停止并启动了mySQL工作台。
OrwellHindenberg

2
mySQL更新到6.2.5为我解决了这个问题
OrwellHindenberg

答案是正确的方向。但是对于那些面临这个问题的人来说,这是另一个陷阱。如果您在系统上启用了apparmor,但问题仍然存在,请检查syslog以查看mysqld守护程序是否被阻止。我有这个问题: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。解决方案非常简单。只需更新您的内容/etc/apparmor.d/local/usr.sbin.mysqld并重新加载apparmor服务即可。
狮子座

60

您应该编辑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上。


1
这绝对可以通过Ubuntu 12.04为我解决。
约翰·菲亚拉

4
我也可以确认 Ubuntu 14.04.2 LTS not working
艾因·托夫里

也适用于Mac。对于Mac用户,/mysql/my.cnf默认情况下不存在。只需创建目录和文件,然后将这些行粘贴到文件中即可。
郑刘

如果您不希望在升级mysql时覆盖此配置,则应将其放入更改配置后/etc/mysql/conf.d/enable-local-infile.cnf 也不要忘记sudo service mysql restart这样做,以使其生效。
斯蒂芬·奥斯特米勒

这是正确的解决方案。最高建议的解决方案没有提及您必须在本地文件行之前首先输入[mysqld]。
user3260912


27

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

SET GLOBAL local_infile = true;

我的意思是我通常先登录:

mysql -u user -p*

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

SHOW GLOBAL VARIABLES LIKE 'local_infile';

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


我尝试了许多其他解决方案,但只有该命令SET GLOBAL local_infile = true; 有效。我的MySQL版本是8.0.12。也许这是最新的解决方案。非常感谢。
mathsyouth 18/09/16

1
不幸的是,重新启动服务器后,该变量再次为OFF。
Pedro

Mohit,我以某种方式解决了它,因为现在即使重新启动后,全局变量'local_infile'始终为ON。看来我没有为此使用my.cnf文件。您能否以root用户身份登录到最新版本的PhpMyAdmin,请转到“变量”部分,搜索“ local_infile”,然后单击“编辑”,并将其更改为“开”,最后按Enter。奏效了吗?
Oleksiy Muzalyev,

2
8.0.12 MySQL Community Server在Windows 上,只有这个答案对我有用。
endo64

我有Windows Server 2016上安装了MySQL 8.0.16,我执行了SET GLOBAL local_infile = true;命令,但我仍然得到同样的错误ERROR 1148 (42000): The used command is not allowed with this MySQL version,但连接到MySQL与--load-INFILE = 1的工作mysql --local-infile=1 -u root -p
初中

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';

9

见下图...

我已经添加--local-infile=1到普通的mysql命令 mysql -u root -p

所以总行是:

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

在此处输入图片说明


这在SET GLOBAL ..没有的时候对我有用。“源”命令(\. file.sql)是否以某种方式启动了新会话或将其重置?我没有尝试将设置放入mmy sql脚本中。
toddkaufmann

5

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

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

3

您必须注意如何建立mysqli连接。此解决方案应归功于Jorge Albarenque,来源)

为了修复它,我必须:

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

问题在于,使用该功能可以显式启用对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);

1
@掩码无法确认。我的解决方案在5.5.46(Ubuntu)上运行
sieppl

3

如果您的CSV文件位于同一使用DB,您需要删除本地LOAD DATA INFILE,否则你会得到错误

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


这为我做到了,但是后来我也不得不遵循纳尔逊的回答
Dominic

1

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

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

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

这会生成一条LOAD DATA语句,并加载tableName.txttableName表中。

请注意以下几点:

mysqlimport根据您提供的文件确定表名;使用从文件名开头到第一个句点的所有文本作为表名。所以,如果你想几个文件加载到同一个表,你可以区分它们像tableName.1.txttableName.2.txt...等,例如。


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.

1

我使用了下面的方法,该方法不需要更改配置,并在mysql-5.5.51-winx64和5.5.50-MariaDB上进行了测试:

将“加载数据...”放在.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"

1

如果使用Mysql 5.7,则可以使用“显示全局变量,例如“ local_infile”;”。这将显示本地文件状态,您可以使用“ set global local_infile = ON;”将其打开。


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的发行版中有效


0

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

顺便说一句,我正在Ubuntu 12.04上使用Ruby 1.9.3开发Rails 2.3。


0

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


0

local_infileclientmysqld部分中都添加。

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

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


0

我正在使用xampp v3.2.4和mysql服务器8.0.20。

我添加local-infile=1[mysql][mysqld]在文件“my.ini的”。该文件位于“ C:\ xampp \ mysql \ bin \ my.ini”。

然后我使用以下代码从csv文件中插入了数据 LOAD DATA INFILE ...。重要的是移动LOCAL。否则它将无法正常工作。

感谢上述所有建议。结合终于为我解决了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.