LOAD DATA LOCAL INFILE失败 - 从php到mysql(在Amazon rds上)

时间:2012-10-22 17:42:50

标签: php mysql amazon-rds load-data-infile

我们正在将我们的数据库从在Web服务器上移动到单独的服务器(从Amazon EC2 Web服务器到RDS实例。)

我们有一个LOAD DATA INFILE,在此之前需要添加LOCAL关键字,因为数据库将位于与Web服务器不同的机器上。

在我的开发服务器上测试,结果证明它不起作用:

  • 我仍然可以通过php加载数据传输
  • 我可以从mysql命令行加载DATA LOCAL INFILE(使用--local_infile = 1)
  • 我无法从php加载DATA LOCAL INFILE。

在这两项有用的事情之间,它排除了:

  • sql或php代码的问题
  • 上传文件的问题,包括语法和文件权限
  • mysql服务器设置问题

我得到的错误是: 错误1148(42000):此MySQL版本不允许使用命令 (如果我不使用--local_infile = 1,我从mysql命令行中得到错误)


其他一些相关信息:

  • Ubuntu 12.04,mysql 5.5.24,php 5.3.10
  • 我正在使用php的mysql_connect(而不是mysqli,因为我们计划使用不支持mysqli的facebook的hiphop编译器。)
  • 因此,connect命令需要设置一个额外的标志:

    mysql_connect($dbHost, $dbUser, $dbPass, false, 128);
    
  • 我使用phpinfo()来确认mysql.allow_local_infile = On
  • 我在Amazon RDS上尝试过(如果它是我的开发服务器中的一个问题)并且它也不起作用。 (打开local_infile参数。)

我唯一没看过的就是在我的开发服务器上编译mysql服务器,打开标志以允许本地infile ...但即使我在我的开发服务器上运行它也是不会帮助我使用Amazon RDS。 (除此之外,LOAD DATA LOCAL INFILE可以在mysql命令行中运行。)


看起来它特别是php的mysql_connect()

的问题

任何使用LOAD DATA LOCAL INFILE(可能来自Amazon RDS)的人都知道让这个工作起作用的技巧吗?

5 个答案:

答案 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文件。找到位置并进行更改后,一切恢复正常。