2012-10-10 10 views
11

Sto usando MySQL LOAD DATA LOCAL INFILE di comando e ottengo questo errore:Errore 1148 MySQL Il comando utilizzato non è consentito con questa versione di 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). 

Quale cornice possiamo cambiare per consentire LOAD DATA LOCAL INFILE?

Ecco il codice Drupal 7 che stiamo usando:

$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

Si richiede un nuovo permesso per un mentre ora, forse questo è il problema? –

+2

aggiungi --local-infile mentre invoca mysql. Funziona. Ad esempio: mysql -h localhost --local-infile –

risposta

27

Caricamento di un file locale in MySQL è un pericolo di sicurezza ed è disattivata per impostazione predefinita, si vuole lasciare fuori se potete. Quando non è consentito che si ottiene questo errore:

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

Solutions:

  1. Usa --local-infile=1 argomento sulla riga di comando mysql:

    Quando si avvia MySQL sul terminale, comprendono --local-infile=1 argomento, Qualcosa del genere:

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

    Poi il comando è consentito:

    Query OK, 3 rows affected (0.00 sec) 
    Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 
    
  2. o inviare il parametro nel daemon mysql:

    mysqld --local-infile=1 
    
  3. o impostarla nel file my.cnf (Questo è un rischio per la sicurezza) :

    Trova il tuo mysql my.cnf e modificalo come root.

    aggiungere la riga local-infile sotto le mysqld e mysql designatori:

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

    salvare il file, riavviare mysql. Provaci ancora.

Maggiori informazioni possono essere trovate qui: http://dev.mysql.com/doc/refman/5.1/en/load-data-local.html

2

Oltre a utilizzare local-infile con il server MySQL (si può mettere questo nel file /etc/my.cnf troppo), è inoltre necessario per consentire PDO per consentire che:

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

altrimenti non funzionerà, a prescindere dal valore della local-infile sul server MySQL.

0

Il file legacy mysql_connect ha anche un parametro 'client_flag' che può essere utilizzato per impostare il parametro 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

Esempio:

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

Tuttavia, si può anche incontrare il seguente errore:

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

In questo caso, potrebbe essere necessario verificare le impostazioni App Armatura per consentire l'accesso di MySQL ai file di importazione sul filesystem.

In particolare ho aggiunto:

/import/ r, 
    /import/* rw, 

Per dare MySQL accesso in lettura/scrittura a/importazione

esempio: Esempio profilo App Armatura

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

Dopo che MySQL poteva leggere file dalla directory /import.

0

Il motivo principale per cui stiamo usando la parola chiave LOCAL è spiegato nel manuale di MySQL:

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

Quindi, se in realtà hanno accesso ai file al server poi tenta di saltare usando la parola "LOCALE "nella query SQL, e invece copiare il file sul server e la directory mysql/data/[tablename].

Ulteriori su questi LOCALE/non-locale qui: PHPMyAdmin Bug

Non dovete preoccuparvi più su come apportare modifiche al /etc/mysql/my.cnf

Problemi correlati