본문 바로가기
카테고리 없음

[MySQL] LOAD DATA 문을 이용해서 대용량 데이터 추가하기

by kkkdh 2022. 11. 11.
728x90

프로젝트를 진행하다 대용량 데이터를 MySQL DB에 import 해야 되는 상황이 있었는데, 대용량 데이터의 경우 workbench에서 테이블에 import 할 수도 있지만

이렇게 import도 가능합니다.

이렇게 하면 시간이 너무 오래걸려서 LOAD DATA 문을 사용하면 훨씬 빨리 처리할 수 있다는 구글링 결과를 적용해서 해결한 과정을 정리해 보겠습니다.

 

대략 3만 개의 row를 table에 추가하려고 하니까 10분이 넘도록 게이지가 안 올라서 다음과 같이 LOAD DATA 문을 활용했습니다.

load data infile '원하는 파일 경로'
into table 스키마.테이블
character set utf8
fields terminated by ','
lines terminated by '\n'
ignore 1 rows # 첫 번째 header를 생략하기 위해서
(@Date, @stock_code, @Open, @High, @Low, @Close, @Volume, @Change)
SET stock_code = @stock_code,
	stock_date = STR_TO_DATE(@Date, '%Y-%m-%d'),
    open_price = @Open,
    low_price = @Low,
    high_price = @High,
    close_price = @Close,
    trading_volume = @Volume,
    stock_change = 0.1;

대략 이런 형태로 LOAD DATA문을 활용했습니다.

 

저기 아래에 SET절 위에 괄호에 들어가는 부분은 입력하는 파일에 작성된 column 명들로 직접 테이블에 사용하고 싶은 경우에는 '@'를 안붙이고, 생략하고 싶은 경우는 '@'를 붙여서 변수처럼 사용한다고 합니다.

 

'@'를 붙인 애들은 아래의 SET 절에서 테이블의 column에 그대로의 값 혹은 계산을 해서 넣어줄 수 있는데, 저는 예시 코드랑 비스무리하게 넣어줬습니다.

 


명령어 사용시 발생했던 오류 Error code: 1290

1290 에러는 다음과 같이 설명이 뜹니다.

 

⚠ the mysql server is running with the --secure-file-priv option so it cannot execute this statement ⚠

 

이거는 대강 secure-file-priv 옵션이 켜져 있어서 sql문을 수행할 수 없다는 뜻인데, 이게 무슨 말이냐 하면은 저 옵션이 켜져 있는 이상, 모든 경로가 아닌 허용된 경로 내에 있는 파일에 대한 접근을 허용한다는 말입니다.

 

그래서 허용된 경로가 어딘가? 는 다음 명령어를 이용하면 확인이 가능합니다!

저는 워크벤치에서 명령어를 입력한 결과가 저렇게 나와서, 저 안에 원하는 파일을 넣어 LOAD DATA의 파일 경로에 작성해 주니 오류를 해결할 수 있었습니다.


참고 자료

https://quatremains.tistory.com/31

 

MySQL LOAD DATA 를 사용하며...

1. LOAD DATA ... INFILE 에 대하여 - LOAD DATA 문은 매우 빠른 속도로 텍스트 파일의 행을 테이블로 읽습니다. LOCAL 수정자가 지정되었는지 여부에 따라 서버 호스트 또는 클라이언트 호스트에서 파일을

quatremains.tistory.com

 

728x90

댓글