【问题标题】:LOAD DATA LOCAL INFILE fails - from php, to mysql (on Amazon rds)LOAD DATA LOCAL INFILE 失败 - 从 php 到 mysql(在 Amazon rds 上)
【发布时间】:2020-07-20 21:13:34
【问题描述】:

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

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

在我的开发服务器上测试,结果不行:

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

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

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

我得到的错误是: ERROR 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 编译器。)
  • 因此,连接命令需要一个额外的标志集:

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

【问题讨论】:

  • 谢谢,根据http://php.net/releases/NEWS_5_4_0_beta1.txt,这是在 php 5.3.9 中修复的,我使用的是 php 5.3.10-1ubuntu3.4,但如果没有其他人有,我可能会尝试自己编译 php任何建议。
  • 实际上,再看一遍,该错误似乎与 PDO 完全相关(您没有使用它)。
  • 对于后来看到这个的其他人,@eggyal 提到的错误是bugs.php.net/bug.php?id=54158

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


【解决方案1】:

我已经放弃了,因为我认为这是 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");

这对我有用。

【讨论】:

  • 不管怎样,看起来这实际上是一个 PHP 5.3.X 错误。我看到了完全相同的问题,它看起来像 PDO MySQL 驱动程序的 PHP 源代码,简单而令人恼火的是,缺少一个“local_infile = 1;”据说 5.4 版本解决了这个问题,虽然我还没有亲自验证过。
  • @Redzarf 为什么还需要那些转义斜线?
  • @codecowboy 首先转义,因为它在 php 字符串 (") 中,然后因为它在 sql 字符串 (') 中而转义。它确实有点疯狂,但在第一行 \\\\ 结束了被用作单个\
  • 我在第 1 行收到错误 ERROR 1046 (3D000):未选择数据库
【解决方案2】:

这里有一个检查清单来排除这个讨厌的错误:


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 服务。

希望这对某人有所帮助。

【讨论】:

    【解决方案3】:

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

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

    没错,这也在manual 中。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 很棒的清单@pachanka!当我昨天对 7.2.17 进行 PHP 更新时,我的 LOAD LOCAL DATA INFILE 脚本给了我权限错误。你的 3 号 - 解决了它。似乎我的 /etc/php/7.2/cli/php.ini 被覆盖了,我修复/取消了 mysql.allow_local_infile = On 行的注释。我不需要重新启动 PHP,因为我的脚本使用 PHP CLI。现在一切正常。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2013-01-24
        • 1970-01-01
        • 2012-10-05
        • 2012-06-01
        • 2016-07-31
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        相关资源
        最近更新 更多