MySQL: Kích hoạt LOAD INFATA INFILE


127

Tôi đang chạy Mysql 5.5 trên Ubuntu 12 LTS. Làm cách nào để kích hoạt LOAD DATA LOCAL INFILE trong my.cnf?

Tôi đã thử thêm local-infile trong cấu hình của mình ở nhiều nơi nhưng tôi vẫn nhận được "Lệnh đã sử dụng không được phép với phiên bản MySQL này"

Câu trả lời:


197

Từ trang hướng dẫn MySQL 5.5:

LOCAL chỉ hoạt động nếu cả máy chủ và máy khách của bạn đều được cấu hình để cho phép nó. Ví dụ: nếu mysqld được bắt đầu với --local-infile = 0, thì LOCAL không hoạt động. Xem Phần 6.1.6, Các vấn đề bảo mật của vấn đề với LOAD DATA ĐỊA PHƯƠNG.

Bạn nên đặt tùy chọn:

local-infile=1

vào mục [mysql] của tệp my.cnf hoặc gọi máy khách mysql bằng tùy chọn --local-infile :

mysql --local-infile -uroot -pyourpwd yourdbname

Bạn phải chắc chắn rằng cùng một tham số được xác định trong phần [mysqld] của bạn để kích hoạt phía máy chủ tính năng "infile local".

Đó là một hạn chế bảo mật.


4
cám ơn. btw, my.cnfđường dẫn nằm /etc/mysql/my.cnftrong máy của tôi (AWS EC2).
SparkAndShine

Thật thú vị, tập tin my.cnf nằm trong thư mục / etc cho tôi.
SgtRock

Bất kỳ ý tưởng về nơi để đi nếu điều này vẫn thất bại. Tôi đã thêm local-infile = 1 vào tệp my.cnf trong [client], [mysqld] và [mysql] và sử dụng kết hợp những thứ này. Tất cả đều có kết quả như nhau. Tôi đã thử khởi động lại bàn làm việc nhưng không có may mắn. Tôi cũng đã dừng và bắt đầu bàn làm việc myQuery giữa mỗi thay đổi.
OrwellHindenberg 20/07/2015

2
một bản cập nhật của myQuery lên 6.2.5 đã giải quyết vấn đề này cho tôi
OrwellHindenberg 20/07/2015

Câu trả lời là đúng hướng. Nhưng đối với những người phải đối mặt với vấn đề này ở đây là một gotcha khác. Nếu bạn đã bật apparmor trên hệ thống của mình và sự cố vẫn còn thì hãy kiểm tra nhật ký hệ thống để xem liệu daemon mysqld có bị chặn hay không. Tôi đã có vấn đề này : apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33. Giải pháp này rất đơn giản. Chỉ cần cập nhật /etc/apparmor.d/local/usr.sbin.mysqldvà tải lại dịch vụ apparmor.
Leo

60

Tệp my.cnf bạn nên chỉnh sửa là tệp /etc/mysql/my.cnf . Chỉ:

sudo nano /etc/mysql/my.cnf

Sau đó thêm:

[mysqld]
local-infile 

[mysql]
local-infile 

Các tiêu đề [mysqld] [mysql] đã được cung cấp, chỉ cần xác định vị trí của chúng trong tệp và thêm infile-local bên dưới mỗi tệp.

Nó hoạt động với tôi trên MySQL 5.5 trên Ubuntu 12.04 LTS.


1
Điều này chắc chắn đã sửa nó cho tôi với Ubuntu 12.04.
John Fiala

4
Tôi có thể xác nhận Ubuntu 14.04.2 LTS not workinglà tốt.
Ain Tohvri

Hoạt động cho Mac, quá. Đối với người dùng Mac, /mysql/my.cnfkhông tồn tại theo mặc định. Chỉ cần tạo thư mục và tệp, và dán các dòng này vào tệp.
Trịnh Lưu

Nếu bạn không muốn cấu hình này bị ghi đè khi mysql được nâng cấp, bạn nên đặt cấu hình này vào /etc/mysql/conf.d/enable-local-infile.cnf Ngoài ra, đừng quên sudo service mysql restartsau khi thay đổi cấu hình để nó có hiệu lực.
Stephen Ostermiller

Đây là giải pháp thích hợp. Giải pháp được nâng cấp cao nhất không đề cập đến việc bạn phải đặt [mysqld] trước tiên trước dòng infile cục bộ.
dùng3260912

30

Thay thế trình điều khiển php5-mysql bằng trình điều khiển gốc

Trên debian

apt-get install php5-mysqlnd

Điều này đã làm việc! Sử dụng stock aws 12.04 ubfox, tôi cần 'local' khi tôi đang kết nối với RDS. Cảm ơn rất nhiều!
James Bowler

Cảm ơn rất nhiều, giải pháp này đã làm việc cho tôi. Tôi đã hỏi stackoverflow.com/questions/36526102/ từ
user75472

Không thành công trên Ubuntu 12.04
Zbyszek

Một khách hàng hạnh phúc khác!
ubfox

27

Tôi đã giải quyết vấn đề này trên MySQL 8.0.11 bằng lệnh thiết bị đầu cuối mysql:

SET GLOBAL local_infile = true;

Ý tôi là tôi đã đăng nhập đầu tiên với thông thường:

mysql -u user -p*

Sau đó, bạn có thể thấy trạng thái với lệnh:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Nó nên BẬT. Tôi sẽ không viết về bảo mật được cấp với việc tải các tệp cục bộ vào cơ sở dữ liệu ở đây.


Tôi đã thử nhiều giải pháp khác, nhưng chỉ có lệnh SET GLOBAL local_infile = true; hoạt động. Phiên bản MySQL của tôi là 8.0.12. Có lẽ đây là giải pháp mới nhất. Cảm ơn rất nhiều.
mathsyouth

1
Thật không may, biến lại TẮT một lần nữa sau khi khởi động lại máy chủ.
Pedro

Mohit, bằng cách nào đó tôi đã giải quyết nó, bởi vì bây giờ biến toàn cục 'local_infile' luôn BẬT, ngay cả sau khi khởi động lại. Và có vẻ như tôi đã không sử dụng tập tin my.cnf cho việc này. Bạn có thể, xin vui lòng, thử đăng nhập vào PhpMyAdmin, phiên bản mới nhất, với quyền root, đi tới phần Biến, tìm kiếm 'local_infile', sau đó nhấp vào Chỉnh sửa và thay đổi thành BẬT, và cuối cùng nhấn Enter. Nó có hoạt động không?
Oleksiy Muzalyev

2
Chỉ có câu trả lời này làm việc cho tôi 8.0.12 MySQL Community Servertrên Windows.
endo64

Tôi đã cài đặt MySQL 8.0.16 trên máy chủ Windows 2016, tôi đã thực thi SET GLOBAL local_infile = true;lệnh nhưng tôi vẫn gặp lỗi tương tự ERROR 1148 (42000): The used command is not allowed with this MySQL versionnhưng kết nối với mysql với --load-infile = 1 đã hoạt độngmysql --local-infile=1 -u root -p
Junior

13

trong trường hợp hương vị của mysql trên ubfox trong mọi trường hợp KHÔNG hoạt động và bạn vẫn gặp lỗi 1148, bạn có thể chạy load data infile lệnh thông qua dòng lệnh

mở một cửa sổ đầu cuối

chạy mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

bạn sẽ được yêu cầu chèn mật khẩu mysqluser

bạn sẽ chạy MySQLMonitor và dấu nhắc lệnh của bạn sẽ là mysql>

chạy load data infilelệnh của bạn (đừng quên kết thúc bằng dấu chấm phẩy; )

như thế này:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

9

Xem hình ảnh bên dưới ...

Tôi đã thêm --local-infile=1 lệnh mysql bình thường mysql -u root -p

Vì vậy, tổng dòng sẽ là:

mysql -local-infile = 1 -u root -p

nhập mô tả hình ảnh ở đây


Điều này làm việc cho tôi khi SET GLOBAL ..không. Có phải một lệnh 'nguồn' ( \. file.sql) bằng cách nào đó bắt đầu một phiên mới hoặc đặt lại cái này không? Tôi đã không thử đặt cài đặt trong tập lệnh sql mmy.
babkaufmann

5

Ngoài ra, đối với những người đọc khác, nếu bạn đang cố gắng thực hiện điều này trong Django VÀ máy chủ của bạn cho phép local_infile (bạn có thể kiểm tra bằng cách nhập SHOW VARIABLES qua máy khách mysql) thì bạn có thể thêm tệp này vào tệp cài đặt của bạn (vì python MySQLdb không ' Theo mặc định, hãy đọc tệp .my.cnf):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}

3

Bạn phải quan tâm làm thế nào bạn thiết lập kết nối mysqli của bạn. Tín dụng đầy đủ cho giải pháp này được chuyển đến Jorge Albarenque, nguồn

Để sửa nó, tôi phải:

  • Thêm local-infile = 1 vào phần [mysqld] và [mysql] của my.cnf (như được giải thích trong các nhận xét ở trên)
  • Sử dụng hàm mysqli_real_connect ( tài liệu PHP ).

Điều hấp dẫn là với chức năng đó, bạn có thể kích hoạt rõ ràng sự hỗ trợ cho LOAD DATA LOCAL INFILE. Ví dụ (kiểu thủ tục):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

hoặc hướng đối tượng

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);

1
@Mask Không thể xác nhận. Giải pháp của tôi đang chạy trên 5.5.46 (Ubuntu)
sieppl

3

nếu tệp csv của bạn nằm cùng với db, bạn cần xóa LOCAL trong LOAD DATA INFILE , nếu không bạn sẽ gặp lỗi

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


Điều này đã làm điều đó cho tôi, nhưng sau đó tôi cũng phải theo dõi câu trả lời của Nelson ở đây
Dominic

1

Một cách khác là sử dụng mysqlimportchương trình máy khách.

Bạn gọi nó như sau:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

Điều này tạo ra một LOAD DATAcâu lệnh tải tableName.txtvàotableName bảng.

Hãy ghi nhớ những điều sau:

mysqlimportxác định tên bảng từ tệp bạn cung cấp; sử dụng tất cả văn bản từ đầu tên tệp cho đến khoảng thời gian đầu tiên làm tên bảng. Vì vậy, nếu bạn muốn tải nhiều tập tin vào cùng một bảng bạn có thể phân biệt chúng như tableName.1.txt, tableName.2.txt, ..., vv, ví dụ.


1

Điều này trở nên hơi kỳ lạ đối với tôi, từ một ngày đến kịch bản tiếp theo, kịch bản đã hoạt động kể từ ngày ngừng hoạt động. Có phiên bản mới hơn của mysql hoặc bất kỳ loại nâng cấp nào nhưng tôi cũng gặp lỗi tương tự, vì vậy tôi đã thử lần cuối với tệp CSV và nhận thấy rằng cuối dòng đang sử dụng \ n thay vì dự kiến ​​(theo kịch bản của tôi ) \ r \ n vì vậy tôi lưu nó với EOL đúng và chạy lại tập lệnh mà không gặp sự cố nào.

Tôi nghĩ thật kỳ quặc khi mysql nói với tôi Lệnh đã sử dụng không được phép với phiên bản MySQL này vì lý do hoàn toàn khác nhau.

Lệnh làm việc của tôi trông như thế này:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.

1

Tôi đã sử dụng phương pháp dưới đây, không yêu cầu thay đổi cấu hình , đã được thử nghiệm trên mysql-5.5.51-winx64 và 5.5.50-MariaDB:

đặt 'tải dữ liệu ...' vào tệp .sql (ví dụ: LoadTableName.sql)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

sau đó:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"

1

Trong trường hợp nếu Mysql 5.7, bạn có thể sử dụng "hiển thị các biến toàn cục như" local_infile ";" sẽ đưa ra trạng thái lưu trữ cục bộ, Bạn có thể bật nó bằng cách sử dụng "set global local_infile = ON;".


0

Ok, một cái gì đó kỳ lạ đang xảy ra ở đây. Để thực hiện công việc này, KHÔNG cần thực hiện bất kỳ thay đổi cấu hình nào trong /etc/mysql/my.cnf. Tất cả những gì bạn cần làm là khởi động lại dịch vụ mysql hiện tại trong thiết bị đầu cuối:

sudo service mysql restart

Sau đó, nếu tôi muốn "tạo lại" lỗi, tôi chỉ cần khởi động lại dịch vụ apache:

sudo service apache2 restart

Mà sau đó có thể được sửa lại bằng cách nhập lệnh sau:

sudo service mysql restart

Vì vậy, có vẻ như apache2 đang làm gì đó để không cho phép tính năng này khi nó khởi động (sau đó được đảo ngược / sửa chữa nếu khởi động lại dịch vụ mysql).

Hợp lệ trong các bản phân phối dựa trên Debian.

service mysqld restart
service httpd restart

Hợp lệ trong các bản phân phối dựa trên RedHat


0

Đối với những bạn đang tìm kiếm câu trả lời để làm cho LOAD DATA LOCALINFILE hoạt động như tôi, điều này có thể hoạt động. Vâng, nó làm việc cho tôi, vì vậy nó đi. Cài đặt perconanhư máy chủ và máy khách mysql của bạn bằng cách làm theo các bước từ liên kết. Một mật khẩu sẽ được nhắc trong quá trình cài đặt, vì vậy hãy cung cấp một mật khẩu mà bạn sẽ nhớ và sử dụng nó sau này. Sau khi cài đặt xong, hãy khởi động lại hệ thống của bạn và kiểm tra xem máy chủ có hoạt động hay không bằng cách vào terminalvà gõ mysql -u root -pvà sau đó nhập mật khẩu. Hãy thử chạy lệnh LOAD DATA LOCAL INFILEngay bây giờ .. Hy vọng nó hoạt động :)

BTW Tôi đã làm việc trên Rails 2.3 với Ruby 1.9.3 trên Ubuntu 12.04.


0

Tất cả: Rõ ràng đây là hoạt động như thiết kế. Vui lòng xem người giới thiệu mới ngày 2019-7-23, Phần 6.1.6, Các vấn đề bảo mật với LOAD DATA LOCAL .


0

Thêm local_infilevào cả hai clientmysqldphần.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Đã thử nghiệm trong MySQL 8.x cả trong Windows và Linux.


0

Tôi đang sử dụng xampp v3.2.4 và máy chủ mysql 8.0.20.

Tôi đã thêm local-infile=1vào [mysql][mysqld]trong tệp "my.ini". Tệp được đặt tại "C: \ xampp \ mysql \ bin \ my.ini".

Sau đó, tôi chèn dữ liệu từ tệp csv bằng đoạn mã sau LOAD DATA INFILE .... Điều quan trọng là di chuyển ĐỊA PHƯƠNG. Nếu không nó sẽ không hoạt động.

Cảm ơn tất cả các đề xuất ở trên. Một sự kết hợp cuối cùng đã làm việc cho tôi.

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.