Câu trả lời:
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.
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.mysqld
và tải lại dịch vụ apparmor.
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] và [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.
Ubuntu 14.04.2 LTS not working
là tốt.
/mysql/my.cnf
khô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.
/etc/mysql/conf.d/enable-local-infile.cnf
Ngoài ra, đừng quên sudo service mysql restart
sau khi thay đổi cấu hình để nó có hiệu lực.
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
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.
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.
8.0.12 MySQL Community Server
trên Windows.
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 version
nhưng kết nối với mysql với --load-infile = 1 đã hoạt độngmysql --local-infile=1 -u root -p
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 infile
lệ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';
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
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.
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,
},
}
}
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:
Đ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);
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
Một cách khác là sử dụng mysqlimport
chươ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 DATA
câu lệnh tải tableName.txt
vàotableName
bảng.
Hãy ghi nhớ những điều sau:
mysqlimport
xá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ụ.
Đ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.
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"
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
Đối với những bạn đang tìm kiếm câu trả lời để làm cho LOAD DATA LOCAL
INFILE 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 percona
như 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 terminal
và gõ mysql -u root -p
và sau đó nhập mật khẩu. Hãy thử chạy lệnh LOAD DATA LOCAL INFILE
ngay 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.
Thêm local_infile
vào cả hai client
và mysqld
phần.
[client]
local_infile=1
...
[mysqld]
local_infile=1
...
Đã thử nghiệm trong MySQL 8.x cả trong Windows và Linux.
Tôi đang sử dụng xampp v3.2.4 và máy chủ mysql 8.0.20.
Tôi đã thêm local-infile=1
vào [mysql]
và [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.
my.cnf
đường dẫn nằm/etc/mysql/my.cnf
trong máy của tôi (AWS EC2).