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】:在client
和mysqld
部分中添加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.txt
、tableName.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 中只导入一行
如何在mysql-connector-java上允许LOAD DATA LOCAL INFILE?