MySQL:启用LOAD DATA LOCAL INFILE

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

我试过在我的configuration中添加本地infile在各个地方,但我仍然得到“使用的命令是不允许与这个MySQL版本”

从MySQL 5.5手册页:

只有当您的服务器和您的客户端都被configuration为允许它时,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] ,只要在文件中find它们并在它们下面添加local-infile就可以了。

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

用本机驱动replace驱动php5-mysql

在debian上

 apt-get install php5-mysqlnd 

如果你的ubuntu上的mysql的风格不在任何情况下工作,你仍然得到1148错误,你可以通过命令行运行load data infile命令

打开terminal窗口

运行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客户端inputSHOW VARIABLES来检查),那么你可以把它添加到你的settings.py文件中(因为python MySQLdb doesn' t默认读取.my.cnf文件):

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

你必须小心如何build立你的mysqli连接。 这个解决scheme的全部功劳归于Jorge Albarenque

为了解决它,我不得不:

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

这个function可以明确地启用对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); 

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

你调用它如下:

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

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

请记住以下几点:

mysqlimport从您提供的文件中确定表名; 使用从文件名开始到第一个周期的所有文本作为表名。 所以,如果你想加载几个文件到同一个表,你可以区分它们,比如tableName.1.txttableName.2.txt ,…等等。

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

这个MySQL版本不允许使用这个命令

对我来说,这有点奇怪,从一天到下一天,从那时起工作的剧本就停止了工作。 没有更新的版本的MySQL或任何types的升级,但我得到同样的错误,所以我给了最后一次尝试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. 

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

 sudo service mysql restart 

那么如果我想“重新创build”这个bug,我只需重启apache服务:

 sudo service apache2 restart 

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

 sudo service mysql restart 

所以,似乎apache2正在做一些事情,当它启动时不允许这个function(如果重新启动mysql服务,那么它将被颠倒/更正)。

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

 service mysqld restart service httpd restart 

在基于RedHat的发行版中有效

对于那些寻找答案来使LOAD DATA LOCAL INFILE像我一样工作,这可能会工作。 那么它为我工作,所以在这里。 按照链接中的步骤安装percona作为你的mysql服务器和客户端。 在安装过程中会提示input密码,因此请提供一个您将记住并稍后使用的密码。 一个安装完成,重新启动你的系统,并testing服务器是否正常运行,然后inputmysql -u root -p然后input密码。 尝试运行命令LOAD DATA LOCAL INFILE现在..希望它的作品:)

顺便说一下,我在Ubuntu 12.04上使用Rails 2.3和Ruby 1.9.3。

我使用下面的方法,它不需要任何改变 ,在mysql-5.5.51-winx64和5.5.50-MariaDB上testing:

把'load data …'放在.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" 

如果Mysql 5.7可以使用“显示全局variables”local_infile“;” 这会给出当地的infile状态,你可以使用“set global local_infile = ON”打开它。