2012-10-10 45 views
11

estoy usando MySQL comando LOAD DATA LOCAL INFILE y me da este error:Error 1148 MySQL El comando utilizado no se permite con esta versión de 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). 

Qué configuración podemos cambiar para permitir la carga de datos archivoentrada local?

Aquí está el código de Drupal 7 que estamos utilizando:

$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

Se requiere un nuevo permiso para una mientras que ahora, tal vez ese es el problema? –

+2

agrega --local-infile al invocar mysql. Funciona. Por ejemplo: mysql -h localhost --local-infile –

Respuesta

27

Carga de un archivo local en MySQL es un peligro para la seguridad y es desactivada por defecto, usted quiere dejar fuera si es posible. Cuando no está permitido obtiene este error:

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

Soluciones:

  1. Uso --local-infile=1 argumento en la línea de comandos mysql:

    Al iniciar MySQL en la terminal, incluyen --local-infile=1 argumento, Algo como esto:

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

    Luego se permite el comando:

    Query OK, 3 rows affected (0.00 sec) 
    Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 
    
  2. o enviar el parámetro en el demonio de MySQL:

    mysqld --local-infile=1 
    
  3. o ponerlo en el archivo my.cnf (Este es un riesgo de seguridad) :

    Busque su archivo mysql my.cnf y edítelo como raíz.

    Añadir la línea local-infile bajo los designadores mysqld y mysql:

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

    guardar el archivo, reiniciar MySQL. Pruébalo otra vez.

Más información se puede encontrar aquí: http://dev.mysql.com/doc/refman/5.1/en/load-data-local.html

2

Además de utilizar local-infile con el servidor MySQL (se puede poner esto en el archivo /etc/my.cnf también), también es necesario para permitir DOP les permita:

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

de lo contrario, no funcionará, independientemente del valor de local-infile en el servidor MySQL.

0

La legado mysql_connect también tiene un parámetro 'client_flag' que se puede usar para establecer el parámetro 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

Ejemplo:

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

Sin embargo, también puede aparecer el siguiente error:

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

En este caso, es posible que tenga que revisar su configuración de aplicaciones de la armadura para permitir el acceso de MySQL a los archivos de importación en el sistema de archivos.

En particular, ha añadido:

/import/ r, 
    /import/* rw, 

Para dar MySQL leer/escribir/importación

por ejemplo: Muestra el perfil de aplicaciones armadura

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> 
} 

Después de que MySQL podía leer archivos del directorio /import.

0

La razón principal por la que estamos usando la palabra clave LOCAL es se explica en el manual de MySQL:

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

Así que si de hecho tienen acceso a los archivos al servidor y luego intenta omitir el uso de la palabra "LOCAL "en la consulta SQL, y en su lugar copie el archivo al servidor y al directorio mysql/data/[tablename].

Más información este LOCAL/no local aquí: PHPMyAdmin Bug

Usted no tiene que preocuparse más acerca de hacer cambios a /etc/mysql/my.cnf

Cuestiones relacionadas