전체 보기
🍀

쉘 스크립트로 insert 쿼리 병렬 실행하기

작성일자
2024/08/28
태그
DIARY_DEVELOP
프로젝트
WoowaCourse
책 종류
1 more property

문제 상황

우테코에서 인덱스와 트랜잭션에 대해 학습하며, 몇 십 만 건의 데이터를 더미 데이터로서 저장해둘 필요가 있었다. 이때, 토미(코치)가 아래와 같은 말씀을 해주셨다.
pk 포함한 insert 쿼리이니 하나의 파일 전체를 하나의 커넥션에서 실행하는 것보다, 여러 개의 파일로 나눠서 여러 커넥션을 이용해 쿼리를 병렬로 실행하면 좀 더 빠르겠죠? 이렇게 데이터가 많을 때는 텍스트 에디터를 사용하는 것보다, 리눅스 커맨드를 이용해 파일의 특정 라인을 잘라내는 것이 훨씬 빠르고 쉬울 수 있습니다.
토미가 제공해주신 파일은 아래와 같은 형태였다.
> ls 01-coupon.sql 04-monthly_member_benefit.sql 02-member.sql 03-member_coupon.sql
Shell
복사
> vim 01-coupon.sql ``` -- INSERT문 내부 데이터는 제가 임의로 축약했습니다. INSERT INTO coupon (id, val_1, val_2) VALUES (1, "ex1", "ex2"); INSERT INTO coupon (id, val_1, val_2) VALUES (2, "ex1", "ex2"); -- 아래로 몇십만줄 더 INSERT문 존재합니다. ```
Shell
복사

해결 1. 쉘 스크립트로 병렬 실행하기

쉘 스크립트 연습하기
1.
스크립트 생성 (sql 파일들이 있는 경로에 생성함)
cd <sql 파일들 있는 경로> vim run_sql.sh ``` #!/bin/bash # MySQL 접속 정보 USER="root" PASSWORD="mypassword" DATABASE="your_database" # SQL 파일 목록 SQL_FILES=("01-coupon.sql" "02-member.sql" "03-member_coupon.sql" "04-monthly_member_benefit.sql") # 각 SQL 파일을 백그라운드에서 실행 for FILE in "${SQL_FILES[@]}" do mysql -u $USER -p$PASSWORD $DATABASE < $FILE & done # 모든 백그라운드 프로세스가 완료될 때까지 대기 wait ```
Shell
복사
2.
실행 권한 부여
chmod +x run_sql.sh
Shell
복사
3.
스크립트 실행
./run_sql.sh
Shell
복사
소요 시간: 1m 48s
데이터 양: 테이블 별로 35만건, 50만건, 70만건, 25만건 으로 총 180만 건

해결 2. GNU Parallel 이용해서 병렬 실행하기

1. GNU Parallel 설치
brew install parallel
Shell
복사
2. SQL 파일 병렬 실행
cd <sql 파일들 있는 경로> parallel -j 4 mysql -u <username> -p<password> < < {} ::: *.sql
Shell
복사

참고