LOAD DATA LOCAL INFILE не работает – от php, до mysql (на Amazon rds)

Мы перемещаем нашу базу данных с веб-сервера на отдельный сервер (с веб-сервера Amazon EC2 до экземпляра RDS).

У нас есть LOAD DATA INFILE, который работал до того, как понадобится ключевое слово LOCAL, добавленное теперь, когда база данных будет находиться на другой машине на веб-сервере.

Тестирование на моем dev-сервере, оказывается, что он не работает:

  • Я все еще могу загрузить LOAD DATA INFILE с php, поскольку я был
  • Я могу LOAD DATA LOCAL INFILE из командной строки mysql (с -local_infile = 1)
  • Я не могу загрузить LOAD DATA LOCAL INFILE из php.

Между этими двумя вещами, которые работают, это исключает:

  • проблемы с кодом sql или php
  • проблемы с файлом загрузки, включая синтаксис и разрешения файлов
  • Проблемы с настройками сервера mysql

Ошибка, которую я получаю: ERROR 1148 (42000): Использованная команда не допускается с этой версией MySQL (я получаю эту ошибку из командной строки mysql, если я не использую –local_infile = 1)


Несколько других бит соответствующей информации:

  • Ubuntu 12.04, mysql 5.5.24, php 5.3.10
  • Я использую mysql_connect php (вместо mysqli, потому что мы планируем использовать компилятор facebook hiphop, который не поддерживает mysqli.)
  • Из-за этого команде connect требуется дополнительный флаг:

    mysql_connect($dbHost, $dbUser, $dbPass, false, 128); 
  • Я использовал phpinfo (), чтобы подтвердить, что mysql.allow_local_infile = On
  • Я пробовал это на Amazon RDS (если это была проблема на моем dev-сервере), и он тоже не работает. (С включенным параметром local_infile.)

Единственное, что я прочитал о том, что я не пробовал, – это скомпилировать mysql-сервер на моем dev-сервере с включенным флагом, чтобы разрешить локальную инфляцию … но даже если я получу эту работу на своем dev-сервере, это не будет помогите мне с Amazon RDS. (Кроме того, LOAD DATA LOCAL INFILE работает из командной строки mysql.)


Похоже, что это определенно проблема с php mysql_connect ()

Любой, кто использует LOAD DATA LOCAL INFILE (возможно, от Amazon RDS), который знает об этом, чтобы заставить это работать?

Я отказался от этого, так как я думаю, что это ошибка в php – в частности, код mysql_connect, который теперь устарел. Вероятно, это можно было бы решить, скомпилировав php самостоятельно с изменениями в источнике с помощью шагов, аналогичных тем, которые упоминаются в отчете об ошибке, который упоминается в @eggyal: 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"); 

Это работает для меня.

Как указано в этом сообщении , добавление третьего и четвертого параметров в mysql_connect необходимо для работы LOAD LOCAL DATA INFILE. Это помогло мне. Любые другие предложения (apparmor, local-infile = 1 в my.cnf, широко обсуждаемые в Интернете) не помогли. Следующий PHP-код работал для меня!

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

Правда, это тоже в ручном режиме .

Вот контрольный список, чтобы исключить эту неприятную ошибку:


1- Предоставлять пользовательские права FILE в MySQL, phpMyAdmin generaly не распространяется на эту привилегию:

 GRANT FILE ON *.* TO 'db_user'@'localhost'; 

2- Измените my.cnf в / etc / mysql / или ваш путь mysql:

 [mysql] local-infile=1 [mysqld] local-infile=1 

3- В php.ini в / etc / php5 / cli / или аналогичном:

 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, если вы отредактируете их файлы конфигурации.

Надеюсь, это поможет кому-то.

используйте следующую строку, которую клиент активирует с infile true

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