quyền truy cập bị từ chối đối với tệp dữ liệu tải trong MySQL


105

Tôi sử dụng truy vấn MySQL mọi lúc trong PHP, nhưng khi tôi thử

LOAD DATA INFILE

Tôi nhận được lỗi sau đây

# 1045 - Quyền truy cập bị từ chối đối với người dùng 'user' @ 'localhost' (sử dụng mật khẩu: CÓ)

Có ai biết điều này?

Câu trả lời:


197

Tôi cũng chỉ gặp vấn đề này. Tôi đã phải thêm LOCALvào câu lệnh SQL của mình.

Ví dụ: điều này gây ra vấn đề về quyền:

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

Thêm LOCALvào tuyên bố của bạn và vấn đề về quyền sẽ biến mất. Như vậy:

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

12
Điều này làm một điều khác biệt. Nó tải tệp của bạn lên máy chủ trong một thư mục tạm thời. Điều này đôi khi là cần thiết, nhưng nếu tệp tin đã có trên máy chủ MySQL, bạn chỉ đang thực hiện công việc thừa.
jeffcook2150

1
yep này đã làm các trick cho tôi, tôi đã chuyển tiếp cổng máy chủ cơ sở dữ liệu qua ssh và tôi đoán nó đang tìm kiếm các tập tin trên máy chủ cơ sở dữ liệu từ xa mà không cần phần ĐỊA PHƯƠNG
mike

2
@jeremysawesome đối với tôi, điều này tạo ra lỗi sau: Mã lỗi: 1148 Lệnh đã sử dụng không được phép với phiên bản MySQL này. Tôi đã thử một số câu trả lời cho vấn đề này, chẳng hạn như sửa đổi tệp mysql thành local-infile = 1 và cũng không thành công.
OrwellHindenberg

một bản cập nhật của mySQL để 6.2.5 giải quyết vấn đề này đối với tôi
OrwellHindenberg

4
bạn cũng có thể phải gọi mysql với --local-infiletùy chọn.
shabbychef

32

Tôi đã có vấn đề này. Tôi đã tìm kiếm xung quanh và không tìm thấy câu trả lời thỏa đáng. Tôi tóm tắt bên dưới kết quả tìm kiếm của tôi.

Lỗi truy cập bị từ chối có thể có nghĩa là:

  • 'user' @ 'localhost' không có đặc quyền FILE ( GRANT FILE on *.* to user@'localhost'); hoặc là,
  • tệp bạn đang cố tải không tồn tại trên máy chạy máy chủ mysql (nếu sử dụng LOAD DATA INFILE); hoặc là,
  • tệp bạn đang cố tải không tồn tại trên máy cục bộ của bạn (nếu sử dụng LOAD DATA LOCAL INFILE); hoặc là,
  • tệp bạn đang cố tải không thể đọc được (bạn cần tệp tất cả các thư mục mẹ đều có thể đọc được: thư mục chmod 755; và, chmod 744 file.dat)

+1: Điều này phù hợp với tôi: tệp bạn đang cố tải không thể đọc được (bạn cần tệp và tất cả các thư mục mẹ đều có thể đọc được: thư mục chmod 755; và, chmod 744 file.dat) . Tôi đã không thay đổi quyền truy cập vào tất cả các thư mục của tôi
gavdotnet

1
Người dùng Tatiana chỉ ra rằng bạn không thể cấp đặc quyền FILE cho mỗi cơ sở dữ liệu, chỉ cho toàn bộ máy chủ. Lệnh cấp sẽ là "GRANT FILE on . To user @ 'localhost' ĐƯỢC XÁC NHẬN BẰNG 'password');"
JAL

3
@JAL Tôi nghĩ rằng bạn có nghĩa là "CẤP FILE VỀ * * để sử dụng ...." - có lẽ là nhân vật dấu bị tước đoạt
Eugene M

như @Eugene M đã nói điều này gây ra lỗi Sử dụng không chính xác các
Kế toán م

19

Hãy thử sử dụng lệnh này:

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

Điều này sẽ hoạt động. Nó đã hoạt động trong trường hợp của tôi.


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

@Stewart, vui lòng xóa 'local' khỏi lệnh trên. Các phiên bản mysql sau này dường như không hỗ trợ cờ này khi biến toàn cục 'local_infile' được đặt thành 'ON' (như bên dưới). Do đó, lệnh sẽ là; mysql> tải dữ liệu trong tệp 'home / data.txt' vào khách hàng bảng; + --------------- + ------- + | Tên_biến | Giá trị | + --------------- + ------- + | local_infile | VÀO | + --------------- + ------- +
Kamran Hyder

@KamranHyder Có vẻ như bạn có câu trả lời tốt cho tôi. Tại sao không thêm nó như một câu trả lời đầy đủ?
Stewart

10

Đảm bảo người dùng MySQL của bạn được cấp đặc quyền FILE.

Nếu bạn đang sử dụng dịch vụ lưu trữ web được chia sẻ, có khả năng điều này bị nhà cung cấp dịch vụ lưu trữ của bạn chặn.


Trên lưu trữ web được chia sẻ: sử dụng "LOAD DATA LOCAL INFILE" có hữu ích không?
Peter

3

Chuỗi từ Lyon đã cho tôi một mẹo rất hay: Trên Windows, chúng ta cần sử dụng dấu ngoặc kép chứ không phải dấu gạch chéo ngược. Mã này phù hợp với tôi:

    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

Tôi đã gặp phải vấn đề tương tự và giải quyết nó bằng cách thực hiện theo các bước sau:

  • kích hoạt biến load_infile
  • quyền tệp lớn cho người dùng mysql tùy chỉnh của tôi
  • hủy kích hoạt biến secure_file_priv (tệp của tôi được máy chủ web tải lên thư mục / tmp, tất nhiên không phải là thư mục bảo mật của myslq / var / lib / mysql-file)

Về điểm thứ 3 này, bạn có thể tham khảo tại: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR,

QUẢNG CÁO


2

Điều này cũng xảy ra với tôi và mặc dù đã làm theo tất cả các bước được Yamir mô tả trong bài đăng của anh ấy, tôi không thể làm cho nó hoạt động.

Tệp có trong /tmp/test.csv với 777 quyền. Người dùng MySQL có quyền truy cập tệp, tùy chọn LOCAL không được phép bởi phiên bản MySQL của tôi, vì vậy tôi đã bị mắc kẹt.

Cuối cùng tôi đã có thể giải quyết vấn đề bằng cách chạy:

sudo chown mysql:mysql /tmp/test.csv

2

Tôi tìm thấy một cái dễ dàng nếu bạn đang sử dụng dòng lệnh

Vàomysql -u[username] -p[password] --local-infile

sau đó SET GLOBAL local_infile = 1;

chọn cơ sở dữ liệu của bạn bằng cách use [db_name]

và cuối cùng 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;


Việc thêm --local-inline đã giúp tôi. Tuy nhiên, biến toàn cục local_infile đã được đặt thành BẬT trong trường hợp của tôi. Tôi nghĩ rằng người dùng tốt hơn nên tìm ra giá trị họ đã viết trong biến này trước khi sửa đổi nó.
Eugene Maysyuk

Đối với người dùng RDS => Thêm --local-infile đã giúp tôi trên RDS, tuy nhiên SET GLOBAL local_infile = 1;có vẻ như không hoạt động trong RDS, nhưng dù sao nếu không có điều đó --local-infilethì thủ thuật đã xảy ra
Sự kiện

0

Tôi phát hiện ra rằng việc tải các bảng MySQL có thể nhanh chóng và không gây đau đớn (tôi đang sử dụng tập lệnh trình quản lý mô hình python / Django):

1) tạo bảng với tất cả các cột VARCHAR (n) NULL, ví dụ:

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


 2) xóa tiêu đề (dòng đầu tiên) khỏi csv, sau đó tải (nếu bạn quên LOCAL, bạn sẽ nhận được “# 1045 - Quyền truy cập bị từ chối đối với người dùng 'user' @ 'localhost' (sử dụng mật khẩu: CÓ)”):

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) thay đổi cột:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voilà!


-5

Nó có thể có nghĩa là mật khẩu bạn cung cấp 'user'@'localhost'không chính xác.


1
Tôi không nghĩ vậy. Tôi có thể thực hiện các truy vấn khác với cùng một mật khẩu.
Brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.