2012-10-10 19 views
11

używam MySQL LOAD DATA LOCAL INFILE polecenie i dostaję ten błąd:Błąd 1148 MySQL polecenie używane jest niedozwolone z tej wersji 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). 

Co ustawienie możemy zmienić, aby umożliwić LOAD DATA LOCAL plik_we?

Oto kod Drupal 7 używamy:

$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

To wymaga nowego pozwolenia dla a teraz, może to jest problem? –

+2

dodać --local-infile podczas wywoływania mysql. To działa. Np .: mysql -h localhost --local-infile –

Odpowiedz

27

Ładowanie pliku lokalnego w MySQL jest zagrożenie bezpieczeństwa i jest domyślnie wyłączona, chcesz zostawić go, jeśli możesz. Gdy nie jest dozwolone uzyskać ten błąd:

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

rozwiązania:

  1. Zastosowanie --local-infile=1 argumentem w linii poleceń mysql:

    Po uruchomieniu MySQL na terminalu, obejmują --local-infile=1 argument, coś takiego:

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

    Następnie komenda jest dozwolone: ​​

    Query OK, 3 rows affected (0.00 sec) 
    Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 
    
  2. Albo wysłać parametr do demona MySQL:

    mysqld --local-infile=1 
    
  3. lub ustawić w pliku my.cnf (Jest to zagrożenie dla bezpieczeństwa) :

    Znajdź swój plik mysql my.cnf i edytuj go jako root.

    Dodaj linię local-infile pod Mysqld i MySQL oznaczników:

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

    Zapisz plik, uruchom ponownie MySQL. Spróbuj ponownie.

Więcej informacji można znaleźć tutaj: http://dev.mysql.com/doc/refman/5.1/en/load-data-local.html

2

Oprócz korzystania local-infile z serwerem MySQL (można umieścić to w pliku /etc/my.cnf też), należy również włączyć PDO na to pozwolić:

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

w przeciwnym razie nie będzie działać, niezależnie od wartości local-infile na serwerze MySQL.

0

Starsza wersja mysql_connect ma również parametr "client_flag", który może być użyty do ustawienia parametru 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

Przykład:

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

Jednak można również napotkać następujący błąd:

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

W takim przypadku może być konieczne, aby sprawdzić ustawienia App Armor, aby umożliwić dostęp do MySQL do plików importu w systemie plików.

W szczególności I dodaje:

/import/ r, 
    /import/* rw, 

Aby dać MySQL odczytu/zapisu do/import

np: Przykładowy profil App Armor

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

Po tym MySQL mógł odczytać pliki z katalogu /import.

0

Głównym powodem, dla którego używamy LOCAL słowa kluczowego jest wyjaśnione w instrukcji MySQL:

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

Więc jeśli faktycznie mają dostęp do plików na serwerze następnie spróbować pominąć używając słowa „LOCAL "w zapytaniu SQL, a zamiast tego skopiuj plik na serwer i do katalogu mysql/data/[tablename].

Więcej na ten temat LOCAL/nielokalnego tutaj: PHPMyAdmin Bug

Nie musisz martwić się dłużej o wprowadzeniu zmian do /etc/mysql/my.cnf