143

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"

4

19 回答 19

202

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

这是一个安全限制。

于 2012-05-25T23:25:35.273 回答
67

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

于 2012-07-18T10:03:10.820 回答
50

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

SET GLOBAL local_infile = true;

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

mysql -u user -p*

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

SHOW GLOBAL VARIABLES LIKE 'local_infile';

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

于 2018-07-26T06:57:03.417 回答
29

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

在 Debian 上

apt-get install php5-mysqlnd
于 2013-09-20T14:53:13.790 回答
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';
于 2013-08-05T23:21:26.203 回答
11

见下图...

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

所以总行将是:

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

在此处输入图像描述

于 2017-12-25T16:45:45.843 回答
7

此外,对于其他读者,如果您尝试在 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,
        },
    }
}
于 2013-08-05T21:45:16.080 回答
5

添加local_infilemysql部分mysqld

[mysql]
local_infile=1
...

[mysqld]
local_infile=1
...

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

于 2020-04-18T04:18:49.533 回答
3

如果您的 csv 文件与 db相同,则需要在LOAD DATA INFILE中删除LOCAL,否则会出现错误

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

于 2015-01-12T14:00:24.830 回答
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);
于 2014-10-10T13:20:08.170 回答
2

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

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

SET PERSIST local_infile = 1;

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

于 2021-07-19T19:02:34.373 回答
1

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

于 2017-03-08T23:37:07.480 回答
1

我使用了下面的方法,它不需要对 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"
于 2016-08-13T16:49:35.360 回答
1

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

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

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

这会生成一个LOAD DATA加载tableName.txttableName表中的语句。

请记住以下几点:

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

于 2015-09-25T21:53:12.037 回答
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.
于 2016-02-04T16:08:44.817 回答
1

我正在使用 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 ...。移动本地很重要。否则它将无法正常工作。

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

于 2020-05-07T19:57:47.723 回答
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。

于 2014-02-09T15:09:41.417 回答
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 的发行版中有效

于 2012-09-03T21:26:46.510 回答
0

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

于 2019-08-11T14:02:07.797 回答