Jawaban:
Saya baru saja mengalami masalah ini juga. Saya harus menambahkan LOCAL
pernyataan SQL saya.
Misalnya, ini memberi masalah izin:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}
Tambahkan LOCAL
ke pernyataan Anda dan masalah izin akan hilang. Seperti:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}
--local-infile
opsi tersebut.
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:
GRANT FILE on *.* to user@'localhost'
); atau,Coba gunakan perintah ini:
load data local infile 'home/data.txt' into table customer;
Ini seharusnya berhasil. Ini berhasil dalam kasus saya.
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Pastikan pengguna MySQL Anda memiliki hak istimewa FILE yang diberikan.
Jika Anda menggunakan hosting web bersama, ada kemungkinan ini diblokir oleh penyedia hosting Anda.
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();
Saya mengalami masalah yang sama, dan menyelesaikannya dengan mengikuti langkah-langkah berikut:
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
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
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;
SET GLOBAL local_infile = 1;
tampaknya tidak berfungsi di RDS, tetapi tanpa itu --local-infile
triknya berhasil
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!
Itu mungkin berarti bahwa kata sandi yang Anda berikan 'user'@'localhost'
salah.