MySQL:启用 LOAD DATA LOCAL INFILE

Posted

技术标签:

【中文标题】MySQL:启用 LOAD DATA LOCAL INFILE【英文标题】:MySQL: Enable LOAD DATA LOCAL INFILE 【发布时间】:2012-06-01 11:57:07 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

来自 MySQL 5.5 手册页:

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

你应该设置选项:

local-infile=1

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

mysql --local-infile -uroot -pyourpwd yourdbname

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

这是一个安全限制。

【讨论】:

谢谢。顺便说一句,我的机器(AWS EC2)中的my.cnf 路径是/etc/mysql/my.cnf 有趣的是,my.cnf 文件在我的 /etc 目录中。 如果仍然失败,关于去哪里的任何想法。我在 [client]、[mysqld] 和 [mysql] 下的 my.cnf 文件中添加了 local-infile=1,并使用了这些组合。所有结果都相同。我试过重新启动工作台,但没有运气。我也在每次更改之间停止并启动了 mySQL 工作台。 将 mySQL 更新到 6.2.5 为我解决了这个问题 答案是正确的方向。但对于那些面临这个问题的人来说,这是另一个问题。如果您在系统上启用了 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 服务。【参考方案2】:

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

【讨论】:

这绝对是在 Ubuntu 12.04 上为我解决的问题。 我也可以确认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] 放在 local-infile 行之前。【参考方案3】:

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

SET GLOBAL local_infile = true;

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

mysql -u user -p*

之后你可以通过命令查看状态:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

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

【讨论】:

我尝试了许多其他解决方案,但只有命令 SET GLOBAL local_infile = true; 有效。我的 MySQL 版本是 8.0.12。也许这是最新的解决方案。非常感谢。 不幸的是,重启服务器后变量再次关闭。 Mohit,我以某种方式解决了它,因为现在全局变量“local_infile”始终处于打开状态,即使在重新启动后也是如此。看来我没有为此使用 my.cnf 文件。请您尝试以 root 身份登录最新版本的 phpMyAdmin,转到变量部分,搜索“local_infile”,然后单击编辑,将其更改为 ON,最后按 Enter。成功了吗? 只有这个答案在 Windows 上的 8.0.12 MySQL Community Server 上对我有用。 我在 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,但使用 --load-infile=1 连接到 mysql工作mysql --local-infile=1 -u root -p【参考方案4】:

用原生驱动替换驱动php5-mysql

在 debian 上

apt-get install php5-mysqlnd

【讨论】:

这成功了!使用股票 aws 12.04 ubuntu,当我连接到 RDS 时,我需要“本地”。谢谢一百万! 非常感谢,这个解决方案对我有用。我已经问过问题***.com/questions/36526102/… 没有成功 ubuntu 12.04 又一位满意的客户! ubuntu 14.04 mysql 5.7【参考方案5】:

如果您在 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';

【讨论】:

【参考方案6】:

见下图……

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

所以总行是:

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

【讨论】:

这对我有用,而 SET GLOBAL .. 没有。 “源”命令 (\. file.sql) 是否以某种方式启动新会话或重置它?我没有尝试将设置放入 mmy sql 脚本中。【参考方案7】:

另外,对于其他读者,如果您尝试在 Django 中执行此操作,并且您的服务器允许 local_infile(您可以通过 mysql 客户端键入 SHOW VARIABLES 进行检查),那么您可以将其添加到您的 settings.py 文件(因为 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,
        ,
    

【讨论】:

你在哪里找到'OPTIONS' : 'local_infile':1, , 可以工作?【参考方案8】:

您必须注意如何建立 mysqli 连接。此解决方案的全部功劳归于 Jorge Albarenque,source

为了修复它,我必须:

将 local-infile=1 添加到 my.cnf 的 [mysqld] 和 [mysql] 部分(如上面的 cmets 中所述) 使用 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);

【讨论】:

@Mask 无法确认。我的解决方案在 5.5.46 (Ubuntu) 上运行【参考方案9】:

如果您的 csv 文件与 db 位于 same,则需要在 LOAD DATA INFILE 中删除 LOCAL, 否则你会得到错误

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

【讨论】:

这是为我做的,但后来我也不得不关注Nelson's answer here【参考方案10】:

clientmysqld 部分中添加local_infile

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

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

【讨论】:

【参考方案11】:

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

你调用它如下:

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

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

请记住以下几点:

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

【讨论】:

【参考方案12】:

这对我来说有点奇怪,从一天到下一天,几天以来一直在工作的脚本就停止工作了。没有更新版本的 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.

【讨论】:

【参考方案13】:

我使用了以下方法,该方法不需要对配置进行任何更改,在 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"

【讨论】:

【参考方案14】:

如果是 Mysql 5.7,您可以使用“显示全局变量,如“local_infile”;”这将给出本地 infile 状态,您可以使用“set global local_infile=ON;”打开它。

【讨论】:

【参考方案15】:

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

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

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

感谢以上所有建议。我终于找到了一个组合。

【讨论】:

【参考方案16】:

好的,这里发生了一些奇怪的事情。要使其工作,不需要在 /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】:

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

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

【讨论】:

【参考方案18】:

All:显然这是按设计工作的。请参阅 2019 年 7 月 23 日的新参考手册,第 6.1.6 节, LOAD DATA LOCAL 的安全问题

【讨论】:

【参考方案19】:

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

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

SET PERSIST local_infile = 1;

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

【讨论】:

为我工作,并且持续存在 - 但在版本 8.0.26 中找不到“mysqld-auto.cnf”。 “auto.cnf”存在但不包含设置。 @user947737 在 Windows 上,文件默认创建在“C:\ProgramData\MySQL\MySQL Server 8.0\Data”中。

以上是关于MySQL:启用 LOAD DATA LOCAL INFILE的主要内容,如果未能解决你的问题,请参考以下文章

mysql load data local infile问题

LOAD DATA LOCAL INFILE 在 MySQL 中只导入一行

Load data local infile 实验报告

如何在mysql-connector-java上允许LOAD DATA LOCAL INFILE?

LOAD DATA LOCAL INFILE 上的 Python2.7 MySQL 连接器错误

MySQL:驱动程序从 5 更新到 8 后,LOAD DATA LOCAL INFILE 不起作用