2012-10-10 51 views
11

我使用MySQL的LOAD DATA LOCAL INFILE命令允许的,我得到这个错误:错误1148 MySQL中使用的命令是不是跟这个MySQL版本

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); 
+1

它需要一个新的权限为而现在,也许这就是问题所在? –

+2

在调用mysql时添加--local-infile。有用。例如:mysql -h localhost --local-infile –

回答

27

加载MySQL中的本地文件是一个安全隐患,并默认是关闭的,你想,如果你能离开它。当它是不允许你得到这个错误:

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

解决方案:

  1. 使用--local-infile=1参数上的MySQL命令行:

    当你在终端上启动MySQL,包括--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文件并将其作为根进行编辑。

    添加local-infile线下的mysqld和mysql代号:

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

    保存文件,重启MySQL。再试一次。

更多信息可以在这里找到:http://dev.mysql.com/doc/refman/5.1/en/load-data-local.html

2

除了使用local-infile与MySQL服务器(你可以把这个在/etc/my.cnf文件里也行),您还需要启用PDO允许它:

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

否则将无法正常工作,而不管local-infile MySQL服务器上的值。

0

传统的mysql_connect还有一个参数'client_flag',可以用来设置mysql参数。

The client_flags parameter can be a combination of the following constants: 128 (enable LOAD DATA LOCAL handling), MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE or MYSQL_CLIENT_INTERACTIVE. Read the section about MySQL client constants for further information. In SQL safe mode, this parameter is ignored. 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) 

在这种情况下,您可能需要检查你的应用程序护甲设置,以允许MySQL的访问到文件系统上的导入文件。

我特别补充说:

/import/ r, 
    /import/* rw, 

为了让MySQL的读/写访问/进口

例如:示例应用程序铠装造型

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目录的文件。

0

为什么我们使用本地关键字的主要原因是 在MySQL手册中有解释:

On the other hand, you do not need the FILE privilege to load local files.

所以,如果你实际上确实有那么服务器文件访问尝试使用这个词来跳过“LOCAL “在SQL查询中,而是将该文件复制到服务器和目录mysql/data/[tablename]。

更多关于这家本地/非本地位置:PHPMyAdmin Bug

您没有任何再担心在更改/etc/mysql/my.cnf