我们正在将我们的数据库从在Web服务器上移动到单独的服务器(从Amazon EC2 Web服务器到RDS实例。)
我们有一个LOAD DATA INFILE,在此之前需要添加LOCAL关键字,因为数据库将位于与Web服务器不同的机器上。
在我的开发服务器上测试,结果证明它不起作用:
在这两项有用的事情之间,它排除了:
我得到的错误是: 错误1148(42000):此MySQL版本不允许使用命令 (如果我不使用--local_infile = 1,我从mysql命令行中得到错误)
其他一些相关信息:
因此,connect命令需要设置一个额外的标志:
mysql_connect($dbHost, $dbUser, $dbPass, false, 128);
mysql.allow_local_infile = On
我唯一没看过的就是在我的开发服务器上编译mysql服务器,打开标志以允许本地infile ...但即使我在我的开发服务器上运行它也是不会帮助我使用Amazon RDS。 (除此之外,LOAD DATA LOCAL INFILE可以在mysql命令行中运行。)
看起来它特别是php的mysql_connect()
的问题任何使用LOAD DATA LOCAL INFILE(可能来自Amazon RDS)的人都知道让这个工作起作用的技巧吗?
答案 0 :(得分:9)
我已经放弃了这一点,因为我认为它是php中的一个错误 - 特别是mysql_connect代码,现在已经弃用了。它可能通过使用类似于@eggyal提到的错误报告中提到的步骤的源代码来自行编译php来解决:https://bugs.php.net/bug.php?id=54158
相反,我将通过执行system()调用并使用mysql命令行来解决它:
$sql = "LOAD DATA LOCAL INFILE '$csvPathAndFile' INTO TABLE $tableName FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\\"' ESCAPED BY '\\\\\\\\' LINES TERMINATED BY '\\\\r\\\\n';";
system("mysql -u $dbUser -h $dbHost --password=$dbPass --local_infile=1 -e \"$sql\" $dbName");
这对我有用。
答案 1 :(得分:6)
这是一个检查清单,以排除这个讨厌的错误:
1-在MySQL中授予用户FILE权限,phpMyAdmin通常不包括此权限:
GRANT FILE ON *.* TO 'db_user'@'localhost';
2-在/ etc / mysql /或你的mysql路径中编辑my.cnf:
[mysql]
local-infile=1
[mysqld]
local-infile=1
3-在/ etc / php5 / cli /或类似的php.ini中:
mysql.allow_local_infile = On
您可以选择在脚本中运行ini_set
:
ini_set('mysql.allow_local_infile', 1);
4-数据库处理程序库必须使用正确的选项 PDO :
new PDO('mysql:host='.$db_host.'.;dbname='.$db_name, $db_user, $db_pass,
array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));
的mysqli :
$conn = mysqli_init();
mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($conn,server,user,code,database);
5-确保INFILE命令使用文件的绝对路径并且它存在:
$sql = "LOAD DATA INFILE '".realpath(is_file($file))."'";
6-检查目标文件和父目录是否可由PHP和MySQL读取。
$ sudo chmod 777 file.csv
7-如果您在本地工作,可以从SQL中删除LOCAL
:
LOAD DATA INFILE
而不是:
LOAD DATA LOCAL INFILE
注意:如果您编辑配置文件,请记住重启MySQL和PHP服务。
希望这有助于某人。
答案 2 :(得分:5)
如this post中所述,需要向mysql_connect添加第3个和第4个参数才能使LOAD LOCAL DATA INFILE正常工作。它帮助了我。任何其他建议(apparmor,my.cnf中的local-infile = 1在互联网上广泛讨论)都无济于事。以下PHP代码为我工作!
mysql_connect(HOST,USER,PASS,false,128);
是的,这也在manual。
答案 3 :(得分:2)
使用客户端使用infile true
激活的以下行mysql --local-infile = 1 -u root -p
答案 4 :(得分:0)
如果您要在2020年进行此操作,建议您检查phpinfo.php或php --ini中的configuratin文件的位置。对我来说,我使用virtualmin并更改了php ini文件,但我的网站拥有它自己的特定ini文件。找到位置并进行更改后,一切恢复正常。