I'm running Mysql 5.5 on Ubuntu 12 LTS. How should I enable LOAD DATA LOCAL INFILE in my.cnf?
I've tried adding local-infile in my config at various places but I'm still getting the "The used command is not allowed with this MySQL version"
I'm running Mysql 5.5 on Ubuntu 12 LTS. How should I enable LOAD DATA LOCAL INFILE in my.cnf?
I've tried adding local-infile in my config at various places but I'm still getting the "The used command is not allowed with this MySQL version"
从 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”功能服务器端。
这是一个安全限制。
您应该编辑的 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。
我使用 mysql 终端命令在 MySQL 8.0.11 上解决了这个问题:
SET GLOBAL local_infile = true;
我的意思是我先用通常的方式登录:
mysql -u user -p*
之后,您可以使用以下命令查看状态:
SHOW GLOBAL VARIABLES LIKE 'local_infile';
它应该打开。我不会在这里写关于将本地文件加载到数据库中的安全性。
用原生驱动替换驱动php5-mysql
在 Debian 上
apt-get install php5-mysqlnd
如果您在 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';
此外,对于其他读者,如果您尝试在 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,
},
}
}
添加local_infile
和mysql
部分mysqld
。
[mysql]
local_infile=1
...
[mysqld]
local_infile=1
...
在 Windows 和 Linux 中的 MySQL 8.x 中进行了测试。
如果您的 csv 文件与 db相同,则需要在LOAD DATA INFILE中删除LOCAL,否则会出现错误
此 MySQL 版本不允许使用的命令
您必须注意如何建立 mysqli 连接。该解决方案的全部功劳归于 Jorge Albarenque,来源
为了解决它,我必须:
问题在于,使用该功能,您可以显式启用对 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);
我知道这并不完全是 OP 所要求的,但由于这个线程已经很老了,而且这里提出的解决方案都不适合我,所以我决定分享这个。
如果有人在 MySql 版本 8 中启用 local_infile 时遇到问题,这里的命令对我有用:
SET PERSIST local_infile = 1;
它将配置保留在“mysqld-auto.cnf”配置文件中,然后在服务或服务器重新启动后将记住更改。
如果是 Mysql 5.7,您可以使用“显示全局变量,如“local_infile”;” 这将给出本地 infile 状态,您可以使用“set global local_infile=ON;”打开它。
我使用了下面的方法,它不需要对 config 进行任何更改,在 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"
另一种方法是使用mysqlimport
客户端程序。
您可以按如下方式调用它:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
这会生成一个LOAD DATA
加载tableName.txt
到tableName
表中的语句。
请记住以下几点:
mysqlimport
根据您提供的文件确定表名;使用从文件名开头到第一个句点的所有文本作为表名。因此,如果您希望将多个文件加载到同一个表中,您可以区分它们,例如tableName.1.txt
,、tableName.2.txt
...等。
这对我来说有点奇怪,从一天到下一天,几天以来一直在工作的脚本就停止工作了。没有更新版本的 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.
我正在使用 xampp v3.2.4 和 mysql 服务器 8.0.20。
我添加local-infile=1
到文件“my.ini”中[mysql]
。[mysqld]
该文件位于“C:\xampp\mysql\bin\my.ini”。
然后我使用以下代码从 csv 文件中插入数据LOAD DATA INFILE ...
。移动本地很重要。否则它将无法正常工作。
感谢以上所有建议。我终于找到了一个组合。
对于那些正在寻找使 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。
好的,这里发生了一些奇怪的事情。要使其工作,不需要在 /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 的发行版中有效
全部:显然这是按设计工作的。请参阅日期为 2019-7-23 的新参考手册,第 6.1.6 节,LOAD DATA LOCAL 的安全问题。