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.