Database

[MySQL] ERROR 2068 (HY000) : LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

비번변경 2022. 4. 6. 16:15

리눅스에서 mysql-client를 사용해 LOAD DATA LOCAL INFILE 문을 실행했더니, 아래와 같은 에러가 발생하면서 정상 동작하지 않았다.

 

실행한 명령어

mysql -u <USERNAME> -p <PASSWD> -P <PORT> -h <HOST> <DB> < /path/use.sql

 

에러 메세지

ERROR 2068 (HY000) at line 2: LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

 

공식 문서를 확인해보니 LOAD DATA LOCAL에 잠재적인 보안 문제가 있어 서버와 클라이언트 측에 보안 요구사항이 존재하며, 관련하여 MySQL 서버와 클라이언트 양측에서 local-infile을 활성화하지 않은 게 원인이었다.

 

관련하여 확인하고 조치해본다.

 

참고로 버전은 아래와 같다.

MySQL 서버 : 5.7.34 (AWS RDS)

Client 측 OS : Ubuntu 20.04 LTS

MySQL 클라이언트 : mysql-client 8.0.28-0ubuntu0.20.04.3

 

MySQL 서버 측

DB 서버에 접속한 뒤, 아래 명령어로 서버가 local-infile을 허용하고 있는지 확인한다.

SHOW VARIABLES LIKE 'local_inflie';

 

값이 OFF라면 활성화시킨다.

SET GLOBAL local_infile = 1;

# 또는
SET GLOBAL local_infile = true;

 

 

MySQL 클라이언트 측

방법 1)

일회성으로 허용할 때에는 local-infile 옵션을 주어 실행한다.

 

예시

mysql --local-infile -u <USERNAME> -p <PASSWD> -P <PORT> -h <HOST> <DB> < /path/use.sql

# 또는
mysql --local-infile=1 -u <USERNAME> -p <PASSWD> -P <PORT> -h <HOST> <DB> < /path/use.sql

 

방법 2)

영구적으로 허용할 때에는 MySQL 클라이언트의 옵션 파일에 local-infile 옵션을 추가한다.

 

옵션 파일

구성 파일이라고도 하며, 프로그램을 실행할 때마다 명령줄에 옵션을 추가하지 않을 수 있도록 일반적으로 사용하는 옵션을 지정한다.

즉, 목록의 파일에 원하는 옵션을 지정하면 mysql cli 사용 시 옵션을 명시적으로 추가하지 않아도 추가된 상태로 실행된다. 실제로 mysql cli가 읽어드리는 옵션 파일과 그룹은 mysql --help 명령으로 확인할 수 있다.

또한, mysql cli가 활성화/비활성화하고 있는 Variables(옵션) 또한 확인할 수 있다.

 

옵션 파일에 local-infile 옵션 추가

원하는 옵션 파일에 아래와 같은 형식으로 내용을 추가한다.

[GROUP_NAME]
OPTION_NAME = VALUE

이 글에서는 글로벌 옵션 파일인 /etc/mysql/my.cnf 파일에 mysql 그룹에 local-infile 옵션을 활성화할 것이다.

/etc/mysql/my.cnf 파일 수정에는 sudo 권한이 필요하다.

 

vi /etc/mysql/my.cnf

# 내용 추가
[mysql]
local_infile=1

# 만약 위 내용 추가만으로 되지 않으면 아래 내용도 추가
[mysqld]
local_infile=1

 

참고로 공식 문서에서는 아래와 같은 내용으로 수정하도록 안내하고 있다.

참고 : 2022.04.07 - [MySQL] mysql-client local-infile 활성화

[client]
loose-local-infile=1

 

수정/저장한 뒤, 옵션이 정상적으로 활성화되었는지 확인한다.