MySQL'deki veri dosyalarının yüklenmesi için erişim reddedildi


105

MySQL sorgularını PHP'de her zaman kullanıyorum, ancak denediğimde

LOAD DATA INFILE

Aşağıdaki hatayı alıyorum

# 1045 - 'user' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanılarak: YES)

Bunun ne anlama geldiğini bilen var mı?

Yanıtlar:


197

Ben de bu sorunla karşılaştım. LOCALSQL deyimime eklemem gerekiyordu.

Örneğin, bu izin sorununu verir:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Ekstrenize ekleyin LOCALve izin sorunu ortadan kalkacaktır. Şöyle:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
Bu farklı bir şey yapar. Dosyanızı geçici bir dizinde sunucuya yükler. Bu bazen gereklidir, ancak dosya zaten MySQL sunucusundaysa, sadece fazladan çalışma yapıyorsunuz demektir.
jeffcook2150

1
evet bu benim için hile yaptı, veritabanı sunucusu portunu ssh üzerinden iletiyordum ve sanırım uzak veritabanı sunucusundaki dosyayı LOCAL kısmı olmadan arıyordu
mike

2
@jeremysawesome benim için aşağıdaki hatayı üretiyor: Hata Kodu: 1148 Bu MySQL sürümünde kullanılan komuta izin verilmiyor. Bu sorun için mysql dosyasını local-infile = 1 olarak değiştirmek gibi bazı cevaplar denedim ve bu da başarısız oldu.
OrwellHindenberg


4
ayrıca --local-infileseçenekle mysql'i aramanız gerekebilir .
shabbychef

32

Bu sorunu yaşadım. Etrafı araştırdım ve tatmin edici bir cevap bulamadım. Aramalarımın sonuçlarını aşağıda özetliyorum.

Erişim reddedildi hatası şu anlama gelebilir:

  • 'user' @ 'localhost' FILE ayrıcalığına ( GRANT FILE on *.* to user@'localhost') sahip değil ; veya,
  • yüklemeye çalıştığınız dosya mysql sunucusunu çalıştıran makinede mevcut değil (LOAD DATA INFILE kullanılıyorsa); veya,
  • yüklemeye çalıştığınız dosya yerel makinenizde mevcut değil (LOAD DATA LOCAL INFILE kullanılıyorsa); veya,
  • yüklemeye çalıştığınız dosya herkes tarafından okunabilir değil (dosyanın ve tüm ana dizinlerin herkes tarafından okunabilir olması gerekir: chmod 755 dizini; ve chmod 744 file.dat)

+1: Bu benim için çalıştı: yüklemeye çalıştığınız dosya herkes tarafından okunabilir değil (dosyanın ve tüm ana dizinlerin herkes tarafından okunabilir olması gerekir: chmod 755 dizini; ve chmod 744 file.dat) . Tüm dizinlerimdeki izinleri değiştirmedim
gavdotnet

1
Tatiana kullanıcısı, yalnızca tüm sunucu için veritabanı başına DOSYA ayrıcalığını veremeyeceğinizi belirtiyor. Grant komutu "FILE on . To . To user @ 'localhost' IDENTIFIED 'password');"
JAL

3
@JAL Sanırım "DOSYAYI AÇIK *. * Kullanıcıya ..." demek istediniz - muhtemelen yıldız karakterleri kaldırıldı
Eugene M

@Eugene M'nin dediği gibi bu hata veriyor DB GRANT ve GLOBAL PRIVILEGES'in yanlış kullanımı
Accountant م

19

Bu komutu kullanmayı deneyin:

load data local infile 'home/data.txt' into table customer;

Bu çalışmalı. Benim durumumda işe yaradı.


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

@Stewart, lütfen yukarıdaki komuttan 'yerel'i kaldırın. Daha sonra mysql sürümleri, genel değişken 'local_infile' değişkeni 'ON' olarak ayarlandığında (aşağıdaki gibi) bu bayrağı desteklemiyor gibi görünüyor. Komut bu nedenle; mysql> 'home / data.txt' veri dosyasını tablo müşterisine yükle; + --------------- + ------- + | Değişken_adı | Değer | + --------------- + ------- + | local_infile | AÇIK | + --------------- + ------- +
Kamran Hyder

@KamranHyder Bana iyi bir cevabın var gibi görünüyor. Neden tam cevap olarak eklemiyorsunuz?
Stewart

10

MySQL kullanıcınızın verilen FILE ayrıcalığına sahip olduğundan emin olun.

Paylaşılan web barındırma hizmetindeyseniz, bunun barındırma sağlayıcınız tarafından engellenme ihtimali vardır.


Paylaşılan bir web barındırmada: "YEREL BİLGİ YEREL DATA YÜKLE" kullanmak yararlı olur mu?
Peter

3

Lyon'dan gelen dize bana çok iyi bir ipucu verdi: Windows'ta ters eğik çizgi değil, slah kullanmamız gerekiyor. Bu kod benim için çalışıyor:

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();


2

Bu benim de başıma geldi ve Yamir'in gönderisinde anlattığı tüm adımları izlememe rağmen işe yarayamadım.

Dosya 777 izne sahip /tmp/test.csv içindeydi. MySQL kullanıcısının dosya izinleri vardı, LOCAL seçeneğine MySQL sürümüm tarafından izin verilmedi, bu yüzden takılı kaldım.

Sonunda sorunu şu şekilde çözebildim:

sudo chown mysql:mysql /tmp/test.csv

2

Komut satırı kullanıyorsanız kolay buldum

Olarak giriş yapmysql -u[username] -p[password] --local-infile

sonra SET GLOBAL local_infile = 1;

veri tabanınızı seçin use [db_name]

ve sonunda LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


--Local-inline'ı eklemek bana yardımcı oldu. Ancak, local_infile genel değişkeni benim durumumda zaten ON olarak ayarlandı. Bence kullanıcılar, değiştirmeden önce bu değişkende hangi değeri yazdıklarını anlamalı.
Eugene Maysyuk

RDS kullanıcıları için => --local-infile'ı eklemek RDS'de bana yardımcı oldu, ancak SET GLOBAL local_infile = 1;RDS'de işe yaramıyor gibi görünüyor, ama yine --local-infilede hile oldu
Gerçek

0

MySQL tablolarının yüklenmesinin hızlı ve zahmetsiz olabileceğini keşfettim (python / Django model yöneticisi betikleri kullanıyordum):

1) tüm sütunlarda VARCHAR (n) NULL olan bir tablo oluşturun, örneğin:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2) csv'den üstbilgileri (ilk satır) kaldırın, ardından yükleyin (LOCAL'ı unutursanız, "# 1045 - 'user' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: YES)):

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3) sütunları değiştirin:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voilà!


-5

Muhtemelen sağladığınız şifrenin 'user'@'localhost'yanlış olduğu anlamına gelir .


1
Ben öyle düşünmüyorum. Aynı şifre ile başka sorgular da yapabilirim.
Brian
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.