我在Ubuntu 12 LTS上运行Mysql 5.5。我应该如何在my.cnf中启用LOAD DATA LOCAL INFILE?
我已经尝试在我的配置中在各个地方添加local-infile,但我仍然得到“此MySQL版本不允许使用的命令”
答案 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)
答案 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
为了解决这个问题,我不得不:
使用该功能可以明确启用对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.txt
,tableName.2.txt
,...等等。
答案 9 :(得分:2)
在local_infile
和client
部分中添加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”配置文件中,然后在服务或服务器重启后更改将被记住。