MySQL: Aktifkan LOAD DATA LOCAL INFILE


127

Saya menjalankan Mysql 5.5 di Ubuntu 12 LTS. Bagaimana saya harus mengaktifkan LOAD DATA LOCAL INFILE di my.cnf?

Saya sudah mencoba menambahkan infile lokal di konfigurasi saya di berbagai tempat tapi saya masih mendapatkan "Perintah yang digunakan tidak diperbolehkan dengan versi MySQL ini"

Jawaban:


197

Dari halaman manual MySQL 5.5:

LOCAL hanya berfungsi jika server dan klien Anda telah dikonfigurasi untuk mengizinkannya. Misalnya, jika mysqld dimulai dengan --local-infile = 0, LOCAL tidak berfungsi. Lihat Bagian 6.1.6, “Masalah Keamanan dengan LOAD DATA LOCAL”.

Anda harus mengatur opsi:

local-infile=1

ke dalam entri [mysql] Anda dari file my.cnf atau panggil klien mysql dengan opsi --local-infile :

mysql --local-infile -uroot -pyourpwd yourdbname

Anda harus yakin bahwa parameter yang sama didefinisikan ke bagian [mysqld] Anda juga untuk mengaktifkan sisi server fitur "infile lokal".

Ini batasan keamanan.


4
Terima kasih. btw, my.cnfjalannya ada /etc/mysql/my.cnfdi mesin saya (AWS EC2).
SparkAndShine

Menariknya, file my.cnf ada di direktori / etc untuk saya.
SgtRock

Ada ide ke mana harus pergi jika ini masih gagal. Saya telah menambahkan infile lokal = 1 ke file my.cnf di bawah [klien], [mysqld], dan [mysql] dan menggunakan kombinasi dari semuanya ini. Semua dengan hasil yang sama. Saya sudah mencoba memulai kembali meja kerja tetapi tidak berhasil. Saya sudah berhenti dan mulai meja kerja mySQL di antara setiap perubahan juga.
OrwellHindenberg

2
pembaruan mySQL ke 6.2.5 memecahkan masalah ini untuk saya
OrwellHindenberg

Jawabannya ada di arah yang benar. Tetapi bagi mereka yang menghadapi masalah ini di sini adalah gotcha lain. Jika apparmor Anda diaktifkan di sistem Anda dan masalahnya tetap ada, periksa syslog untuk melihat apakah daemon mysqld sedang diblokir. Saya punya masalah ini: 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. Solusinya sangat sederhana. Cukup perbarui /etc/apparmor.d/local/usr.sbin.mysqlddan muat ulang layanan apparmor.
Leo

60

File my.cnf Anda harus mengedit adalah /etc/mysql/my.cnf berkas. Hanya:

sudo nano /etc/mysql/my.cnf

Kemudian tambahkan:

[mysqld]
local-infile 

[mysql]
local-infile 

Header [mysqld] dan [mysql] sudah diberikan, cukup cari di dalam file dan tambahkan infile lokal di bawah masing-masing.

Ini berfungsi untuk saya di MySQL 5.5 pada Ubuntu 12.04 LTS.


1
Ini pasti memperbaikinya bagi saya dengan Ubuntu 12.04.
John Fiala

4
Saya dapat mengkonfirmasi Ubuntu 14.04.2 LTS not workingjuga.
Ain Tohvri

Bekerja untuk Mac juga. Untuk pengguna Mac, /mysql/my.cnftidak ada secara default. Cukup buat direktori dan file, dan tempelkan baris-baris ini ke dalam file.
Zheng Liu

Jika Anda tidak ingin konfigurasi ini ditimpa ketika mysql di-upgrade, Anda harus memasukkan ini ke dalam. /etc/mysql/conf.d/enable-local-infile.cnf Juga jangan lupa sudo service mysql restartsetelah melakukan perubahan konfigurasi sehingga itu berlaku.
Stephen Ostermiller

Ini solusi yang tepat. Solusi tertinggi yang dibatalkan tidak menyebutkan Anda harus memasukkan [mysqld] terlebih dahulu sebelum baris infile-lokal.
user3260912

30

Ganti driver php5-mysql dengan driver asli

Di debian

apt-get install php5-mysqlnd

Ini berhasil! Menggunakan stock aws 12,04 ubuntu, saya perlu 'lokal' karena saya terhubung ke RDS. Terima kasih banyak!
James Bowler

Terima kasih banyak, solusi ini berhasil untuk saya. Saya telah mengajukan pertanyaan stackoverflow.com/questions/36526102/…
user75472

Tidak ada kesuksesan ubuntu 12.04
Zbyszek

pelanggan bahagia lainnya! ubuntu 14.04 mysql 5.7
nodoze

27

Saya memecahkan masalah ini pada MySQL 8.0.11 dengan perintah terminal mysql:

SET GLOBAL local_infile = true;

Maksud saya saya login dulu dengan yang biasa:

mysql -u user -p*

Setelah itu Anda dapat melihat status dengan perintah:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Itu harus ON. Saya tidak akan menulis tentang keamanan yang dikeluarkan dengan memuat file lokal ke dalam basis data di sini.


Saya mencoba banyak solusi lain, tetapi hanya perintahnya yang SET GLOBAL local_infile = true; berhasil. Versi MySQL saya adalah 8.0.12. Mungkin ini solusi terbaru. Terima kasih banyak.
mathsyouth

1
Sayangnya variabelnya MATI lagi setelah me-restart server.
Pedro

Mohit, entah bagaimana saya menyelesaikannya, karena sekarang variabel global 'local_infile' selalu ON, bahkan setelah reboot. Dan sepertinya saya tidak menggunakan file my.cnf untuk ini. Bisakah Anda, tolong, coba masuk ke PhpMyAdmin, versi terbaru, sebagai root, buka bagian Variabel, cari 'local_infile', lalu klik Edit, dan ubah ke ON, dan akhirnya tekan Enter. Apa itu bekerja?
Oleksiy Muzalyev

2
Hanya jawaban ini yang berfungsi untuk saya 8.0.12 MySQL Community Serverdi Windows.
endo64

Saya telah menginstal MySQL 8.0.16 pada Windows server 2016, saya mengeksekusi SET GLOBAL local_infile = true;perintah tetapi saya masih mendapatkan kesalahan yang sama ERROR 1148 (42000): The used command is not allowed with this MySQL versiontetapi koneksi ke mysql dengan --load-infile = 1 bekerjamysql --local-infile=1 -u root -p
Junior

13

jika rasa mysql di ubuntu TIDAK dalam keadaan apa pun berhasil dan Anda masih mendapatkan kesalahan 1148, Anda dapat menjalankan load data infileperintah melalui baris perintah

buka jendela terminal

Lari mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

Anda akan diminta untuk memasukkan kata sandi mysqluser

Anda akan menjalankan MySQLMonitor dan prompt perintah Anda akan mysql>

jalankan load data infileperintah Anda (jangan lupa akhiri dengan titik koma ; )

seperti ini:

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

9

Lihat gambar di bawah ...

Saya telah menambahkan --local-infile=1perintah mysql normal mysql -u root -p

Jadi total baris adalah:

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

masukkan deskripsi gambar di sini


Ini bekerja untuk saya ketika SET GLOBAL ..tidak. Apakah perintah 'sumber' ( \. file.sql) entah bagaimana memulai sesi baru atau mengatur ulang ini? Saya tidak mencoba meletakkan pengaturan dalam skrip mmy sql.
toddkaufmann

5

Juga, untuk pembaca lain, jika Anda mencoba melakukan ini di Django DAN server Anda memungkinkan local_infile (Anda dapat memeriksa dengan mengetik SHOW VARIABLES melalui klien mysql) maka Anda dapat menambahkan ini ke file settings.py Anda (karena python MySQLdb tidak t secara default membaca file .my.cnf):

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

3

Anda harus berhati-hati bagaimana Anda membangun koneksi mysqli Anda. Penghargaan penuh untuk solusi ini diberikan kepada Jorge Albarenque, sumber

Untuk memperbaikinya saya harus:

  • Tambahkan local-infile = 1 ke bagian [mysqld] dan [mysql] dari my.cnf (seperti yang dijelaskan dalam komentar di atas)
  • Gunakan fungsi mysqli_real_connect ( dokumentasi PHP ).

Tangkapannya adalah bahwa dengan fungsi itu Anda dapat secara eksplisit mengaktifkan dukungan untuk LOAD DATA LOCAL INFILE. Misalnya (gaya prosedural):

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

atau berorientasi objek

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

1
@Mask Tidak dapat mengkonfirmasi. Solusi saya berjalan pada 5.5.46 (Ubuntu)
sieppl

3

jika file csv Anda terletak sama dengan db, Anda perlu menghapus LOCAL di LOAD DATA INFILE , atau Anda akan mendapatkan kesalahan

Perintah yang digunakan tidak diizinkan dengan versi MySQL ini


Ini berhasil untuk saya, tetapi kemudian saya juga harus mengikuti jawaban Nelson di sini
Dominic

1

Cara lain adalah dengan menggunakan mysqlimportprogram klien.

Anda memohonnya sebagai berikut:

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

Ini menghasilkan LOAD DATApernyataan yang memuat tableName.txtke dalam tableNametabel.

Ingatlah yang berikut:

mysqlimportmenentukan nama tabel dari file yang Anda berikan; menggunakan semua teks dari awal nama file hingga periode pertama sebagai nama tabel. Jadi, jika Anda ingin memuat beberapa file ke tabel yang sama Anda bisa membedakan mereka sukatableName.1.txt , tableName.2.txt, ..., dll, misalnya.


1

Ini agak aneh bagi saya, dari satu hari ke hari berikutnya naskah yang sudah berfungsi sejak beberapa hari berhenti bekerja. Tidak ada versi yang lebih baru dari mysql atau segala bentuk peningkatan, tetapi saya mendapatkan kesalahan yang sama, jadi saya memberikan upaya terakhir ke file CSV dan perhatikan bahwa akhir baris menggunakan \ n alih-alih yang diharapkan (per skrip saya ) jadi saya menyimpannya dengan EOL yang tepat dan menjalankan skrip lagi tanpa masalah.

Saya pikir agak aneh bagi mysql untuk memberi tahu saya Perintah yang digunakan tidak diperbolehkan dengan versi MySQL ini karena alasannya sangat berbeda.

Perintah kerja saya terlihat seperti ini:

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

Saya menggunakan metode di bawah ini, yang tidak memerlukan perubahan konfigurasi , diuji pada mysql-5.5.51-winx64 dan 5.5.50-MariaDB:

masukkan 'load data ...' ke dalam file .sql (mis: 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);

kemudian:

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

1

Dalam kasus jika Mysql 5.7 Anda dapat menggunakan "tampilkan variabel global seperti" local_infile ";" yang akan memberikan status infile lokal, Anda dapat menyalakannya menggunakan "set global local_infile = ON;".


0

Ok, sesuatu yang aneh sedang terjadi di sini. Untuk membuat ini bekerja, TIDAK perlu membuat perubahan konfigurasi di /etc/mysql/my.cnf. Yang perlu Anda lakukan adalah me-restart layanan mysql saat ini di terminal:

sudo service mysql restart

Lalu jika saya ingin "membuat ulang" bug, saya cukup restart layanan apache:

sudo service apache2 restart

Yang kemudian bisa diperbaiki lagi dengan memasukkan perintah berikut:

sudo service mysql restart

Jadi, tampaknya apache2 sedang melakukan sesuatu untuk tidak mengizinkan fitur ini ketika dijalankan (yang kemudian dibalik / diperbaiki jika me-restart layanan mysql).

Berlaku dalam distribusi berbasis Debian.

service mysqld restart
service httpd restart

Berlaku dalam distribusi berbasis RedHat


0

Bagi Anda yang mencari jawaban untuk membuat LOAD DATA LOCALINFILE berfungsi seperti saya, ini mungkin berhasil. Yah itu berhasil untuk saya, jadi begini saja. Instal perconasebagai server mysql Anda dan klien dengan mengikuti langkah-langkah dari tautan. Kata sandi akan diminta selama instalasi, jadi berikan kata sandi yang akan Anda ingat dan gunakan nanti. Setelah penginstalan selesai, reboot sistem Anda dan uji apakah server aktif dan berjalan dengan membuka terminaldan mengetik mysql -u root -p, lalu kata sandi. Coba jalankan perintah LOAD DATA LOCAL INFILEsekarang .. Semoga berhasil :)

BTW I sedang mengerjakan Rails 2.3 dengan Ruby 1.9.3 di Ubuntu 12.04.


0

Semua: Jelas ini berfungsi seperti yang dirancang. Silakan lihat ref man baru tanggal 2019-7-23, Bagian 6.1.6, Masalah Keamanan dengan LOAD DATA LOCAL .


0

Tambahkan local_infilekeduanya clientdan mysqldbagian.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Diuji dalam MySQL 8.x baik di Windows dan Linux.


0

Saya menggunakan xampp v3.2.4 dan server mysql 8.0.20.

Saya menambahkan local-infile=1ke [mysql]dan [mysqld]dalam file "my.ini". File ini terletak di "C: \ xampp \ mysql \ bin \ my.ini".

Kemudian saya memasukkan data dari file csv menggunakan kode berikut LOAD DATA INFILE .... Penting untuk memindahkan LOKAL. Kalau tidak, itu tidak akan berhasil.

Terima kasih atas semua saran di atas. Kombinasi akhirnya berhasil untuk saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.