Frage Fehler 1148 MySQL Der verwendete Befehl ist bei dieser MySQL-Version nicht erlaubt


Ich benutze MySQL LOAD DATA LOCAL INFILE Befehl und ich bekomme diesen Fehler:

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 ändern, um LOAD DATA LOCAL infile zu lassen?

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

11
2017-10-10 12:13


Ursprung


Antworten:


Das Laden einer lokalen Datei in MySQL stellt ein Sicherheitsrisiko dar und ist standardmäßig deaktiviert. Sie möchten es jedoch abschalten, wenn Sie können. Wenn es nicht erlaubt ist, erhalten Sie diesen Fehler:

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

Lösungen:

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

    Wenn Sie MySQL auf dem Terminal starten, schließen Sie ein --local-infile=1 Argument, etwa so:

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

    Dann ist der Befehl erlaubt:

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

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

    Finde deine mysql my.cnf Datei und bearbeiten Sie es als root.

    Ergänzen Sie die local-infile Zeile unter den mysqld- und mysql-Bezeichnern:

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

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

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


27
2017-10-10 22:01



Zusätzlich zur Verwendung local-infile mit dem MySQL-Server (Sie können dies auch in die Datei /etc/my.cnf setzen), müssen Sie auch PDO aktivieren, um es zu erlauben:

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

Ansonsten funktioniert es nicht, unabhängig vom Wert von local-infile auf dem MySQL-Server.


2
2018-01-02 22:22



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

Der Parameter client_flags kann eine Kombination aus Folgendem sein   Konstanten: 128 (LOAD DATA LOCAL-Behandlung aktivieren), MYSQL_CLIENT_SSL,   MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE oder   MYSQL_CLIENT_INTERACTIVE. Lesen Sie den Abschnitt über den MySQL-Client   Konstanten für weitere Informationen. Im SQL-abgesicherten Modus ist dieser Parameter   ignoriert.    http://php.net/function.mysql-connect

Beispiel:

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

Ihnen kann jedoch auch der folgende 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 Armor-Einstellungen überprüfen, damit MySQL auf die Importdateien im Dateisystem zugreifen kann.

Insbesondere habe ich hinzugefügt:

  /import/ r,
  /import/* rw,

Um MySQL Lese- / Schreibzugriff auf / import zu geben

Beispiel: Beispiel für ein App Armor-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>
}

Danach konnte MySQL Dateien von der /import Verzeichnis.


0
2018-04-02 08:37



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

Auf der anderen Seite benötigen Sie das FILE-Privileg nicht, um lokal zu laden   Dateien.

Wenn Sie also tatsächlich Dateizugriff auf den Server haben, versuchen Sie, das Wort "LOCAL" in der SQL-Abfrage zu überspringen und kopieren Sie die Datei stattdessen auf den Server und das Verzeichnis mysql / data / [tablename].

Mehr über dieses LOKALE / NICHT-LOKALE hier: PHPMyAdmin Fehler

Sie müssen sich nicht länger darum kümmern, Änderungen an /etc/mysql/my.cnf vorzunehmen


0
2018-04-29 09:11