Мы перемещаем нашу базу данных с веб-сервера на отдельный сервер (с веб-сервера Amazon EC2 до экземпляра RDS).
У нас есть LOAD DATA INFILE, который работал до того, как понадобится ключевое слово LOCAL, добавленное теперь, когда база данных будет находиться на другой машине на веб-сервере.
Тестирование на моем dev-сервере, оказывается, что он не работает:
Между этими двумя вещами, которые работают, это исключает:
Ошибка, которую я получаю: ERROR 1148 (42000): Использованная команда не допускается с этой версией MySQL (я получаю эту ошибку из командной строки mysql, если я не использую –local_infile = 1)
Несколько других бит соответствующей информации:
Из-за этого команде connect требуется дополнительный флаг:
mysql_connect($dbHost, $dbUser, $dbPass, false, 128);
mysql.allow_local_infile = On
Единственное, что я прочитал о том, что я не пробовал, – это скомпилировать 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