MySQL : LOAD DATA LOCAL INFILE 활성화


127

Ubuntu 12 LTS에서 Mysql 5.5를 실행하고 있습니다. my.cnf에서 LOAD DATA LOCAL INFILE을 어떻게 활성화해야합니까?

구성의 여러 위치에서 local-infile을 추가하려고 시도했지만 여전히 "이 MySQL 버전에서는 사용 된 명령을 사용할 수 없습니다"라는 메시지가 나타납니다.

답변:


197

MySQL 5.5 매뉴얼 페이지에서 :

LOCAL은 서버와 클라이언트가 모두이를 허용하도록 구성된 경우에만 작동합니다. 예를 들어, mysqld가 --local-infile = 0으로 시작된 경우 LOCAL이 작동하지 않습니다. 6.1.6 절.“LOAD DATA LOCAL의 보안 문제”를 참조하십시오.

옵션을 설정해야합니다.

local-infile=1

my.cnf 파일 의 [mysql] 항목에 넣거나 --local-infile 옵션을 사용하여 mysql 클라이언트를 호출하십시오 .

mysql --local-infile -uroot -pyourpwd yourdbname

"local infile"기능 서버 측을 활성화하려면 동일한 매개 변수가 [mysqld] 섹션에 정의되어 있는지 확인해야합니다 .

보안 제한 사항입니다.


4
고마워. btw, my.cnf경로는 /etc/mysql/my.cnf내 컴퓨터 (AWS EC2)에 있습니다.
SparkAndShine

흥미롭게도 my.cnf 파일은 / etc 디렉토리에있었습니다.
SgtRock

그래도 실패하면 어디로 가야할지에 대한 아이디어. [client], [mysqld] 및 [mysql] 아래에서 my.cnf 파일에 local-infile = 1을 추가하고이 조합을 사용했습니다. 모두 동일한 결과를 얻습니다. 워크 벤치를 다시 시작했지만 운이 없습니다. 각 변경 사항 사이에서도 mySQL 워크 벤치를 중지했다가 시작했습니다.
OrwellHindenberg

2
6.2.5로 mySQL을 업데이트하면이 문제가 해결되었습니다.
OrwellHindenberg

정답은 정답입니다. 그러나이 문제에 직면 한 사람들에게는 또 다른 문제가 있습니다. 시스템에서 apparmor가 활성화되어 있고 문제가 지속되면 syslog를 검사하여 mysqld 데몬이 차단되고 있는지 확인하십시오. 나는이 문제가 있었다 : 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의류 서비스를 업데이트 하고 다시로드하십시오.
Leo

60

편집해야 할 my.cnf 파일은 /etc/mysql/my.cnf 파일입니다. 다만:

sudo nano /etc/mysql/my.cnf

그런 다음 다음을 추가하십시오.

[mysqld]
local-infile 

[mysql]
local-infile 

헤더 [mysqld][mysql] 이 이미 제공되어 있습니다. 파일에서 헤더를 찾아 local-infile을 추가하십시오. 각각 아래 .

Ubuntu 12.04 LTS의 MySQL 5.5에서 작동합니다.


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

이것이 올바른 해결책입니다. 가장 높은 평가를받은 솔루션은 local-infile 줄 앞에 [mysqld]를 먼저 넣어야한다는 언급이 없습니다.
user3260912

30

드라이버 php5-mysql을 기본 드라이버로 교체하십시오.

데비안에서

apt-get install php5-mysqlnd

이것은 효과가 있었다! 재고 aws 12.04 우분투를 사용하여 RDS에 연결할 때 '로컬'이 필요했습니다. 정말 감사합니다!
James Bowler

고마워,이 솔루션은 나를 위해 일했다. 질문했습니다 stackoverflow.com/questions/36526102/…
user75472

우분투 12.04
Zbyszek

또 다른 행복한 고객! 우분투 14.04 mysql 5.7
nodoze

27

mysql 터미널 명령으로 MySQL 8.0.11 에서이 문제를 해결했습니다.

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'을 검색 한 후 편집을 클릭하고 ON으로 변경 한 후 Enter 키를 누르십시오. 작동 했습니까?
Oleksiy Muzalyev

2
이 답변 만 8.0.12 MySQL Community ServerWindows 에서 나를 위해 일했습니다 .
endo64

Windows Server 2016에 MySQL 8.0.16이 설치되어 SET GLOBAL local_infile = true;있지만 명령을 실행했지만 여전히 동일한 오류가 발생 ERROR 1148 (42000): The used command is not allowed with this MySQL version하지만 --load-infile = 1로 mysql에 연결했습니다.mysql --local-infile=1 -u root -p
Junior

13

우분투에서 mysql의 맛이 작동하지 않고 여전히 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 루트 -p

여기에 이미지 설명을 입력하십시오


SET GLOBAL ..그렇지 않았을 때 이것은 나를 위해 일했습니다 . 'source'명령 ( \. file.sql)이 어떻게 든 새 세션을 시작하거나 재설정합니까? 그래도 mmy sql 스크립트에 설정을 시도하지 않았습니다.
toddkaufmann

5

또한 다른 독자에게 Django 에서이 작업을 시도하고 서버에서 local_infile을 허용하면 (mysql 클라이언트를 통해 SHOW VARIABLES를 입력하여 확인할 수 있음) 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을 my.cnf의 [mysqld] 및 [mysql] 섹션에 추가하십시오 (위의 설명에서 설명 함).
  • 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 (우분투)에서 실행됩니다
sieppl

3

csv 파일 이 db와 동일한 위치에 있으면 LOAD DATA INFILE 에서 LOCAL 을 제거해야합니다 . 그렇지 않으면 오류가 발생합니다.

이 MySQL 버전에서는 사용 된 명령을 사용할 수 없습니다


이것은 나를 위해 그것을했다. 그러나 나는 또한 여기에서 넬슨의 대답
Dominic

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에서 테스트 한 config 변경이 필요없는 아래 방법을 사용했습니다 .

.sql 파일에 'load data ...'를 넣습니다 (예 : 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

그런 다음 버그를 "재 작성"하려면 아파치 서비스를 다시 시작하면됩니다.

sudo service apache2 restart

다음 명령을 입력하여 다시 고칠 수 있습니다.

sudo service mysql restart

따라서 apache2는 시작할 때이 기능을 허용하지 않는 작업을 수행하는 것으로 보입니다 (mysql 서비스를 다시 시작하면 반전 / 수정됩니다).

데비안 기반 배포판에서 유효합니다.

service mysqld restart
service httpd restart

RedHat 기반 배포에 유효


0

LOAD DATA LOCALINFILE을 작동시키는 대답을 찾고있는 사람들에게는 이것이 아마도 효과가있을 것입니다. 글쎄 그것은 나를 위해 일했다, 그래서 여기에 간다. percona링크의 단계에 따라 mysql 서버 및 클라이언트로 설치 하십시오. 설치하는 동안 암호를 묻는 메시지가 표시되므로 나중에 기억하고 사용할 수있는 암호를 제공하십시오. 설치가 완료되면 시스템을 재부팅하고 서버로 이동 하여 비밀번호를 terminal입력 mysql -u root -p한 다음 서버를 테스트 합니다. LOAD DATA LOCAL INFILE지금 명령을 실행 해보십시오 .

BTW 우분투 12.04에서 Ruby 1.9.3을 사용하여 Rails 2.3을 작업했습니다.


0

모두 : 분명히 이것은 설계된대로 작동합니다. 2019-7-23, 섹션 6.1.6, LOAD DATA LOCAL의 보안 문제에 대한 새로운 참조 설명서를 참조하십시오 .


0

및 섹션 local_infile에 모두 추가 하십시오.clientmysqld

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Windows와 Linux 모두에서 MySQL 8.x에서 테스트되었습니다.


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 .... LOCAL을 옮기는 것이 중요합니다. 그렇지 않으면 작동하지 않습니다.

위의 모든 제안에 감사드립니다. 조합이 마침내 나를 위해 일했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.