Ошибка 1148 MySQL Использованная команда не допускается с этой версией MySQL

Я использую команду MySQL LOAD DATA LOCAL INFILE и я получаю эту ошибку:

 PDOException: SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version: LOAD DATA LOCAL INFILE '/tmp/phpI0ox54' INTO TABLE `dev_tmp` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; Array ( ) in dc_real_estate_form_submit() (line 147 of /PATH/TO/PHP/SCRIPT). 

Какую настройку мы можем изменить, чтобы разрешить LOAD DATA LOCAL infile?

Вот код Drupal 7, который мы используем:

 $sql = "LOAD DATA LOCAL INFILE '".$file."' INTO TABLE `dev_tmp` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES"; db_query($sql); 

Загрузка локального файла в MySQL является угрозой безопасности и по умолчанию отключена, вы можете оставить ее, если сможете. Когда это не разрешено, вы получаете эту ошибку:

 ERROR 1148 (42000): The used command is not allowed with this MySQL version 

Решения:

  1. Используйте --local-infile=1 аргумент в командной строке mysql:

    Когда вы запустите MySQL на терминале, --local-infile=1 аргумент --local-infile=1 , что-то вроде этого:

     mysql --local-infile=1 -uroot -p mysql>LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo COLUMNS TERMINATED BY '\t'; 

    Тогда команда разрешена:

     Query OK, 3 rows affected (0.00 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 
  2. Или отправьте параметр в демон mysql:

     mysqld --local-infile=1 
  3. Или установите его в файле my.cnf (это угроза безопасности):

    Найдите файл mysql my.cnf и отредактируйте его как root.

    Добавьте строку local-infile под именами mysqld и mysql:

     [mysqld] local-infile [mysql] local-infile 

    Сохраните файл, перезапустите mysql. Попробуйте снова.

Более подробную информацию можно найти здесь: http://dev.mysql.com/doc/refman/5.1/en/load-data-local.html

В дополнение к использованию local-infile с сервером MySQL (вы можете поместить это в файл /etc/my.cnf), вам также необходимо включить PDO, чтобы разрешить это:

 <?php $pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_LOCAL_INFILE => true) ); 

В противном случае он не будет работать, независимо от значения local-infile на сервере MySQL.

Унаследованный mysql_connect также имеет параметр client_flag , который можно использовать для установки параметра mysql.

Параметр client_flags может быть комбинацией следующих констант: 128 (включить LOAD DATA LOCAL), MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE или MYSQL_CLIENT_INTERACTIVE. Подробнее читайте в разделе о константах клиента MySQL. В безопасном режиме SQL этот параметр игнорируется. http://php.net/function.mysql-connect

Пример:

 $db = mysql_connect($host, $user, $pass, FALSE, 128); 

Однако вы также можете столкнуться со следующей ошибкой:

 ERROR 29 (HY000): File '/var/www/.../mysql_import.csv' not found (Errcode: 13) 

В этом случае вам может потребоваться проверить настройки App Armor, чтобы MySQL мог получить доступ к файлам импорта в файловой системе.

В частности, я добавил:

  /import/ r, /import/* rw, 

Чтобы предоставить MySQL доступ к чтению / записи для импорта / импорта

например: Пример профиля приложения App

 cat /etc/apparmor.d/usr.sbin.mysqld # vim:syntax=apparmor # Last Modified: Tue Jun 19 17:37:30 2007 #include <tunables/global> /usr/sbin/mysqld { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/user-tmp> #include <abstractions/mysql> #include <abstractions/winbind> capability dac_override, capability sys_resource, capability setgid, capability setuid, network tcp, /etc/hosts.allow r, /etc/hosts.deny r, /etc/mysql/*.pem r, /etc/mysql/conf.d/ r, /etc/mysql/conf.d/* r, /etc/mysql/*.cnf r, /usr/lib/mysql/plugin/ r, /usr/lib/mysql/plugin/*.so* mr, /usr/sbin/mysqld mr, /usr/share/mysql/** r, /var/log/mysql.log rw, /var/log/mysql.err rw, /var/lib/mysql/ r, /var/lib/mysql/** rwk, /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid w, /var/run/mysqld/mysqld.sock w, /run/mysqld/mysqld.pid w, /run/mysqld/mysqld.sock w, # Custom import folders start # These folders will also be read/writeable by mysql. /import/ r, /import/* rw, # Custom import folders end /sys/devices/system/cpu/ r, # Site-specific additions and overrides. See local/README for details. #include <local/usr.sbin.mysqld> } 

После этого MySQL может читать файлы из каталога /import .

Основная причина, по которой мы используем ключевое слово LOCAL, объясняется в руководстве по MySQL:

С другой стороны, вам не нужна привилегия FILE для загрузки локальных файлов.

Поэтому, если у вас фактически есть доступ к файлу на сервере, попробуйте пропустить, используя слово «LOCAL» в SQL-запросе, и вместо этого скопируйте файл на сервер и в каталог mysql / data / [tablename].

Подробнее об этом МЕСТЕ / НЕ ЛОКАЛЬНО: PHPMyAdmin Bug

Вам больше не нужно беспокоиться о внесении изменений в /etc/mysql/my.cnf