문제
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