오류 1148 : 사용 된 명령은이 MySQL 버전에서 허용되지 않습니다.


79

다음을 사용하여 mysql 데이터베이스에 데이터를로드하려고합니다.

LOAD DATA LOCAL
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

이 질문의 주제는 제가받는 답변입니다. 로컬 데이터 오프 로딩은 기본적으로 꺼져 있으며 명령을 사용하여 활성화해야 local-infile=1하지만이 명령을 어디에 배치해야하는지 모르겠습니다.

답변:


114

클라이언트 연결을 설정할 때 추가 옵션으로 지정할 수 있습니다.

mysql -u myuser -p --local-infile somedatabase

그 기능은 보안 허점을 열기 때문입니다. 따라서 실제로 사용하려는 경우 명시 적으로 활성화해야합니다.

클라이언트와 서버 모두 로컬 파일 옵션을 활성화해야합니다. 그렇지 않으면 작동하지 않습니다. 서버 측 서버의 파일에 대해 활성화하려면 my.cnf구성 파일에 다음을 추가 하십시오.

loose-local-infile = 1

오류 1045 (28000) : ''@ 'localhost'사용자에 대한 액세스가 거부되었습니다 (암호 사용 : NO)
Teja

1
오류는 위의 arkascha와 같습니다. LOAD INFILE 명령을 사용하여 mysql 테이블에 작은 파일을 쓰려고합니다.
Teja

1
@SOaddict 흠, 나에게 일반 인증 실패처럼 보입니까? 암호없이 연결하려고합니까? 파일에서 데이터를로드하지 않고 동일한 방식으로 대화 형 세션에 연결할 수 있습니까? 그러나 어쨌든 : 당신은 다른 사람의 질문 / 답변을 하이재킹하고 있습니다! 별도로 질문하십시오. 당신은 확실히 많은 도움을받을 것입니다!
arkascha

1
@arkascha "보안 구멍을 연다"는 의미? 편집 : dev.mysql.com/doc/refman/8.0/en/load-data-local.html
user706420

1
loose-local-infile = 1은 [mysqld] 섹션이 아닌 my.cnf 또는 my.ini 파일의 [client] 섹션 아래에 있어야합니다. [mysqld] 섹션 아래에 local_infile = 1을 넣을 수도 있습니다.
James

60

여기서 답을 찾았습니다 .

서버 변수 local_infileFALSE | 0으로 설정되어 있기 때문 입니다. 문서 에서 참조 .

다음을 실행하여 확인할 수 있습니다.

SHOW VARIABLES LIKE 'local_infile';

SUPER 권한이있는 경우 다음을 실행하여 활성화 할 수 있습니다 (새 구성으로 서버를 다시 시작하지 않음).

SET GLOBAL local_infile = 1;

7
처음에는 local-infile 변수를 ON으로 성공적으로 설정했지만 오류가 수정되지 않은 유일한 답변이기 때문에 이것을 +1하고 싶었습니다.
codehelp4

1
나를 위해 일했습니다! 그러나 나는 주어진 방법으로 그것을 변경하지 않았습니다. 서버의 my.ini 구성 파일을 편집하고 거기에 설정 local_infile=1하고 서버 서비스를 다시 시작했습니다. 또한 --local-infile dbname옵션을 사용 하여 클라이언트를 실행했습니다 mysql -u root -p --local-infile mydatabase.
anddero

1
이것은 이상한 경우이지만 local_infine = on / True 동안 오류가 계속 발생했습니다. MySQL Workbench에서 테이블을 만든 다음 cmd를 통해 로컬 csv 데이터를 추가하려고 시도했기 때문입니다. 테이블을 삭제하고 cmd를 통해 새 테이블을 만들고 cmd를 통해 데이터를 추가하여 문제를 해결했습니다.
EatSleepCode

13

http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html

이것을 my.cnf에 넣으십시오. [client]섹션이 이미 있어야합니다 (보안에 대해 너무 걱정하지 않는 경우).

[client]
loose-local-infile=1

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

1
6.2.5에 MySQL을의 업데이트 나를 위해이 문제를 해결
OrwellHindenberg

@OrwellHindenberg- 느슨한 -local-infile = 1 을 사용 했습니까- 방금 local-infile이 있습니다.
Vérace

업데이트 전에 원래 답변에 있던 것을 시도했습니다. "loose"를 사용한 기억이 없습니다. 그러나 mySQL 업데이트는 저에게 효과적이었습니다.
OrwellHindenberg 2015 년

@OrwellHindenberg-편집을 확인하십시오. 항상 느슨한 -local-infile이었습니다. 편집은 단지 나의 (당시) newbie presentation / dba.se-style 오류를 수정했을뿐입니다
Vérace

11

이 모든 것이 내 새로운 Ubuntu 15.04에서는 해결되지 않았습니다.

나는 제거하고 LOCAL다음 명령을 얻었습니다.

LOAD DATA
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

하지만 다음을 얻었습니다.

MySQL said: File 'A.txt' not found (Errcode: 13 - Permission denied)

그것은 나를 위해 문제를 해결 한 stackoverflow에 대한 다른 질문에 대한 Nelson 의이 답변으로 이어졌습니다 !


1
참고 : 이것은 또한 예상 파일 위치를 클라이언트 컴퓨터에서 서버 컴퓨터로 이동한다고 확신 합니다. (그들은 동일한 시스템 인 경우에, 당신은 알 수 없습니다.)
ebyrob

MySQL 서버가 --secure-file-priv 옵션으로 실행
중이므로이

9

기본 MySQL 커넥터가있는 SpringBoot 2.1

이 문제를 해결하려면 지침을 따르십시오.

1. SET GLOBAL local_infile = 1;

이 전역 변수를 설정하려면 MySQL 문서에 제공된 지침을 따르십시오. https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html에

2. MySQL 커넥터 문자열 변경

allowLoadLocalInfile = true 예 : jdbc : mysql : // localhost : 3306 / xxxx? useSSL = false & useUnicode = yes & characterEncoding = UTF-8 & allowLoadLocalInfile = true


6

AWS MySQL 8.0 RDS에서 CSV 파일을 가져 오는 동안 동일한 문제가 발생했습니다.

mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv'INTO TABLE test.demo2 FIELDS TERMINATED BY ','ENCLOSED BY ' "'LINES TERMINATED BY '\ n'IGNORE 1 LINES;

오류 1148 (42000) : 사용 된 명령은이 MySQL 버전에서 허용되지 않습니다.

1) local_infile매개 변수 확인

mysql> SHOW VARIABLES LIKE 'local_infile';

2) 클라이언트에서 로그 아웃 한 후 아래 매개 변수를 사용하여 다시 로그인합니다.

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

3) 동일한 명령 실행

mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' INTO TABLE test.demo2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;


Query OK, 300 rows affected (0.01 sec)

Records: 300  Deleted: 0  Skipped: 0  Warnings: 0

5

또한 Windows에서 MySQL Workbench 를 사용하여 로컬 머신에서 AWS RDS 인스턴스로 .csv 데이터를 업로드하려고 시도하면서이 문제로 어려움을 겪었습니다 .

필요한 추가 기능 OPT_LOCAL_INFILE=1은 연결> 고급> 기타입니다. 참고 CAPS가 필요합니다.

AWS 개발자 포럼에서 PeterMag의 답변을 찾았습니다 .


추가 정보 :

SHOW VARIABLES LIKE 'local_infile';이미 반환 ON 되었으며 쿼리는 다음과 같습니다.

LOAD DATA LOCAL INFILE 'filepath/file.csv' 
    INTO TABLE `table_name`
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS;

위에 언급 된 답변 소스에서 복사 :

분명히 이것은 MYSQL Workbench V8.X의 버그입니다. 이 스레드의 앞부분에 표시된 구성 외에도 Workbench에서 다음과 같이 MYSQL 연결을 변경해야합니다.

  1. 모든 연결을 표시하는 MYSQL의 시작 페이지로 이동하십시오.
  2. 서버 연결 관리 (작은 스패너 아이콘)를 선택하십시오.
  3. 연결 선택
  4. 고급 탭 선택
  5. 기타 상자에 OPT_LOCAL_INFILE = 1을 추가합니다.

이제 MYSQL RDS에서 LOAD DATA LOCAL INFILE 쿼리를 사용할 수 있습니다. File_priv 권한이 필요하지 않은 것 같습니다. *


1
나는 작업대를 사용하고 있었고 이것이 내 문제였습니다. 이제 OPT_LOCAL_INFILE = 1 설정 후 해결됨
Chandan

3

약간의 추가.

mysql.connector 버전 8.0.16에서 또 다른 환생을 찾았습니다. 이제 allow_local_infile = True 가 필요합니다. 그렇지 않으면 위의 오류가 표시됩니다. 이전 버전에서 작업했습니다.

conn = mysql.connector.connect(host=host, user=user, passwd=passwd, database=database, allow_local_infile=True)

2

Java8 또는 + 버전, JDBC 및 MySql8을 사용 중이고이 문제에 직면 한 경우 다음을 시도하십시오.

연결 문자열에 매개 변수 추가 :

jdbc:mysql://localhost:3306/tempDB?allowLoadLocalInfile=true

또한 설정

local_infile = 1

my.cnf 파일에서.

최신 버전의 mysql-java-connector는 로컬 파일에 직접 연결하는 것을 허용하지 않을 수 있습니다. 따라서이 매개 변수를 사용하여 활성화 할 수 있습니다. 이것은 나를 위해 작동합니다.


1

docker [1]을 사용할 때 데이터를로드하는 동안이 오류가 발생했습니다. 이 다음 단계를 수행 한 후에 솔루션이 작동했습니다. 처음에는 데이터베이스와 테이블 datavaultfdata. 데이터 가져 오기 [2]를 시도 할 때 오류 [3]가 발생했습니다. 그런 다음

  • SET GLOBAL local_infile = 1;
  • 사용 확인 SHOW VARIABLES LIKE 'local_infile';
  • 그런 다음 mysql 세션을 다시 시작했습니다 mysql -P 3306 -u required --local-infile=1 -p. 사용자 생성은 [4]를 참조하십시오.
  • 나는 다시 이 내 문제를 해결 나의 테이블 :
    • use datavault;
    • drop table fdata;
    • CREATE TABLE fdata (fID INT, NAME VARCHAR(64), LASTNAME VARCHAR(64), EMAIL VARCHAR(128), GENDER VARCHAR(12), IPADDRESS VARCHAR(40));
  • 마지막으로 [2]를 사용하여 데이터를 가져 왔습니다.

완전성을 위해 .NET을 통해 컨테이너 내부에서 mysql 버전을 실행하고 있다고 추가 docker exec -it testdb sh합니다. mysql 버전은 x86_64의 Linux 용 mysql Ver 8.0.17 (MySQL Community Server-GPL) 이었습니다. 이것은 또한 WAMP64 의 mysql의 또 다른 버전 인 Win64 (x86_64)에 대해 mysql.exe Ver 14.14 Distrib 5.7.14로 테스트되었습니다 . 사용 된 관련 명령은 [5]에 나열되어 있습니다.


[1] docker run --name testdb -v //c/Users/C/Downloads/data/csv-data/:/var/data -p 3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:latest

[2] load data local infile '/var/data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n' IGNORE 1 ROWS;

[3] 오류 1148 (42000) : 사용 된 명령은이 MySQL 버전에서 허용되지 않습니다.

[4] 필요한 클라이언트는 다음을 사용하여 생성되었습니다.

  • CREATE USER 'required'@'%' IDENTIFIED BY 'password';
  • GRANT ALL PRIVILEGES ON * . * TO 'required'@'%';
  • FLUSH PRIVILEGES;
  • 이 오류가 발생ALTER USER 'required'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; 하면 다음 줄이 필요할 수 있습니다 .Authentication plugin ‘caching_sha2_password’ cannot be loaded

[5] WAMP64에서 mysql을 사용하는 명령 :

  • mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile=1여기서 포트는에서 설명한대로 호스트에 매핑 된 포트 docker ps -a이고 호스트 IP는 다음을 사용하여 획득 docker-machine ip되었습니다 (OS 및 가능하면 Docker 에 따라 다름). 버전 ).
  • 위에서 설명한대로 데이터베이스 datavault2 및 테이블 fdata 를 생성합니다.
  • load data local infile 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n';
  • 내 기록을 위해, 파일을로드하려면이 다른 대안은 내가 이전에 생성 한 후에 일 datavault3fdata을 : mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile datavault3 -e "LOAD DATA LOCAL INFILE 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' REPLACE INTO TABLE fdata FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS"그것은 성공적으로 쉽게 실행 한 후 확인 데이터를로드 select * from fdata limit 10;.


0

최고의 답변이 맞습니다. 먼저 MySQL CLI에서 직접 확인하십시오. 이것이 문제를 해결하면 Python3에서 작동하도록 할 수 있습니다. MySQLdb.connectas 매개 변수에 전달하십시오.

self.connection = MySQLdb.connect(
                    host=host, user=settings_DB.db_config['USER'],
                    port=port, passwd=settings_DB.db_config['PASSWORD'], 
                    db=settings_DB.db_config['NAME'],
                    local_infile=True)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.