akses ditolak untuk memuat data infile di MySQL

105

Saya menggunakan kueri MySQL sepanjang waktu dalam PHP, tetapi ketika saya mencoba

LOAD DATA INFILE

Saya mendapatkan kesalahan berikut

# 1045 - Akses ditolak untuk pengguna 'user' @ 'localhost' (menggunakan kata sandi: YA)

Adakah yang tahu apa artinya ini?

Brian
sumber

Jawaban:

197

Saya baru saja mengalami masalah ini juga. Saya harus menambahkan LOCALpernyataan SQL saya.

Misalnya, ini memberi masalah izin:

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

Tambahkan LOCALke pernyataan Anda dan masalah izin akan hilang. Seperti:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}
jeremysawesome
sumber
12
Ini melakukan hal yang berbeda. Itu mengunggah file Anda ke server dalam direktori sementara. Ini terkadang diperlukan, tetapi jika infile sudah ada di server MySQL, Anda hanya membuat pekerjaan yang berlebihan.
jeffcook2150
1
ya ini melakukan trik untuk saya, saya meneruskan port server database melalui ssh dan saya kira itu mencari file di server database jarak jauh tanpa bagian LOKAL
mike
2
@jeremysawesome bagi saya ini menghasilkan kesalahan berikut: Kode Kesalahan: 1148 Perintah yang digunakan tidak diperbolehkan dengan versi MySQL ini. Saya mencoba beberapa jawaban untuk masalah ini seperti memodifikasi file mysql menjadi local-infile = 1 dan itu juga gagal.
OrwellHindenberg
pembaruan mySQL ke 6.2.5 memecahkan masalah ini untuk saya
OrwellHindenberg
4
Anda mungkin juga harus memanggil mysql dengan --local-infileopsi tersebut.
shabbychef
32

Saya punya masalah ini. Saya mencari-cari dan tidak menemukan jawaban yang memuaskan. Di bawah ini saya rangkum hasil pencarian saya.

Kesalahan akses ditolak dapat berarti bahwa:

  • 'user' @ 'localhost' tidak memiliki hak istimewa FILE ( GRANT FILE on *.* to user@'localhost'); atau,
  • file yang Anda coba muat tidak ada di mesin yang menjalankan server mysql (jika menggunakan LOAD DATA INFILE); atau,
  • file yang Anda coba muat tidak ada di komputer lokal Anda (jika menggunakan LOAD DATA LOCAL INFILE); atau,
  • file yang Anda coba muat tidak dapat dibaca dunia (Anda memerlukan file dan semua direktori induk agar dapat dibaca di dunia: direktori chmod 755; dan, chmod 744 file.dat)
Yamir Encarnacion
sumber
+1: Ini berhasil untuk saya: file yang Anda coba muat tidak dapat dibaca dunia (Anda memerlukan file dan semua direktori induk agar dapat dibaca di dunia: direktori chmod 755; dan, chmod 744 file.dat) . Saya belum mengubah izin pada semua direktori saya
gavdotnet
1
Pengguna Tatiana menunjukkan bahwa Anda tidak dapat memberikan hak istimewa FILE per database, hanya untuk seluruh server. Perintah hibah akan menjadi "GRANT FILE on . To user @ 'localhost' IDENTIFIED BY 'password');"
JAL
3
@ JAL Saya pikir yang Anda maksud adalah "GRANT FILE ON *. * To user ..." - mungkin karakter asterisk dihilangkan
Eugene M
Seperti yang dikatakan @Eugene M, ini memberikan kesalahan Penggunaan DB GRANT dan PRIVILEG GLOBAL yang salah
Akuntan م
19

Coba gunakan perintah ini:

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

Ini seharusnya berhasil. Ini berhasil dalam kasus saya.

shreyas-agrawal
sumber
3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Stewart
@Stewart, hapus 'lokal' dari perintah di atas. Nanti versi mysql tampaknya tidak mendukung flag ini ketika variabel global variabel 'local_infile' disetel ke 'ON' (seperti di bawah). Oleh karena itu, perintahnya adalah; mysql> memuat data infile 'home / data.txt' ke tabel pelanggan; + --------------- + ------- + | Variable_name | Nilai | + --------------- + ------- + | local_infile | AKTIF | + --------------- + ------- +
Kamran Hyder
@KamranHy Kedengarannya Anda punya jawaban yang bagus untuk saya. Mengapa tidak menambahkannya sebagai jawaban lengkap?
Stewart
10

Pastikan pengguna MySQL Anda memiliki hak istimewa FILE yang diberikan.

Jika Anda menggunakan hosting web bersama, ada kemungkinan ini diblokir oleh penyedia hosting Anda.

tanerkay.dll
sumber
Di web hosting bersama: apakah akan membantu jika menggunakan "BEBAN DATA LOKAL INFILE"?
Peter
3

String dari Lyon memberi saya tip yang sangat bagus: Di Windows, kita perlu menggunakan slahes dan bukan garis miring terbalik. Kode ini berfungsi untuk saya:

    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();
Matthias Wuttke
sumber
2

Saya mengalami masalah yang sama, dan menyelesaikannya dengan mengikuti langkah-langkah berikut:

  • aktifkan variabel load_infile
  • izin file besar untuk pengguna mysql kustom saya
  • nonaktifkan variabel secure_file_priv (file saya diunggah oleh server web ke folder / tmp yang tentu saja bukan direktori aman myslq / var / lib / mysql-file)

Untuk poin ke-3 ini, Anda dapat merujuk ke: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR,

IKLAN

pengguna7996813
sumber
2

Ini juga terjadi pada saya dan meskipun telah mengikuti semua langkah yang dijelaskan oleh Yamir di posnya, saya tidak dapat membuatnya berhasil.

File tersebut berada di /tmp/test.csv dengan 777 izin. Pengguna MySQL memiliki izin file, opsi LOKAL tidak diizinkan oleh versi MySQL saya, jadi saya macet.

Akhirnya saya bisa menyelesaikan masalah dengan menjalankan:

sudo chown mysql:mysql /tmp/test.csv
Giacomo
sumber
2

Saya menemukan yang mudah jika Anda menggunakan baris perintah

Masuk sebagaimysql -u[username] -p[password] --local-infile

kemudian SET GLOBAL local_infile = 1;

pilih database Anda dengan use [db_name]

dan akhirnya 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;

Shantanu Khond
sumber
Menambahkan --local-inline membantu saya. Namun, variabel global local_infile sudah disetel ke ON dalam kasus saya. Saya pikir pengguna lebih baik mencari tahu dulu nilai apa yang telah mereka tulis dalam variabel ini sebelum memodifikasinya.
Eugene Maysyuk
Untuk pengguna RDS => Menambahkan --local-infile membantu saya di RDS, namun SET GLOBAL local_infile = 1;tampaknya tidak berfungsi di RDS, tetapi tanpa itu --local-infiletriknya berhasil
Fakta
0

Saya menemukan memuat tabel MySQL bisa cepat dan tidak menyakitkan (saya menggunakan skrip manajer model python / Django):

1) buat tabel dengan semua kolom VARCHAR (n) NULL misalnya:

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


 2) hapus header (baris pertama) dari csv, lalu muat (jika Anda lupa LOKAL, Anda akan mendapatkan "# 1045 - Akses ditolak untuk pengguna 'user' @ 'localhost' (menggunakan sandi: 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) mengubah kolom:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voila!

magula
sumber
-5

Itu mungkin berarti bahwa kata sandi yang Anda berikan 'user'@'localhost'salah.

David Grant
sumber
1
Saya kira tidak. Saya dapat melakukan pertanyaan lain dengan kata sandi yang sama.
Brian