ฉันใช้ Mysql 5.5 บน Ubuntu 12 LTS ฉันจะเปิดใช้งาน LOAD DATA LOCAL INFILE ใน my.cnf ได้อย่างไร
ฉันได้ลองเพิ่ม local-infile ใน config ของฉันในหลาย ๆ ที่แล้ว แต่ฉันยังคงได้รับ "คำสั่งที่ใช้ไม่ได้รับอนุญาตกับ MySQL เวอร์ชันนี้"
ฉันใช้ Mysql 5.5 บน Ubuntu 12 LTS ฉันจะเปิดใช้งาน LOAD DATA LOCAL INFILE ใน my.cnf ได้อย่างไร
ฉันได้ลองเพิ่ม local-infile ใน config ของฉันในหลาย ๆ ที่แล้ว แต่ฉันยังคงได้รับ "คำสั่งที่ใช้ไม่ได้รับอนุญาตกับ MySQL เวอร์ชันนี้"
คำตอบ:
จากหน้าคู่มือ MySQL 5.5:
LOCAL จะทำงานก็ต่อเมื่อเซิร์ฟเวอร์ของคุณและไคลเอนต์ของคุณได้รับการกำหนดค่าให้อนุญาตเท่านั้น ตัวอย่างเช่นถ้า mysqld เริ่มต้นด้วย --local-infile = 0 LOCAL จะไม่ทำงาน โปรดดูหัวข้อ 6.1.6“ ปัญหาด้านความปลอดภัยกับโหลดข้อมูลในพื้นที่”
คุณควรตั้งค่าตัวเลือก:
local-infile=1
ลงในรายการ[mysql]ของไฟล์ my.cnf หรือเรียกไคลเอนต์ mysql ด้วยตัวเลือก--local-infile :
mysql --local-infile -uroot -pyourpwd yourdbname
คุณต้องแน่ใจว่าได้กำหนดพารามิเตอร์เดียวกันใน[mysqld]ของคุณด้วยเพื่อเปิดใช้งานฟีเจอร์เซิร์ฟเวอร์ "local infile"
เป็นข้อ จำกัด ด้านความปลอดภัย
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
. วิธีแก้ปัญหานั้นง่ายมาก เพียงอัปเดต/etc/apparmor.d/local/usr.sbin.mysqld
และโหลดบริการ apparmor ใหม่
ไฟล์ my.cnf ที่คุณควรแก้ไขคือไฟล์/etc/mysql/my.cnf แค่:
sudo nano /etc/mysql/my.cnf
จากนั้นเพิ่ม:
[mysqld]
local-infile
[mysql]
local-infile
มีการระบุส่วนหัว[mysqld]และ[mysql]แล้วเพียงแค่ค้นหาในไฟล์และเพิ่มlocal-infileด้านล่างของแต่ละส่วน
มันใช้ได้กับฉันบน MySQL 5.5 บน Ubuntu 12.04 LTS
Ubuntu 14.04.2 LTS not working
เช่นกัน
/mysql/my.cnf
ไม่มีอยู่ตามค่าเริ่มต้น เพียงสร้างไดเร็กทอรีและไฟล์จากนั้นวางบรรทัดเหล่านี้ลงในไฟล์
/etc/mysql/conf.d/enable-local-infile.cnf
นอกจากนี้อย่าลืมsudo service mysql restart
หลังจากทำการเปลี่ยนแปลงการกำหนดค่าเพื่อให้มีผล
แทนที่ไดรเวอร์ php5-mysql โดยไดรเวอร์ดั้งเดิม
บนเดเบียน
apt-get install php5-mysqlnd
ฉันแก้ไขปัญหานี้บน MySQL 8.0.11 ด้วยคำสั่ง mysql terminal:
SET GLOBAL local_infile = true;
ฉันหมายความว่าฉันเข้าสู่ระบบก่อนด้วยปกติ:
mysql -u user -p*
หลังจากนั้นคุณสามารถดูสถานะด้วยคำสั่ง:
SHOW GLOBAL VARIABLES LIKE 'local_infile';
มันควรจะเปิด ฉันจะไม่เขียนเกี่ยวกับความปลอดภัยที่ออกพร้อมกับการโหลดไฟล์ในเครื่องลงในฐานข้อมูลที่นี่
SET GLOBAL local_infile = true;
งานได้ MySQL เวอร์ชัน 8.0.12 บางทีนี่อาจเป็นทางออกล่าสุด ขอบคุณมาก ๆ.
8.0.12 MySQL Community Server
ใน Windows
SET GLOBAL local_infile = true;
คำสั่ง แต่ฉันยังคงได้รับข้อผิดพลาดเดียวกันERROR 1148 (42000): The used command is not allowed with this MySQL version
แต่การเชื่อมต่อกับ mysql ด้วย --load-infile = 1 ใช้งานได้mysql --local-infile=1 -u root -p
ในกรณีที่รสชาติ mysql ของคุณบน ubuntu ไม่ทำงานภายใต้สถานการณ์ใด ๆ และคุณยังคงได้รับข้อผิดพลาด 1148 คุณสามารถเรียกใช้ load data infile
คำสั่งผ่านทางบรรทัดคำสั่ง
เปิดหน้าต่างเทอร์มินัล
วิ่ง mysql -u YOURUSERNAME -p --local-infile YOURDBNAME
คุณจะถูกขอให้ใส่รหัสผ่าน mysqluser
คุณจะเรียกใช้ MySQLMonitor และพรอมต์คำสั่งของคุณจะเป็น mysql>
รันload data infile
คำสั่งของคุณ(อย่าลืมลงท้ายด้วยอัฒภาค;
)
แบบนี้:
load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
ดูภาพด้านล่าง ...
ฉันได้เพิ่ม --local-infile=1
คำสั่ง mysql ปกติแล้ว mysql -u root -p
เส้นรวมจะเป็น:
mysql --local-infile = 1 -u root -p
SET GLOBAL ..
ไม่ได้ คำสั่ง 'source' ( \. file.sql
) เริ่มเซสชันใหม่หรือรีเซ็ตสิ่งนี้หรือไม่? ฉันไม่ได้ลองวางการตั้งค่าในสคริปต์ mmy sql
นอกจากนี้สำหรับผู้อ่านรายอื่นหากคุณพยายามทำสิ่งนี้ใน Django และเซิร์ฟเวอร์ของคุณอนุญาต local_infile (คุณสามารถตรวจสอบได้โดยพิมพ์ SHOW VARIABLES ผ่านไคลเอนต์ mysql) คุณสามารถเพิ่มสิ่งนี้ลงในไฟล์settings.pyของคุณได้(เนื่องจาก python MySQLdb ไม่ ' t โดยค่าเริ่มต้นอ่านไฟล์. my.cnf):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'myname',
'PASSWORD': 'mypass',
'HOST': 'myserver',
'PORT': '3306',
'OPTIONS' : {
'local_infile':1,
},
}
}
คุณต้องดูแลวิธีสร้างการเชื่อมต่อ mysqli ของคุณ เครดิตเต็มรูปแบบสำหรับโซลูชันนี้ไปที่ Jorge Albarenque แหล่งที่มา
ในการแก้ไขฉันต้อง:
สิ่งที่จับได้คือด้วยฟังก์ชั่นดังกล่าวคุณสามารถเปิดใช้งานการรองรับ LOAD DATA LOCAL INFILE ได้อย่างชัดเจน ตัวอย่างเช่น (รูปแบบขั้นตอน):
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);
หรือเชิงวัตถุ
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);
หากไฟล์ csv ของคุณอยู่เดียวกันกับ db คุณต้องลบLOCALในLOAD DATA INFILEมิฉะนั้นคุณจะได้รับข้อผิดพลาด
ไม่อนุญาตคำสั่งที่ใช้กับ MySQL เวอร์ชันนี้
อีกวิธีหนึ่งคือการใช้mysqlimport
โปรแกรมไคลเอนต์
คุณเรียกมันดังนี้:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
สิ่งนี้สร้างLOAD DATA
คำสั่งที่โหลดtableName.txt
ลงในไฟล์tableName
ตาราง
โปรดทราบสิ่งต่อไปนี้:
mysqlimport
กำหนดชื่อตารางจากไฟล์ที่คุณระบุ ใช้ข้อความทั้งหมดตั้งแต่เริ่มต้นชื่อไฟล์จนถึงช่วงแรกเป็นชื่อตาราง ดังนั้นถ้าคุณต้องการที่จะโหลดหลายไฟล์ไปที่โต๊ะเดียวกับที่คุณสามารถแยกแยะพวกเขาชอบtableName.1.txt
, tableName.2.txt
... ฯลฯ ตัวอย่างเช่น
สิ่งนี้แปลกสำหรับฉันเล็กน้อยจากวันหนึ่งไปอีกวันหนึ่งสคริปต์ที่ใช้งานได้ตั้งแต่ไม่กี่วันก็หยุดทำงาน มี mysql เวอร์ชันที่ใหม่กว่าหรือการอัปเกรดประเภทใดก็ตาม แต่ฉันได้รับข้อผิดพลาดเดียวกันดังนั้นฉันจึงลองใช้ไฟล์ CSV ครั้งสุดท้ายและสังเกตเห็นว่าท้ายบรรทัดใช้ \ n แทนที่คาดไว้ (ตามสคริปต์ของฉัน ) \ r \ n ดังนั้นฉันจึงบันทึกด้วย EOL ที่ถูกต้องและเรียกใช้สคริปต์อีกครั้งโดยไม่มีปัญหาใด ๆ
ฉันคิดว่าเป็นเรื่องแปลกสำหรับ mysql ที่จะบอกฉันไม่อนุญาตให้ใช้คำสั่งที่ใช้กับ MySQL เวอร์ชันนี้เนื่องจากเหตุผลแตกต่างกันอย่างสิ้นเชิง
คำสั่งการทำงานของฉันมีลักษณะดังนี้:
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.
ฉันใช้วิธีการด้านล่างซึ่งไม่ต้องการการเปลี่ยนแปลงใด ๆ ในการกำหนดค่าการกำหนดค่าทดสอบบน mysql-5.5.51-winx64 และ 5.5.50-MariaDB:
ใส่ 'load data ... ' ในไฟล์. sql (เช่น 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);
แล้ว:
mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
ในกรณีที่ Mysql 5.7 คุณสามารถใช้ "แสดงตัวแปรส่วนกลางเช่น" local_infile ";" ซึ่งจะให้สถานะความไม่ปลอดภัยในท้องถิ่นคุณสามารถเปิดใช้งานได้โดยใช้ "set global local_infile = ON;"
โอเคมีอะไรแปลก ๆ เกิดขึ้นที่นี่ ในการทำงานนี้ไม่จำเป็นต้องทำการเปลี่ยนแปลงการกำหนดค่าใด ๆ ใน /etc/mysql/my.cnf สิ่งที่คุณต้องทำคือรีสตาร์ทบริการ mysql ปัจจุบันในเทอร์มินัล:
sudo service mysql restart
จากนั้นถ้าฉันต้องการ "สร้าง" จุดบกพร่องฉันเพียงแค่เริ่มบริการ apache ใหม่:
sudo service apache2 restart
ซึ่งสามารถแก้ไขได้อีกครั้งโดยป้อนคำสั่งต่อไปนี้:
sudo service mysql restart
ดังนั้นดูเหมือนว่า apache2 กำลังทำบางอย่างเพื่อไม่ให้คุณสมบัตินี้เมื่อเริ่มทำงาน (ซึ่งจะย้อนกลับ / แก้ไขหากรีสตาร์ทบริการ mysql)
ใช้ได้ในการแจกแจงตาม Debian
service mysqld restart
service httpd restart
ใช้ได้ในการแจกแจงตาม RedHat
สำหรับผู้ที่กำลังมองหาคำตอบเพื่อให้ LOAD DATA LOCAL
INFILE ทำงานเหมือนฉันสิ่งนี้อาจได้ผล มันได้ผลสำหรับฉันดังนั้นมันจะไป ติดตั้งpercona
เป็นเซิร์ฟเวอร์ mysql และไคลเอนต์ของคุณโดยทำตามขั้นตอนจากลิงค์ ระบบจะแจ้งรหัสผ่านระหว่างการติดตั้งดังนั้นโปรดระบุรหัสผ่านที่คุณจำได้และใช้ในภายหลัง หนึ่งการติดตั้งเสร็จสิ้นให้รีบูตระบบของคุณและทดสอบว่าเซิร์ฟเวอร์เปิดใช้งานอยู่หรือไม่โดยไปที่terminal
และพิมพ์mysql -u root -p
และรหัสผ่าน ลองรันคำสั่งLOAD DATA LOCAL INFILE
ตอนนี้ .. หวังว่าจะได้ผล :)
BTW ฉันกำลังทำงานกับ Rails 2.3 กับ Ruby 1.9.3 บน Ubuntu 12.04
ทั้งหมด: เห็นได้ชัดว่าสิ่งนี้ทำงานตามที่ออกแบบไว้ โปรดดูคนเตะใหม่ลงวันที่ 2019/07/23 มาตรา 6.1.6, ปัญหาด้านความปลอดภัยที่มีการโหลดข้อมูลท้องถิ่น
เพิ่มlocal_infile
ทั้งในclient
และmysqld
ส่วน
[client]
local_infile=1
...
[mysqld]
local_infile=1
...
ทดสอบใน MySQL 8.x ทั้งใน Windows และ Linux
ฉันใช้ xampp v3.2.4 และเซิร์ฟเวอร์ mysql 8.0.20
ผมเพิ่มlocal-infile=1
ไป[mysql]
และ[mysqld]
ในแฟ้ม "my.ini" ไฟล์อยู่ที่ "C: \ xampp \ mysql \ bin \ my.ini"
แล้วฉันจะแทรกข้อมูลจากไฟล์ CSV LOAD DATA INFILE ...
โดยใช้รหัสต่อไปนี้ การย้ายท้องถิ่นเป็นสิ่งสำคัญ มิฉะนั้นจะไม่ทำงาน
ขอบคุณสำหรับคำแนะนำทั้งหมดข้างต้น ในที่สุดชุดค่าผสมก็ได้ผลสำหรับฉัน
my.cnf
เส้นทางอยู่/etc/mysql/my.cnf
ในเครื่องของฉัน (AWS EC2)