MySQL: เปิดใช้งาน LOAD DATA LOCAL INFILE


127

ฉันใช้ Mysql 5.5 บน Ubuntu 12 LTS ฉันจะเปิดใช้งาน LOAD DATA LOCAL INFILE ใน my.cnf ได้อย่างไร

ฉันได้ลองเพิ่ม local-infile ใน config ของฉันในหลาย ๆ ที่แล้ว แต่ฉันยังคงได้รับ "คำสั่งที่ใช้ไม่ได้รับอนุญาตกับ MySQL เวอร์ชันนี้"

คำตอบ:


197

จากหน้าคู่มือ 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"

เป็นข้อ จำกัด ด้านความปลอดภัย


4
ขอบคุณ. btw my.cnfเส้นทางอยู่/etc/mysql/my.cnfในเครื่องของฉัน (AWS EC2)
SparkAndShine

ที่น่าสนใจคือไฟล์ my.cnf อยู่ในไดเร็กทอรี / etc สำหรับฉัน
SgtRock

มีความคิดว่าจะไปที่ไหนหากยังไม่สำเร็จ ฉันได้เพิ่ม local-infile = 1 ลงในไฟล์ my.cnf ภายใต้ [client], [mysqld] และ [mysql] และใช้ชุดค่าผสมเหล่านี้ ทั้งหมดที่มีผลลัพธ์เดียวกัน ฉันได้ลองเริ่มปรับแต่งโต๊ะทำงานใหม่ แต่โชคไม่ดี ฉันได้หยุดและเริ่มการปรับแต่ง mySQL ระหว่างการเปลี่ยนแปลงแต่ละครั้งด้วย
OrwellHindenberg

2
การอัปเดต mySQL เป็น 6.2.5 แก้ไขปัญหานี้ให้ฉัน
OrwellHindenberg

คำตอบอยู่ในทิศทางที่ถูกต้อง แต่สำหรับผู้ที่เผชิญกับปัญหานี้นี่เป็นอีกหนึ่ง gotcha หากคุณเปิดใช้งาน apparmor บนระบบของคุณและปัญหายังคงมีอยู่ให้ตรวจสอบ syslog เพื่อดูว่า mysqld daemon ถูกบล็อกหรือไม่ ฉันมีปัญหานี้: 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 ใหม่
ลีโอ

60

ไฟล์ 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


1
สิ่งนี้แก้ไขให้ฉันได้อย่างแน่นอนด้วย Ubuntu 12.04
John Fiala

4
ฉันสามารถยืนยันได้ Ubuntu 14.04.2 LTS not workingเช่นกัน
Ain Tohvri

ใช้ได้กับ Mac ด้วย สำหรับผู้ใช้ Mac /mysql/my.cnfไม่มีอยู่ตามค่าเริ่มต้น เพียงสร้างไดเร็กทอรีและไฟล์จากนั้นวางบรรทัดเหล่านี้ลงในไฟล์
Zheng Liu

หากคุณไม่ต้องการให้การกำหนดค่านี้ถูกเขียนทับเมื่อ mysql ได้รับการอัปเกรดคุณควรใส่สิ่งนี้ลงใน/etc/mysql/conf.d/enable-local-infile.cnf นอกจากนี้อย่าลืมsudo service mysql restartหลังจากทำการเปลี่ยนแปลงการกำหนดค่าเพื่อให้มีผล
Stephen Ostermiller

นี่คือทางออกที่เหมาะสม โซลูชันที่ได้รับการโหวตสูงสุดไม่ได้กล่าวถึงคุณต้องใส่ [mysqld] ก่อนบรรทัด local-infile
user3260912

30

แทนที่ไดรเวอร์ php5-mysql โดยไดรเวอร์ดั้งเดิม

บนเดเบียน

apt-get install php5-mysqlnd

ได้ผล! การใช้ ubuntu aws 12.04 ฉันต้องการ 'local' เพราะฉันกำลังเชื่อมต่อกับ RDS ขอบคุณล้าน!
James Bowler

ขอบคุณมากวิธีนี้ใช้ได้ผลสำหรับฉัน ฉันได้ถามคำถามstackoverflow.com/questions/36526102/…
user75472

ไม่ประสบความสำเร็จ ubuntu 12.04
Zbyszek

ลูกค้ามีความสุขอีกคน! ubuntu 14.04 mysql 5.7
nodoze

28

ฉันแก้ไขปัญหานี้บน 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 บางทีนี่อาจเป็นทางออกล่าสุด ขอบคุณมาก ๆ.
mathsyouth

1
น่าเสียดายที่ตัวแปรปิดอีกครั้งหลังจากรีสตาร์ทเซิร์ฟเวอร์
Pedro

Mohit ฉันแก้ไขได้อย่างไรเพราะตอนนี้ตัวแปรส่วนกลาง 'local_infile' เปิดอยู่เสมอแม้ว่าจะรีบูตแล้วก็ตาม และดูเหมือนว่าฉันไม่ได้ใช้ไฟล์ my.cnf สำหรับสิ่งนี้ ได้โปรดลองล็อกอินเข้าสู่ PhpMyAdmin เวอร์ชันล่าสุดในฐานะรูทไปที่ส่วนตัวแปรค้นหา 'local_infile' จากนั้นคลิกแก้ไขและเปลี่ยนเป็นเปิดและสุดท้ายกด Enter ได้ผลหรือไม่?
Oleksiy Muzalyev

2
มีเพียงคำตอบนี้เท่านั้นที่ใช้ได้กับฉัน8.0.12 MySQL Community Serverใน Windows
endo64

ฉันติดตั้ง MySQL 8.0.16 บนเซิร์ฟเวอร์ Windows 2016 ฉันรัน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
จูเนียร์

13

ในกรณีที่รสชาติ 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';

9

ดูภาพด้านล่าง ...

ฉันได้เพิ่ม --local-infile=1คำสั่ง mysql ปกติแล้ว mysql -u root -p

เส้นรวมจะเป็น:

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

ใส่คำอธิบายภาพที่นี่


สิ่งนี้ใช้ได้ผลสำหรับฉันเมื่อSET GLOBAL ..ไม่ได้ คำสั่ง 'source' ( \. file.sql) เริ่มเซสชันใหม่หรือรีเซ็ตสิ่งนี้หรือไม่? ฉันไม่ได้ลองวางการตั้งค่าในสคริปต์ mmy sql
Toddkaufmann

5

นอกจากนี้สำหรับผู้อ่านรายอื่นหากคุณพยายามทำสิ่งนี้ใน 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,
        },
    }
}

3

คุณต้องดูแลวิธีสร้างการเชื่อมต่อ mysqli ของคุณ เครดิตเต็มรูปแบบสำหรับโซลูชันนี้ไปที่ Jorge Albarenque แหล่งที่มา

ในการแก้ไขฉันต้อง:

  • เพิ่ม local-infile = 1 ในส่วน [mysqld] และ [mysql] ของ my.cnf (ตามที่อธิบายไว้ในความคิดเห็นด้านบน)
  • ใช้ฟังก์ชัน mysqli_real_connect ( เอกสาร PHP )

สิ่งที่จับได้คือด้วยฟังก์ชั่นดังกล่าวคุณสามารถเปิดใช้งานการรองรับ 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);

1
@Mask ไม่สามารถยืนยันได้ โซลูชันของฉันกำลังทำงานบน 5.5.46 (Ubuntu)
sieppl

3

หากไฟล์ csv ของคุณอยู่เดียวกันกับ db คุณต้องลบLOCALในLOAD DATA INFILEมิฉะนั้นคุณจะได้รับข้อผิดพลาด

ไม่อนุญาตคำสั่งที่ใช้กับ MySQL เวอร์ชันนี้


สิ่งนี้ทำเพื่อฉัน แต่แล้วฉันก็ต้องทำตามคำตอบของเนลสันที่นี่
โดมินิก

1

อีกวิธีหนึ่งคือการใช้mysqlimportโปรแกรมไคลเอนต์

คุณเรียกมันดังนี้:

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

สิ่งนี้สร้างLOAD DATAคำสั่งที่โหลดtableName.txtลงในไฟล์tableNameตาราง

โปรดทราบสิ่งต่อไปนี้:

mysqlimportกำหนดชื่อตารางจากไฟล์ที่คุณระบุ ใช้ข้อความทั้งหมดตั้งแต่เริ่มต้นชื่อไฟล์จนถึงช่วงแรกเป็นชื่อตาราง ดังนั้นถ้าคุณต้องการที่จะโหลดหลายไฟล์ไปที่โต๊ะเดียวกับที่คุณสามารถแยกแยะพวกเขาชอบtableName.1.txt, tableName.2.txt... ฯลฯ ตัวอย่างเช่น


1

สิ่งนี้แปลกสำหรับฉันเล็กน้อยจากวันหนึ่งไปอีกวันหนึ่งสคริปต์ที่ใช้งานได้ตั้งแต่ไม่กี่วันก็หยุดทำงาน มี 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.

1

ฉันใช้วิธีการด้านล่างซึ่งไม่ต้องการการเปลี่ยนแปลงใด ๆ ในการกำหนดค่าการกำหนดค่าทดสอบบน 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"

1

ในกรณีที่ Mysql 5.7 คุณสามารถใช้ "แสดงตัวแปรส่วนกลางเช่น" local_infile ";" ซึ่งจะให้สถานะความไม่ปลอดภัยในท้องถิ่นคุณสามารถเปิดใช้งานได้โดยใช้ "set global local_infile = ON;"


0

โอเคมีอะไรแปลก ๆ เกิดขึ้นที่นี่ ในการทำงานนี้ไม่จำเป็นต้องทำการเปลี่ยนแปลงการกำหนดค่าใด ๆ ใน /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


0

สำหรับผู้ที่กำลังมองหาคำตอบเพื่อให้ LOAD DATA LOCALINFILE ทำงานเหมือนฉันสิ่งนี้อาจได้ผล มันได้ผลสำหรับฉันดังนั้นมันจะไป ติดตั้งperconaเป็นเซิร์ฟเวอร์ mysql และไคลเอนต์ของคุณโดยทำตามขั้นตอนจากลิงค์ ระบบจะแจ้งรหัสผ่านระหว่างการติดตั้งดังนั้นโปรดระบุรหัสผ่านที่คุณจำได้และใช้ในภายหลัง หนึ่งการติดตั้งเสร็จสิ้นให้รีบูตระบบของคุณและทดสอบว่าเซิร์ฟเวอร์เปิดใช้งานอยู่หรือไม่โดยไปที่terminalและพิมพ์mysql -u root -pและรหัสผ่าน ลองรันคำสั่งLOAD DATA LOCAL INFILEตอนนี้ .. หวังว่าจะได้ผล :)

BTW ฉันกำลังทำงานกับ Rails 2.3 กับ Ruby 1.9.3 บน Ubuntu 12.04


0

ทั้งหมด: เห็นได้ชัดว่าสิ่งนี้ทำงานตามที่ออกแบบไว้ โปรดดูคนเตะใหม่ลงวันที่ 2019/07/23 มาตรา 6.1.6, ปัญหาด้านความปลอดภัยที่มีการโหลดข้อมูลท้องถิ่น



0

ฉันใช้ 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 ...โดยใช้รหัสต่อไปนี้ การย้ายท้องถิ่นเป็นสิ่งสำคัญ มิฉะนั้นจะไม่ทำงาน

ขอบคุณสำหรับคำแนะนำทั้งหมดข้างต้น ในที่สุดชุดค่าผสมก็ได้ผลสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.