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.txt
, tableName.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”打开它。