错误1148 MySQL此MySQL版本不允许使用该命令

时间:2012-10-10 12:13:35

标签: php mysql load-data-infile

我正在使用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);

4 个答案:

答案 0 :(得分:2)

除了将local-infile与MySQL服务器一起使用(您也可以将其放在/etc/my.cnf文件中),还需要启用PDO以允许它:

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

否则无论MySQL服务器上的local-infile值是多少都无法正常工作。

答案 1 :(得分:0)

旧版mysql_connect还有一个参数&#39; client_flag&#39;可以用来设置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,

授予对/ import

的MySQL读/写访问权限

例如:示例App Armor配置文件

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目录中读取文件。

答案 2 :(得分:0)

我们使用LOCAL关键字的主要原因是 在MySQL手册中解释:

  

另一方面,您不需要FILE权限来加载本地   文件。

因此,如果您确实拥有对服务器的文件访问权限,那么请尝试跳过使用&#34; LOCAL&#34;在SQL查询中,而是将文件复制到服务器和目录mysql / data / [tablename]。

有关此LOCAL /非LOCAL的更多信息,请访问:PHPMyAdmin Bug

您不必再担心对/etc/mysql/my.cnf进行更改

答案 3 :(得分:0)

只需按照以下过程来解决问题:

  1. 使用命令行登录mysql。

    mysql -u root -p

  2. 检查本地文件内状态:

    类似于“ local_infile”的显示变量;

  3. 如果输出为“关”,请运行以下命令:

    SET GLOBAL local_infile = 1;

  4. 再次检查状态:

    类似于“ local_infile”的显示变量;

  5. 输出将是: see now

  6. 最后重新启动mysql:

    服务mysql重新启动