DB

[MySQL] LOAD DATA INFILE로 대용량 데이터 빠르게 삽입하는 방법 ⚡

인생아 2025. 7. 3. 10:33
반응형

MySQL에서 수십만 건 이상의 데이터를 빠르게 삽입하고 싶을 때 INSERT 문만 사용하면 속도 문제에 봉착하게 된다.
이럴 때 가장 강력한 도구는 바로 LOAD DATA INFILE이다.
CSV, TSV 등 텍스트 파일 데이터를 MySQL 테이블에 고속으로 삽입하는 데 최적화된 명령어이다.

🛠️ LOAD DATA INFILE이란?

LOAD DATA INFILE은 파일 시스템에 저장된 데이터를 한 번에 테이블로 로딩하는 MySQL의 고속 입력 기능이다.
대용량 로그 데이터, 백업 복원, 마이그레이션 등에 매우 자주 활용된다.

기본 문법

LOAD DATA INFILE '파일경로'
INTO TABLE 테이블명
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';
반응형

📁 파일 준비: CSV 또는 텍스트 파일

다음과 같은 쉼표 구분 CSV 파일이 있다고 가정한다.

data.csv

 
1,홍길동,2023-01-01
2,김철수,2023-01-02
3,이영희,2023-01-03

📦 테이블 생성 예시

CREATE TABLE members (
  id INT,
  name VARCHAR(100),
  reg_date DATE
);

🚀 데이터 삽입 예제

LOAD DATA INFILE '/var/lib/mysql-files/data.csv'
INTO TABLE members
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';

이 명령어는 해당 경로에 존재하는 data.csv 파일을 읽어와 members 테이블에 일괄 삽입한다.

✅ 유의사항

  • 파일은 MySQL 서버가 접근할 수 있는 위치에 있어야 한다
  • 기본적으로 /var/lib/mysql-files/ 디렉토리를 사용한다
  • secure_file_priv 설정이 필요할 수 있다
SHOW VARIABLES LIKE 'secure_file_priv';

설정이 비어 있다면 서버 어디든 가능하지만, 경로가 지정되어 있다면 해당 디렉토리 안에만 접근할 수 있다.

반응형

🔐 권한 에러 대처법

만약 다음과 같은 에러가 발생한다면?

The MySQL server is running with the --secure-file-priv option

해결법

  • my.cnf 또는 my.ini에서 secure_file_priv 값을 수정하거나
  • 해당 경로 안에 파일을 두고 LOAD 실행

또는 클라이언트에서 로딩하고 싶다면 LOCAL 옵션 사용

LOAD DATA LOCAL INFILE 'data.csv'
INTO TABLE members
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';

단, 이 경우 클라이언트와 서버 모두 local_infile=1 설정이 필요하다.

🎯 고급 옵션: 컬럼 매핑

CSV 파일이 모든 컬럼을 포함하지 않거나 순서가 다를 경우, 명시적으로 컬럼을 지정할 수 있다.

LOAD DATA INFILE '/data.csv'
INTO TABLE members (id, name, reg_date);

또는 특정 컬럼은 생략하고 나머지만 삽입도 가능하다.

💡 활용 팁

  • INSERT 대비 최대 20~50배 빠른 성능을 보여준다
  • 대용량 로그 수집, IoT 센서 데이터 삽입 등에 자주 활용된다
  • 테이블 락이 걸리므로 동시에 쓰기 작업이 없을 때 실행하는 것이 좋다

🔗 공식 문서 링크

반응형