ฉันใช้แบบสอบถาม MySQL ตลอดเวลาใน PHP แต่เมื่อฉันลอง
LOAD DATA INFILE
ฉันได้รับข้อผิดพลาดต่อไปนี้
# 1045 - การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'user' @ 'localhost' (ใช้รหัสผ่าน: ใช่)
ไม่มีใครรู้ว่านี่หมายถึงอะไร?
ฉันใช้แบบสอบถาม MySQL ตลอดเวลาใน PHP แต่เมื่อฉันลอง
LOAD DATA INFILE
ฉันได้รับข้อผิดพลาดต่อไปนี้
# 1045 - การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'user' @ 'localhost' (ใช้รหัสผ่าน: ใช่)
ไม่มีใครรู้ว่านี่หมายถึงอะไร?
คำตอบ:
ฉันเพิ่งพบปัญหานี้เช่นกัน ฉันต้องเพิ่มLOCAL
คำสั่ง SQL ของฉัน
ตัวอย่างเช่นสิ่งนี้ทำให้เกิดปัญหาการอนุญาต:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}
เพิ่มLOCAL
ลงในใบแจ้งยอดของคุณและปัญหาการอนุญาตจะหายไป ชอบมาก:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}
--local-infile
ตัวเลือก
ฉันมีปัญหานี้ ฉันค้นหารอบ ๆ และไม่พบคำตอบที่น่าพอใจ ฉันสรุปด้านล่างผลการค้นหาของฉัน
ข้อผิดพลาดการเข้าถึงถูกปฏิเสธอาจหมายความว่า:
GRANT FILE on *.* to user@'localhost'
); หรือ,ลองใช้คำสั่งนี้:
load data local infile 'home/data.txt' into table customer;
สิ่งนี้ควรใช้งานได้ มันใช้ได้ในกรณีของฉัน
ERROR 1148 (42000): The used command is not allowed with this MySQL version
ตรวจสอบให้แน่ใจว่าผู้ใช้ MySQL ของคุณได้รับสิทธิ์ FILE
หากคุณใช้เว็บโฮสติ้งที่ใช้ร่วมกันอาจมีโอกาสที่ผู้ให้บริการโฮสติ้งของคุณบล็อกนี้
สตริงจากลียงให้คำแนะนำที่ดีแก่ฉัน: ใน Windows เราต้องใช้สแลชไม่ใช่แบ็กสแลช รหัสนี้ใช้ได้กับฉัน:
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();
ฉันพบปัญหาเดียวกันและแก้ไขได้โดยทำตามขั้นตอนเหล่านี้:
สำหรับจุดที่ 3 นี้คุณสามารถอ้างถึง: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv
BR,
ค.ศ.
สิ่งนี้เกิดขึ้นกับฉันเช่นกันและแม้ว่าจะทำตามขั้นตอนทั้งหมดที่ Yamir อธิบายไว้ในโพสต์ของเขาแล้วฉันก็ไม่สามารถทำให้มันใช้งานได้
ไฟล์อยู่ใน /tmp/test.csv ที่มีสิทธิ์ 777 ผู้ใช้ MySQL มีสิทธิ์ไฟล์ตัวเลือก LOCAL ไม่ได้รับอนุญาตจากเวอร์ชัน MySQL ของฉันดังนั้นฉันจึงติดขัด
ในที่สุดฉันก็สามารถแก้ปัญหาได้โดยเรียกใช้:
sudo chown mysql:mysql /tmp/test.csv
ฉันพบว่าง่ายถ้าคุณใช้บรรทัดคำสั่ง
เข้าสู่ระบบด้วยmysql -u[username] -p[password] --local-infile
แล้ว SET GLOBAL local_infile = 1;
เลือกฐานข้อมูลของคุณโดย use [db_name]
และในที่สุดก็ 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;
ดูเหมือนจะไม่ทำงานใน RDS แต่อย่างไรก็ตามหากไม่มี--local-infile
เคล็ดลับนั้นก็เกิดขึ้น
ฉันค้นพบว่าการโหลดตาราง MySQL นั้นรวดเร็วและไม่เจ็บปวด (ฉันใช้สคริปต์ตัวจัดการโมเดล python / Django):
1) สร้างตารางด้วยคอลัมน์ทั้งหมด VARCHAR (n) NULL เช่น:
mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);
2) ลบส่วนหัว (บรรทัดแรก) จาก csv จากนั้นโหลด (หากคุณลืม LOCAL คุณจะได้รับ "# 1045 - การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'user' @ 'localhost' (โดยใช้รหัสผ่าน: ใช่)”):
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) แก้ไขคอลัมน์:
mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;
mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;
โวล่า!
อาจหมายความว่ารหัสผ่านที่คุณระบุ'user'@'localhost'
ไม่ถูกต้อง