트러블슈팅

liquibase에서 changelog 중 data.xml 생성할 때, GC overhead limit exceeded 에러

MJ.Lee 2024. 1. 26. 00:17

문제

liquibase로 changelog 중 data.xml을 생성하려고 했는데, 빈 data.xml이 생성되었다.

 

로그를 확인하니, data.xml 생성 도중 아래와 같이 GC overhead limit exceeded 에러가 발생했다.

 

 

실행한 liquibase 쉘 스크립트는 아래와 같다.

INCLUDE_OBJTECTS는 data.xml 파일을 만들 때 포함할 테이블 목록이 있고, 테이블 양이 33개 정도 되었다.

JDBC_DRIVER_HOME=${HOME}/.m2/repository/mysql/mysql-connector-java
JDBC_DRIVER_VERSION=8.0.12
CLASSPATH=${JDBC_DRIVER_HOME}/${JDBC_DRIVER_VERSION}/mysql-connector-java-${JDBC_DRIVER_VERSION}.jar

DRIVER=com.mysql.cj.jdbc.Driver

URL="jdbc:mysql://database 호스트명:20306/db 저장소명?useSSL=false"
USERNAME=db 유저명
PASSWORD=db password

AUTHOR=팀 명 혹은 프로젝트명

DATE_TIME=$(date +%Y%m%d%H%M%S)
CHANGELOG_SCHEMA=src/main/resources/config/liquibase/changelog/${DATE_TIME}_schema.xml
CHANGELOG_DATA=src/main/resources/config/liquibase/changelog/${DATE_TIME}_data.xml

INCLUDE_OBJECTS="포함하는 테이블1,포함하는 테이블2..."

liquibase --classpath=${CLASSPATH} \
          --driver=${DRIVER} \
          --url=${URL} \
          --username=${USERNAME} \
          --password=${PASSWORD} \
          --changeSetAuthor=${AUTHOR} \
          --changeLogFile=${CHANGELOG_DATA} \
          --diffTypes=data \
          --includeObjects=${INCLUDE_OBJECTS} \
          generateChangeLog \

원인

liquibase를 실행할 때 JVM의 heap space가 부족해서 생기는 문제였다.

 

해결

시도1 : JAVA Heap Space 증가 (실패)

JAVA의 heap space를 늘려주기로 했다.

 

실행 스크립트가 아니라 터미널에서 java 명령어로 -Xmx2G 옵션을 이용해 heap space를 2GB로 늘려서 liquibase를 실행시킬 수 있는 거 같다.

liquibase-3.0.2-bin>java -Xmx2g -jar liquibase.jar \ 
--classpath h="C:\db2jcc.jar" \ 
--changeLogFile="C:\Liquibase Release\liqui_MYDB_MYSCHEMA_Data.xml" \ 
--url="jdbc:db2://__ip__here__:9008/MYDB" \ 
--username="user" \ 
--password="12345" \ 
--defaultSchemaName="MYSCHEMA" \ 
--diffTypes=data \ 
--dataOutputDirectory=C:\Liquibase Release\liqui_MYDB_MYSCHEMA_Data.out \ 
generateChangeLog

 

나는 매번 실행할 때마다 java로 실행시켜주지 않기 위해, 로컬에 설치된 JAVA에 -Xmx2G 옵션을 설정해주기로 했다.

환경변수에 JAVA_OPTS로 -Xmx2G 옵션을 설정해주기 위해 .zshrc 파일을 연다.

vim .zshrc

 

.zshrc 파일 맨 하단에 아래와 같이 추가하여 JAVA_OPTS 환경 변수를 설정해줬다.

export JAVA_OPTS="-Xmx2G"

 

터미널을 닫고 다시 실행 후, JAVA_OPTS를 호출하면 -Xmx2G가 뜬다.

echo $JAVA_OPTS

 

다시, lilquibase를 실행하였다.

 

하지만 heap space를 늘려도, 여전히 GC overhead limit exceeded 에러가 났다.

시도2: 엄청 많은 row를 갖은 Table 제외

lilquibase는 database에 있는 정보들을 바탕으로 data.xml 파일을 만든다.

스크랩트 내 INCLUDE_OBJECTS에 있는 테이블들 중 몇 개가 10만 row가 넘는 대용량을 가지고 있었다.

대용량을 갖은 테이블들을 제외시켜주니 문제가 해결되었다.

 

참고 자료

https://stackoverflow.com/questions/18664571/liquibase-generatechangelog-failed-java-heap-space

 

Liquibase generateChangeLog Failed: Java heap space

When I try to generate SQL data from a DB2 database, I am getting Java Heap space issue. There are around 25 tables with approx 1000 records. I use the below scripts in generating the changeset d...

stackoverflow.com