MySQL: 启用加载数据本地 INFILE

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

我已经尝试在我的配置中添加本地文件在不同的地方,但我仍然得到“使用的命令是不允许与这个 MySQL 版本”

302730 次浏览

来自 MySQL 5.5手册页:

LOCAL 只有在您的服务器和客户端都已经 配置为允许它。例如,如果 mysqld 以 —— LOCAL-infile = 0,LOCAL 不工作。请参阅6.1.6节“ LOAD DATA LOCAL 的安全问题”。

你应该设置选项:

local-infile=1

进入 my.cnf 文件的 [ mysql ]条目,或使用 本地人选项调用 mysql 客户端:

mysql --local-infile -uroot -pyourpwd yourdbname

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

这是安全限制。

您应该编辑的 my.cnf 文件是 /etc/mysql/my.cnf文件:

sudo nano /etc/mysql/my.cnf

然后加上:

[mysqld]
local-infile


[mysql]
local-infile

标题 [ mysqld ][ mysql ]已经给出,只需在文件中找到它们,并在每个标题下面添加 本地人

它适用于我在 Ubuntu 12.04 LTS 上的 MySQL 5.5。

好吧,这里发生了一些奇怪的事情。要做到这一点,不需要在/etc/mysql/my.cnf 中进行任何配置更改。您所需要做的就是在终端中重新启动当前的 mysql 服务:

sudo service mysql restart

然后,如果我想“重新创建”bug,我只需重新启动 apache 服务:

sudo service apache2 restart

然后可以通过输入以下命令再次修复:

sudo service mysql restart

因此,似乎 apache2正在做一些不允许这个特性的事情 当它启动时(如果重新启动 mysql 服务,则会反转/纠正)。

在基于 Debian 的发行版中有效。

service mysqld restart
service httpd restart

在基于 RedHat 的发行版中有效

另外,对于其他读者,如果您试图在 Django 中这样做,并且您的服务器允许 local _ file (您可以通过一个 mysql 客户端键入 SHOW VARIABLES 来检查) ,那么您可以将其添加到 设置文件中(因为 python MySQLdb 默认情况下不会读取。Cnf 文件) :

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'myname',
'PASSWORD': 'mypass',
'HOST': 'myserver',
'PORT': '3306',
'OPTIONS' : {
'local_infile':1,
},
}
}

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

用本机驱动程序替换驱动程序 php5-mysql

在 Debian 身上

apt-get install php5-mysqlnd

对于那些正在寻找使 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。

你必须注意如何建立你的 mysqli 连接。这个解决方案的全部功劳归于 Jorge Albarenque,来源

为了解决这个问题,我不得不:

  • 将 local-infile = 1添加到 my.cnf 的[ mysqld ]和[ mysql ]部分(如上面的注释所解释的)
  • 使用 mysqli _ real _ connect 函数(PHP 文档)。

问题在于,使用这个函数可以显式地启用对 LOADDATALOCALINFILE 的支持。例如(程序风格) :

$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);

如果您的 csv 文件位于数据库中的 一样,则需要删除 加载数据文件中的 本地的, 否则你会得到错误

在此 MySQL 版本中不允许使用该命令

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

你援引它的方式如下:

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

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

请记住以下几点:

mysqlimport根据您提供的文件确定表名; 使用从文件名开始到第一个句点的所有文本作为表名。因此,如果您希望将多个文件加载到同一个表中,您可以区分它们,例如 tableName.1.txttableName.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.

我使用了下面的方法,不需要对配置进行任何更改在 mysql-5.5.51-winx64和5.5.50-MariaDB 上进行了测试:

在. sql 文件中放入‘ load data...’(例如: 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"

如果 Mysql 5.7可以使用“ show global variable like“ local _ file”;”来给出本地文件状态,那么可以使用“ set global local _ file = ON;”来打开它。

见下图..。

我已经将 --local-infile=1添加到普通的 mysql 命令 mysql -u root -p

所以总线应该是:

Mysql —— local-infile = 1-u root-p

enter image description here

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

SET GLOBAL local_infile = true;

我的意思是,我先登录的时候,和往常一样:

mysql -u user -p*

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

SHOW GLOBAL VARIABLES LIKE 'local_infile';

它应该是 ON。我将不会写关于安全性与加载本地文件到数据库在这里发出。

全体: 显然这是按照设计工作。请看新裁判日期2019-7-23,第6.1.6节,本地加载数据的安全问题

mysqlmysqld部分添加 local_infile

[mysql]
local_infile=1
...


[mysqld]
local_infile=1
...

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

我使用的是 xamppv3.2.4和 mysql server 8.0.20。

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

然后使用以下代码 LOAD DATA INFILE ...插入 csv 文件中的数据。搬到本地很重要。否则就没用了。

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

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

如果有人在 MySql 的版本8中启用 local _ file 时遇到了麻烦,这里的这个命令为我解决了这个问题:

SET PERSIST local_infile = 1;

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

请注意,对于较新的 MySQL 服务器,比如8.0版,这个设置不是布尔值,而是 ON|OFF,您可以在这里的文档中读到: https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_local_infile

如果您将它设置为 1 MySQL 将不会识别它,并会在您的日志文件中警告这个错误:

# /var/log/mysql/mysql.err
2022-04-08T14:45:06.532132Z 0 [Warning] [MY-000076] [Server] option 'local_infile': boolean value '1;' was not recognized. Set to OFF.