워크벤치를 이용해 더미 데이터를 10만 건 삽입하던 중, 아래와 같은 오류가 발생했습니다:
Error Code: 2013. Lost connection to MySQL server during query
처음에는 단순한 네트워크 문제인가 싶었지만, 파일 크기를 보니 SQL 파일 용량이 무려 95MB가 넘어가고 있었습니다.
대용량 INSERT 구문 처리 중 서버와의 연결이 끊긴 것으로 보였습니다.
인터넷 검색 중 가장 많이 나오는 해결책은 워크벤치의 쿼리 시간 제한 설정 변경이었습니다.
경로
Edit > Preferences > SQL Editor > MySQL Session
항목 | 설명 |
---|---|
DBMS connection keep-alive interval | DBMS에 주기적으로 keep-alive 신호를 보내는 간격 (기본 600초) |
DBMS connection read timeout interval | 쿼리 결과를 기다리는 최대 시간 (기본 30초) |
DBMS connection timeout interval | DB 연결 시도 시 최대 대기 시간 (기본 60초) |
read timeout
을 300초 이상으로 늘려도 오류는 계속 발생했습니다.
즉, 문제는 시간 제한이 아니라 패킷 크기였습니다.
max_allowed_packet
설정 변경SQL 파일이 95MB 정도였기 때문에, 단일 쿼리의 패킷 크기가 MySQL 서버의 max_allowed_packet 제한(기본 16MB) 을 초과하고 있었습니다.
제가 사용 중이던 MySQL은 Docker 컨테이너 기반이었고, 아래와 같이 docker-compose.yml
을 수정했습니다:
mysql1:
image: mysql:8.0.30
container_name: event-db
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: ficket
command: --max_allowed_packet=256M
volumes:
- mysql1-data:/var/lib/mysql
command: --max_allowed_packet=256M
를 추가해 주었습니다.
docker-compose up -d mysql1
docker exec -it event-db mysql -u root -p -e "SHOW VARIABLES LIKE 'max_allowed_packet';"
정상적으로 설정되었다면 아래와 같이 출력됩니다.
+--------------------+-----------+
| Variable_name | Value |
+--------------------+-----------+
| max_allowed_packet | 268435456 |
+--------------------+-----------+
설정 적용 후 아래 명령어로 컨테이너 내부에 접속해 SQL 파일을 실행했더니, 더 이상 오류 없이 성공적으로 데이터가 삽입되었습니다.
docker exec -it event-db bash
mysql -u [user] -p[password] [database] < [data.sql]
대용량 데이터 삽입 시에는 단순한 워크벤치 설정만으로 해결되지 않는 경우가 많습니다.
특히 max_allowed_packet
은 패킷 크기 제한이 걸려 있을 경우 꼭 확인해야 할 항목입니다.
max_allowed_packet
설정 먼저 의심command:
옵션으로 설정 쉽게 반영 가능Reference