2012-10-10 6 views
11
erlaubt

ich MySQL LOAD DATA LOCAL INFILE Befehl verwenden, und ich bekomme diese Fehlermeldung:Fehler 1148 MySQL Der Befehl verwendet wird, nicht mit dieser MySQL-Version

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). 

Welche Einstellung können wir LOAD DATA LOCAL INFILE, damit ändern?

Hier ist der Drupal 7 Code, den wir verwenden:

$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

Es erfordert eine neue Erlaubnis für eine /etc/mysql/my.cnf während jetzt, vielleicht ist das das problem? –

+2

add --local-infile beim Aufruf von mysql. Es klappt. ZB: mysql -h localhost --local-infile –

Antwort

27

eine lokale Datei in MySQL Laden ist ein Sicherheitsrisiko und ist standardmäßig deaktiviert, wollen Sie es weglassen, wenn Sie können. Wenn es nicht erlaubt ist, diese Fehlermeldung angezeigt:

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

Lösungen:

  1. Verwenden --local-infile=1 Argument auf der Kommandozeile mysql:

    Wenn Sie MySQL auf dem Terminal starten, schließen --local-infile=1 Argument, etwas wie dieses:

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

    Dann wird der Befehl erlaubt:

    Query OK, 3 rows affected (0.00 sec) 
    Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 
    
  2. Oder den Parameter in den MySQL-Daemon senden:

    mysqld --local-infile=1 
    
  3. Oder es in der my.cnf-Datei festgelegt (Dies ist ein Sicherheitsrisiko) :

    Finden Sie Ihre mysql my.cnf Datei und bearbeiten Sie sie als root.

    Fügen Sie die local-infile Linie unter den mysqld und mysql Bezeich:

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

    Speichern Sie die Datei, neu starten mysql. Versuche es noch einmal.

Weitere Informationen finden Sie hier: http://dev.mysql.com/doc/refman/5.1/en/load-data-local.html

2

Zusätzlich local-infile mit dem MySQL-Server zu verwenden (Sie dies in der Datei /etc/my.cnf setzen können), müssen Sie auch aktivieren PDO es ermöglichen:

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

Sonst wird es nicht funktionieren, unabhängig von dem Wert von local-infile auf dem MySQL-Server.

0

Das Legacy mysql_connect hat auch einen Parameter 'client_flag', der verwendet werden kann, um den Parameter mysql zu setzen.

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

Beispiel:

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

Sie können aber auch die folgenden Fehler auftreten:

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

In diesem Fall müssen Sie möglicherweise Ihre App Armour-Einstellungen überprüfen MySQL Zugriff zu ermöglichen, zu den Importdateien auf dem Dateisystem.

Insbesondere fügte ich hinzu:

/import/ r, 
    /import/* rw, 

geben MySQL Lese-/Schreibzugriff auf/Import

zB Probe App Rüstung Profil

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

Nach dieser MySQL lesen konnte Dateien aus dem Verzeichnis .

0

Der Hauptgrund, warum wir das Schlüsselwort LOCAL verwenden ist im MySQL-Handbuch erklärt:

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

Also, wenn Sie in der Tat tun, Datei Zugriff auf den Server haben, dann das Wort zu überspringen versuchen Sie es mit „LOCAL "in SQL-Abfrage, und kopieren Sie stattdessen die Datei auf den Server und das Verzeichnis mysql/data/[Tabellenname].

Mehr über dieses LOCAL/nicht-LOCAL hier: PHPMyAdmin Bug

Sie müssen Änderungen keine Sorge mehr über die Herstellung

Verwandte Themen