Yanıtlar:
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ı.
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.
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.
Ubuntu 14.04.2 LTS not working.
/mysql/my.cnfvarsayılan olarak mevcut değildir. Sadece dizini ve dosyayı oluşturun ve bu satırları dosyaya yapıştırın.
/etc/mysql/conf.d/enable-local-infile.cnf da içine koymalısınız sudo service mysql restart.
Php5-mysql sürücüsünü yerel sürücü ile değiştirin
Debian'da
apt-get install php5-mysqlnd
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.
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.
8.0.12 MySQL Community Serveriçin Windows'ta çalıştı .
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
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';
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
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.
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,
},
}
}
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:
İş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);
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
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 .
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.
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"
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
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.
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.
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ı.
my.cnfyol/etc/mysql/my.cnfmakinemde (AWS EC2).