7

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

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

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

  • 我仍然可以像以前一样从 php 加载数据输入文件
  • 我可以从 mysql 命令行加载 DATA LOCAL INFILE(使用 --local_infile=1)
  • 我无法从 php 加载数据本地文件。

在这两个有效的事情之间,它排除了:

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

我得到的错误是: ERROR 1148 (42000): The used command is not allowed with this MySQL version(如果我不使用 --local_infile=1,我会从 mysql 命令行得到该错误)


其他一些相关信息:

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

    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)的人都知道让它工作的诀窍吗?

4

5 回答 5

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

这对我有用。

于 2012-10-23T12:20:27.320 回答
8

这是一个排除这个讨厌的错误的清单:


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-如果您在本地工作,则可以LOCAL从 SQL 中删除:

LOAD DATA INFILE

代替:

LOAD DATA LOCAL INFILE

注意:如果您编辑它们的配置文件,请记住重新启动 MySQL 和 PHP 服务。

希望这可以帮助某人。

于 2014-01-05T23:58:10.573 回答
5

本文所述,需要向 mysql_connect 添加第三个和第四个参数才能使 LOAD LOCAL DATA INFILE 正常工作。它帮助了我。任何其他建议(在互联网上广泛讨论的 my.cnf 中的 apparmor、local-infile=1)都没有帮助。以下 PHP 代码对我有用!

mysql_connect(HOST,USER,PASS,false,128);

没错,这也在手册中。

于 2013-02-09T15:44:21.277 回答
2

使用客户端使用 infile true 激活的以下行

mysql --local-infile=1 -u root -p

于 2013-05-22T09:48:16.080 回答
0

如果您在 2020 年执行此操作,建议您检查 phpinfo.php 或 php --ini 以了解配置文件的位置。对我来说,我使用的是 virtualmin 并更改了 php ini 文件,但我的网站有它自己的特定 ini 文件。一旦我找到了它的位置并改变了它,一切都恢复了正常。

于 2020-07-20T13:13:34.440 回答