code

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

codestyles 2020. 12. 27. 10:53
반응형

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


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

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

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


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

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

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

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

loose-local-infile = 1

여기 에서 답을 찾을 수 있습니다 .

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

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

SHOW VARIABLES LIKE 'local_infile';

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

SET GLOBAL local_infile = 1;

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

이것을 my.cnf에 넣으십시오- [client]섹션은 이미 거기에있을 것입니다 (보안에 대해 너무 걱정하지 않는다면).

[client]
loose-local-infile=1

이 모든 것이 내 새로운 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 의이 답변으로 이어졌습니다 !


기본 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


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

약간의 추가.

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)

MySQL 8.0 참조 설명서 -6.1.6 LOAD DATA LOCAL의 보안 문제 참조

서버 측에서 다음을 실행하십시오.

mysql.server start --local-infile

클라이언트 측에서

mysql --local-infile database_name -u username -p

최고의 답변이 맞습니다. 먼저 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)

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

  • SET GLOBAL local_infile = 1;
  • 사용 확인 SHOW VARIABLES LIKE 'local_infile';
  • Then I restarted my mysql session: mysql -P 3306 -u required --local-infile=1 -p, see [4] for user creation.
  • I recreated my table as this solved my problem:
    • 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));
  • Finally I imported the data using [2].

For completeness, I would add I was running the mysql version inside the container via docker exec -it testdb sh. The mysql version was mysql Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL). This was also tested with mysql.exe Ver 14.14 Distrib 5.7.14, for Win64 (x86_64) which was another version of mysql from WAMP64. The associated commands used are listed in [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] ERROR 1148 (42000): The used command is not allowed with this MySQL version

[4] The required client was created using:

  • CREATE USER 'required'@'%' IDENTIFIED BY 'password';
  • GRANT ALL PRIVILEGES ON * . * TO 'required'@'%';
  • FLUSH PRIVILEGES;
  • You might need this line ALTER USER 'required'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; if you run into this error: Authentication plugin ‘caching_sha2_password’ cannot be loaded

[5] Commands using mysql from WAMP64:

  • mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile=1 where the port is thee mapped port into the host as described by docker ps -a and the host ip was optained using docker-machine ip (This depends on OS and possibly Docker version).
  • Create database datavault2 and table fdata as described above
  • 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';
  • For my record, this other alternative to load the file worked after I have previously created datavault3 and fdata: 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" and it successfully loaded the data easily checked after running select * from fdata limit 10;.

ReferenceURL : https://stackoverflow.com/questions/18437689/error-1148-the-used-command-is-not-allowed-with-this-mysql-version

반응형