2013-04-29 37 views
22

Tôi không chắc chắn một câu hỏi tương tự với điều này đã bị đóng bởi tôi đang cố gắng thực thi chương trình MySQL sau đây.Làm thế nào tôi có thể sửa Lỗi tải MySQL

mysql -e "load data local infile \ 
'/tmp/ept_inventory_wasp_export_04292013.csv' into \ 
table wasp_ept_inv fields terminated by ',' \ 
lines terminated by '\n' ;" 

tại dòng lệnh bash và nhận được lỗi này

ERROR 1148 (42000) at line 1: The used command is not allowed with this MySQL version

Làm thế nào tôi có thể làm việc xung quanh vấn đề này?

Tôi thực sự đang chạy lệnh này từ một chương trình Python, nhưng đã rút lệnh ra để thử không sử dụng lệnh này ở dòng lệnh bash.

Tôi đã thấy cách tôi có thể sửa đổi my.cnf (địa phương-infile), nhưng tôi không muốn thay đổi toàn cầu đó nếu tôi có thể tránh nó.

Đây là phiên bản MySQL.

mysql Ver 14.14 Distrib 5.5.31, for debian-linux-gnu (i686) using readline 6.2

Trả lời

29

Như ghi nhận dưới Security Issues with LOAD DATA LOCAL:

Để đối phó với những vấn đề này, chúng tôi đã thay đổi như thế nào LOAD DATA LOCAL được xử lý như của MySQL 3.23.49 và MySQL 4.0.2 (4.0.13 trên Windows) :

  • Theo mặc định, tất cả máy khách và thư viện MySQL trong bản phân phối nhị phân được biên dịch với tùy chọn --enable-local-infile tương thích với MySQL 3.23.48 và trước đó.

  • Nếu bạn xây dựng MySQL từ nguồn nhưng không gọi cấu hình với tùy chọn --enable-local-infile, LOAD DATA LOCAL không thể được sử dụng bởi bất kỳ ứng dụng khách trừ khi được viết rõ ràng để gọi mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0). Xem Section 20.6.6.49, “mysql_options().

  • Bạn có thể vô hiệu hóa tất cả các tuyên bố LOAD DATA LOCAL từ phía máy chủ bằng cách bắt đầu mysqld với tùy chọn --local-infile=0.

  • Cho ứng dụng khách dòng lệnh mysql, bật LOAD DATA LOCAL bằng cách chỉ định tùy chọn --local-infile[=1] hoặc tắt tùy chọn --local-infile=0. Đối với mysqlimport, tải tệp dữ liệu cục bộ bị tắt theo mặc định; bật tùy chọn này với tùy chọn --local hoặc -L. Trong mọi trường hợp, việc sử dụng thành công hoạt động tải cục bộ yêu cầu máy chủ cho phép nó.

  • Nếu bạn sử dụng LOAD DATA LOCAL trong tập lệnh Perl hoặc các chương trình khác đọc nhóm [client] từ tệp tùy chọn, bạn có thể thêm tùy chọn local-infile=1 vào nhóm đó.Tuy nhiên, để giữ này từ gây ra vấn đề cho các chương trình mà không hiểu local-infile, xác định nó bằng cách sử dụng loose- tiền tố:

     
    [client] 
    loose-local-infile=1 
    
  • Nếu LOAD DATA LOCAL bị vô hiệu hóa, hoặc trong các máy chủ hoặc khách hàng, một khách hàng mà cố gắng để phát hành một tuyên bố như vậy nhận được thông báo lỗi sau:

    ERROR 1148: The used command is not allowed with this MySQL version

+1

Điều đó không giúp ích gì cho tôi. Tôi muốn một cách giải quyết. Và tôi đặt địa phương-infile trong my.cnf, và điều đó đã không thay đổi lỗi. Tôi bắt đầu MySQL với các câu lệnh được cung cấp khi cài đặt. Tôi không làm gì đặc biệt cả. Câu trả lời của bạn vẫn không cung cấp một cách giải quyết, bởi vì tôi đã không vô hiệu hóa bất cứ điều gì. – octopusgrabbus

+0

@octopusgrabbus nếu nó không giúp bạn chút nào, tại sao bạn lại chấp nhận câu trả lời? Tại sao bạn không chấp nhận câu trả lời của riêng bạn thay vì ??? – TMS

0

Tôi đoán là máy chủ MySQL của bạn chưa được kích hoạt LOAD DATA LOCAL. Xem phần này của tài liệu MySQL:

Nếu LOAD DATA LOCAL bị vô hiệu hóa, hoặc trong các máy chủ hoặc khách hàng, một khách hàng mà cố gắng để ra một tuyên bố như vậy nhận được thông báo lỗi sau:

ERROR 1148: lệnh sử dụng không được phép với phiên bản này MySQL

Dưới đây là liên kết tới trang tôi nhận này từ:

http://dev.mysql.com/doc/refman/5.5/en/load-data-local.html

.210
45

Cách giải quyết của việc này là để thay đổi dòng lệnh mysql -e để vượt qua trong đối số --local-infile=1 như thế này:

mysql --local-infile=1 -u username -p ` 

Sau đó chạy lệnh LOAD DATA LOCAL INFILE một lần nữa.

7

local-infile cần bật trên cả máy chủ và ứng dụng khách. Bạn có thể thực hiện việc này bằng cách thêm local-infile = 1 vào phần thích hợp trong mỗi tệp kết thúc của mỗi đầu tệp my.cnf (Unix) hoặc my.ini (Windows). Ví dụ, trên máy khách:

[client] 
local-infile = 1 

Bạn cũng có thể kích hoạt tính năng này khi chạy trên máy chủ bằng cách thiết lập các biến hệ thống local_infile:

SET GLOBAL local_infile=1; 

Tuy nhiên, bạn vẫn cần phải kích hoạt nó trên máy khách. Bạn có thể làm điều này trong thời gian chạy bằng cách thêm một tham số dòng lệnh để lệnh mysql:

mysql --local-infile=1 ... 

Nếu bạn đang sử dụng Amazon Web Services RDS, bạn có thể cấu hình các thiết lập máy chủ bằng cách chỉnh sửa hoặc tạo Nhóm Parameter. Tìm kiếm thông số local_infile. Bạn có thể cần phải khởi động lại máy chủ của bạn sau khi áp dụng các thay đổi.

+1

'SET local_infile = 1;' sẽ thất bại trên các phiên bản MySQL mới hơn. –

+1

SET GLOBAL local_infile = 1; đã làm cho tôi. – Minkymorgan

+0

@Minkymorgan Cảm ơn, đã cập nhật. – Zenexer

Các vấn đề liên quan