MySQL: LOAD DATA LOCAL INFILE'ı etkinleştirin


127

Ubuntu 12 LTS'de Mysql 5.5 çalıştırıyorum. My.cnf dosyasında LOAD DATA LOCAL INFILE'ı nasıl etkinleştirmeliyim?

Yapılandırmama çeşitli yerlerde yerel dosya eklemeyi denedim, ancak yine de "Bu MySQL sürümünde kullanılan komuta izin verilmiyor" mesajı alıyorum

Yanıtlar:


197

MySQL 5.5 kılavuz sayfasından:

YEREL yalnızca sunucunuz ve istemciniz izin verecek şekilde yapılandırıldıysa çalışır. Örneğin, mysqld --local-infile = 0 ile başlatılmışsa, LOCAL çalışmaz. Bkz. Bölüm 6.1.6, "YEREL VERİ YÜKLEME ile İlgili Güvenlik Sorunları".

Seçeneği ayarlamalısınız:

local-infile=1

senin içine [MySQL] ile my.cnf dosya veya çağrı MySQL istemci girişi --local-infile seçeneği:

mysql --local-infile -uroot -pyourpwd yourdbname

Sunucu tarafında "yerel dosya" özelliğini etkinleştirmek için aynı parametrenin [mysqld] bölümünde de tanımlandığından emin olmalısınız .

Bu bir güvenlik kısıtlaması.


4
Teşekkürler. btw, my.cnfyol /etc/mysql/my.cnfmakinemde (AWS EC2).
SparkAndShine

İlginç bir şekilde my.cnf dosyası benim için / etc dizinindeydi.
SgtRock

Bu hala başarısız olursa nereye gideceğine dair herhangi bir fikir. [Client], [mysqld] ve [mysql] altındaki my.cnf dosyasına local-infile = 1 ekledim ve bunların kombinasyonlarını kullandım. Hepsi aynı sonuçlarla. Tezgahı yeniden başlatmayı denedim ama şans yok. Her değişiklik arasında mySQL çalışma tezgahını da durdurdum ve başlattım.
OrwellHindenberg


Cevap doğru yönde. Ama burada bu sorunla karşılaşanlar için başka bir sorun var. Sisteminizde bir apparmor etkinse ve sorun devam ederse, mysqld daemon'un engellenip engellenmediğini görmek için syslog'u kontrol edin. Bu sorun vardı: apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33. Çözüm çok basit. Sadece güncelleme yapın /etc/apparmor.d/local/usr.sbin.mysqldve apparmor servisini yeniden yükleyin.
Aslan

60

Düzenlemeniz gereken my.cnf dosyası /etc/mysql/my.cnf dosyasıdır. Sadece:

sudo nano /etc/mysql/my.cnf

Sonra Ekle:

[mysqld]
local-infile 

[mysql]
local-infile 

Başlıklar [mysqld] ve [mysql] zaten verilmiştir, sadece bunları dosyada bulun ve her birinin altına yerel dosya ekleyin .

Benim için Ubuntu 12.04 LTS üzerinde MySQL 5.5 üzerinde çalışıyor.


1
Bu kesinlikle benim için Ubuntu 12.04 ile düzeltti.
John Fiala 1812

4
Ben de teyit edebilirim Ubuntu 14.04.2 LTS not working.
Ain Tohvri

Mac için de çalışıyor. Mac kullanıcıları için /mysql/my.cnfvarsayılan olarak mevcut değildir. Sadece dizini ve dosyayı oluşturun ve bu satırları dosyaya yapıştırın.
Zheng Liu

Eğer mysql yükseltildiğinde bu konfigürasyonun üzerine yazılmasını istemiyorsanız , bunu ayrıca, etkili olması için konfigürasyon değişikliğini yaptıktan sonra şunu /etc/mysql/conf.d/enable-local-infile.cnf da içine koymalısınız sudo service mysql restart.
Stephen Ostermiller

Doğru çözüm budur. En yüksek oy verilen çözüm, yerel dosya satırından önce [mysqld] yazmanız gerektiğini belirtmez.
user3260912


28

Bu sorunu MySQL 8.0.11'de mysql terminal komutu ile çözdüm:

SET GLOBAL local_infile = true;

İlk önce her zamanki gibi giriş yaptım demek istiyorum:

mysql -u user -p*

Bundan sonra şu komutla durumu görebilirsiniz:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

AÇIK olmalıdır. Burada yerel dosyaların veritabanına yüklenmesi ile verilen güvenlik hakkında yazmayacağım.


Diğer birçok çözümü denedim, ancak yalnızca komut SET GLOBAL local_infile = true; çalışıyor. MySQL sürümüm 8.0.12. Belki de bu en son çözümdür. Çok teşekkürler.
mathsyouth

1
Maalesef, sunucu yeniden başlatıldıktan sonra değişken tekrar KAPALI.
Pedro

Mohit, bir şekilde çözdüm çünkü artık global değişken 'local_infile' yeniden başlatıldıktan sonra bile her zaman AÇIK. Görünüşe göre bunun için benim.cnf dosyamı kullanmadım. Lütfen, en son sürüm olan PhpMyAdmin'de root olarak oturum açmayı deneyebilir misiniz, Değişkenler bölümüne gidin, 'local_infile' araması yapın, ardından Düzenle'yi tıklayıp AÇIK olarak değiştirin ve son olarak Enter tuşuna basın. İşe yaradı mı?
Oleksiy Muzalyev

2
Sadece bu cevap benim 8.0.12 MySQL Community Serveriçin Windows'ta çalıştı .
endo64

Windows server 2016'da MySQL 8.0.16 yüklüyüm, SET GLOBAL local_infile = true;komutu yerine getirdim ancak yine de aynı hatayı alıyorum ERROR 1148 (42000): The used command is not allowed with this MySQL versionancak mysql ile --load-infile = 1 ile bağlantı çalıştımysql --local-infile=1 -u root -p
Junior

13

ubuntu'daki mysql lezzetiniz hiçbir koşulda işe yaramazsa ve hala 1148 hatası alırsanız, load data infilekomutu komut satırı üzerinden çalıştırabilirsiniz.

bir terminal penceresi aç

Çalıştırmak mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

mysqluser şifresini girmeniz istenecek

MySQLMonitor çalıştıracaksınız ve komut isteminiz mysql>

load data infilekomutunuzu çalıştırın (noktalı virgülle bitirmeyi unutmayın ; )

bunun gibi:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

9

Aşağıdaki resme bakın ...

--local-infile=1Normal mysql komutuna ekledimmysql -u root -p

Yani toplam satır şöyle olacaktır:

mysql --local-infile = 1 -u kök -p

görüntü açıklamasını buraya girin


Bu benim için çalışmadığı zaman işe yaradı SET GLOBAL ... Bir 'kaynak' komutu ( \. file.sql) bir şekilde yeni bir oturum başlatır mı veya bunu sıfırlar mı? Ayarı mmy sql betiğine koymayı denemedim.
Toddkaufmann

5

Ayrıca, diğer okuyucular için, bunu Django'da yapmaya çalışıyorsanız VE sunucunuz local_infile'a izin veriyorsa (bir mysql istemcisi aracılığıyla SHOW VARIABLES yazarak kontrol edebilirsiniz) daha sonra bunu settings.py dosyanıza ekleyebilirsiniz (python MySQLdb'den beri) t varsayılan olarak .my.cnf dosyasını okuyun):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}

3

Mysqli bağlantınızı nasıl kurduğunuza dikkat etmelisiniz. Bu çözüm için tam kredi Jorge Albarenque'e gidiyor, kaynak

Düzeltmek için yapmam gerekiyordu:

  • My.cnf'nin [mysqld] ve [mysql] bölümlerine local-infile = 1 ekleyin (yukarıdaki yorumlarda açıklandığı gibi)
  • Mysqli_real_connect işlevini kullanın ( PHP belgeleri ).

İşin püf noktası, bu işlevle YEREL BİLGİ YÜKLE DATA desteğini açıkça etkinleştirebilmenizdir. Örneğin (prosedür tarzı):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

veya nesne yönelimli

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);

1
@Mask Onaylanamıyor. Çözümüm 5.5.46 (Ubuntu) üzerinde çalışıyor
sieppl

3

csv dosyanız db ile aynı yerdeyse , LOAD DATA INFILE içindeki LOCAL öğesini kaldırmanız gerekir , aksi takdirde hata alırsınız

Bu MySQL sürümünde kullanılan komuta izin verilmiyor


Bu benim için yaptı, ama sonra Nelson'ın cevabını burada
Dominic

1

Başka bir yol da mysqlimportistemci programını kullanmaktır .

Bunu şu şekilde çağırırsınız:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

Bu , tabloya LOAD DATAyüklenen bir ifade oluşturur .tableName.txttableName

Aşağıdakileri aklınızda bulundurun:

mysqlimportsağladığınız dosyadan tablo adını belirler; dosya adının başlangıcından ilk noktaya kadar tüm metni tablo adı olarak kullanmak. Bu nedenle, aynı tabloya birkaç dosya yüklemek isterseniz tableName.1.txt, tableName.2.txtörneğin, ..., vb. Gibi onları ayırt edebilirsiniz .


1

Bu benim için biraz tuhaf gitti, bir günden diğerine günlerden beri çalışan senaryo çalışmayı bıraktı. Mysql'nin daha yeni bir sürümü ya da herhangi bir yükseltme yoktu, ancak aynı hatayı alıyordum, bu yüzden CSV dosyasına son bir deneme yaptım ve satır sonlarının beklenen yerine \ n kullandığını fark ettim (komut dosyam başına ) \ r \ n bu yüzden onu doğru EOL ile kaydediyorum ve herhangi bir sorun yaşamadan betiği tekrar çalıştırıyorum.

Sanırım mysql'in bana söylemesi biraz garip. Kullanılan komutun nedeni tamamen farklı olduğu için bu MySQL sürümünde kullanılmasına izin verilmiyor.

Çalışma komutum şuna benziyor:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.

1

Mysql-5.5.51-winx64 ve 5.5.50-MariaDB üzerinde test edilen, yapılandırmada herhangi bir değişiklik gerektirmeyen aşağıdaki yöntemi kullandım :

.sql dosyasına 'veri yükle ...' koyun (ör: LoadTableName.sql)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

sonra:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"

1

Mysql 5.7 ise "local_infile" gibi global değişkenleri göster "; bu, yerel dosya durumunu verecek, "set global local_infile = ON;" seçeneğini kullanarak bunu açabilirsiniz.


0

Tamam, burada tuhaf bir şeyler oluyor. Bunun çalışması için /etc/mysql/my.cnf dosyasında herhangi bir yapılandırma değişikliği yapmanıza gerek YOKTUR. Tek yapmanız gereken mevcut mysql servisini terminalde yeniden başlatmak:

sudo service mysql restart

Ardından, hatayı "yeniden oluşturmak" istersem, apache hizmetini yeniden başlatırım:

sudo service apache2 restart

Aşağıdaki komut girilerek daha sonra tekrar düzeltilebilir:

sudo service mysql restart

Öyleyse, apache2 başladığında bu özelliğe izin vermemek için bir şeyler yapıyormuş gibi görünüyor (bu, mysql hizmetini yeniden başlatırsa tersine çevrilir / düzeltilir).

Debian tabanlı dağıtımlarda geçerlidir.

service mysqld restart
service httpd restart

RedHat tabanlı dağıtımlarda geçerlidir


0

LOAD DATA LOCALINFILE'ı benim gibi çalıştıracak yanıtlar arayanlar için bu muhtemelen işe yarayabilir. Benim için çalıştı, işte burada. Yükleme perconabağlantıdan adımları izleyerek MySQL sunucusu ve istemcisi olarak. Kurulum sırasında bir parola istenecektir, bu nedenle daha sonra hatırlayacağınız ve kullanacağınız bir parola sağlayın. Kurulum tamamlandıktan sonra, sisteminizi yeniden başlatın ve gidip terminalve yazarak mysql -u root -pve ardından şifreyi girerek sunucunun çalışıp çalışmadığını test edin . Komutu çalıştırmayı deneyinLOAD DATA LOCAL INFILEŞimdi .. Umarım işe yarar :)

BTW Ubuntu 12.04'te Ruby 1.9.3 ile Rails 2.3 üzerinde çalışıyordum.


0

Hepsi: Görünüşe göre bu tasarlandığı gibi çalışıyor. Lütfen 2019-7-23 tarihli yeni referans, Bölüm 6.1.6, YÜK VERİLERİ YEREL Güvenlik Sorunları'na bakın .


0

local_infileHer ikisini de clientve mysqldbölümünü ekleyin .

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

MySQL 8.x'te hem Windows hem de Linux'ta test edilmiştir.


0

Xampp v3.2.4 ve mysql sunucusu 8.0.20 kullanıyorum.

Eklediğim local-infile=1için [mysql]ve [mysqld]"my.ini" dosyasında. Dosya "C: \ xampp \ mysql \ bin \ my.ini" konumunda bulunur.

Daha sonra aşağıdaki kodu kullanarak csv dosyasındaki verileri ekledim LOAD DATA INFILE ... . YEREL taşımak önemlidir. Aksi takdirde işe yaramaz.

Yukarıdaki tüm öneriler için teşekkürler. Bir kombinasyon nihayet benim için çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.