DBMS 공통
DBMS 공통#
데이터 이관 중에 OutOfMemoryError가 발생한다.#
원인#
다수의 쓰레드들이 대상 데이터베이스에 배치작업으로 데이터를 삽입하는 과정에서 메모리가 부족하여 발생할 수 있다.
해결 방법#
OutOfMemoryError에서 출력한 에러 메시지에 따라 아래와 같이 3가지 경우로 나눌 수 있다.
<Java heap space>#
상황에 따라 아래 작성된 두 가지 방법을 선택해 적용한다.
- 메모리 사용량을 낮추도록 성능 프로퍼티 값 변경
- 프로젝트를 연다.
- 메뉴 Migration → Migration Options를 클릭한다.
- Batch Size와 Thread Count의 값을 낮춘다.
- 프로그램이 사용할 수 있는 최대 메모리 크기 증가
- 실행 파일(migcenter.bat 또는 migcenter.sh)을 편집기로 연다.
- JVM 내 heap 최대 크기를 정하는 옵션 -Xmx의 값을 기존 값보다 높게 설정한다.
Windows 32 bit machine에서는 OS dependency로 인해 Xmx 값을 최대 1.5 GB까지 설정할 수 있다.
<PermGen space>#
- 실행 파일(migcenter.bat 또는 migcenter.sh)을 편집기로 연다.
- JVM 내 permanent generation space의 최대 크기를 정하는 옵션 -XX:MaxPermSize의 값을 기존 값보다 크게 설정한다.
<Metaspace>#
사용중인 JVM의 버전이 Java 8 이상인 경우, Metaspace의 공간 부족이 원인일 수 있다. Java 8부터 구현된 Metaspace는 PermGen (permanent generation space)의 대체제이다.
- 실행 파일(migcenter.bat 또는 migcenter.sh)을 편집기로 연다.
- JVM 내 permanent generation space의 최대 크기를 정하는 옵션 -XX:MaxPermSize를
metaspace의 최대 크기를 정하는 옵션으로 변경한 뒤, 기존 값보다 높게 수정한다.
- 변경 전 : -XX:MaxPermSize=128m
- 변경 후 : -XX:MaxMetaspaceSize=256m
- 참고
데이터 타입이 LOB인 테이블 칼럼의 NOT NULL 제약 조건이 이관되지 않는다.#
원인#
마이그레이션 센터가 LOB 칼럼의 NOT NULL 제약 조건을 임의로 제거하여 발생하는 현상이다.
마이그레이션 센터는 파라미터가 포함된 쿼리문(예: insert into tablename values(?,?))을 사용해서 대상 DB에 데이터를 삽입한다.
Altibase는 다른 칼럼과는 달리 LOB 칼럼에 데이터를 입력할 경우에는 먼저 데이터를 null로 초기화한 다음, LOB Locator를 통해 데이터를 받아서 입력하는 두 단계로 처리한다. 따라서 해당 칼럼에 NOT NULL 제약 조건이 있다면 데이터를 null로 초기화할 수 없어서 insert가 실패하게 된다.
이런 제약 때문에, 마이그레이션 센터는 LOB 칼럼의 NOT NULL 제약 조건을 임의로 제거해서 마이그레이션을 수행한다.
이러한 내용은 General Reference 매뉴얼- 1. 자료형 - LOB 데이터 타입 - 제한사항에서 확인할 수 있다.
오라클은 커밋 시에만 제약 조건에 대한 검사를 수행하기 때문에, 위와 같은 조건에서도 데이터를 삽입할 수 있다.
해결 방법#
이관 후, Altibase에서 해당 칼럼에 NOT NULL 제약 조건을 추가하는 SQL문을 실행한다.
Database 문자 집합 관련 주의사항#
기본적으로 원본 데이터베이스와 대상 데이터베이스의 DB 문자 집합을 동일하게 지정하여 사용하기를 권장한다.
만약 특수한 상황 때문에 문자 집합을 다르게 지정해야 한다면, 각각의 DB 문자 집합 호환 여부를 꼭 확인해야 한다. 호환되지 않는 문자 집합 간의 이관을 강제 수행할 경우, 데이터가 깨지게 된다.
사례#
-
원본 데이터베이스 KSC5601에서 대상 데이터베이스 UTF8: 이관 가능
KSC5601 한글 데이터는 UTF8로 표기될 수 있다. 따라서 각각의 문자 집합은 서로 호환된다.
데이터 길이가 더 길어질 수 있으므로 테이블 객체 이관 시 문자형 타입 칼럼은 사이즈를 늘려야 한다.
-
원본 데이터베이스 KSC5601에서 대상 데이터베이스 GB231280: 이관 불가능
KSC5601 한글 데이터는 GB231280으로 표기될 수 없다. 따라서 각각의 문자 집합은 서로 호환되지 않는다. 이러한 조건에서 꼭 데이터 이관이 필요한 경우, 대상 데이터베이스의 테이블 칼럼 데이터타입 CHAR, VARCHAR를 모두 NCHAR, NVARCHAR로 변경한 뒤, 데이터 이관을 수행해야 한다.
JDBC & 마이그레이션 센터의 문자 집합 처리 과정#
- 원본 데이터베이스로부터 데이터를 fetch할 때, char 데이터를 원본 데이터베이스 DB 문자 집합 포맷으로 가져와 바이트 배열에 저장한다.
- 바이트 배열에 저장된 데이터를 UTF-16 형태로 변환하여 Java 기본 타입인 String 객체에 저장한다.
- 대상 데이터베이스에 데이터를 삽입하는 PreparedStatement 객체에 setString 함수로 해당 String 객체를 전달한다.
- JDBC 드라이버 내부에서 대상 데이터베이스의 DB 문자 집합에 맞춰 데이터를 변환하고 삽입한다.
JDBC 드라이버 파일 선택 중 프로그램이 비정상 종료한다.#
원인#
Windows 환경에서 마이그레이션 센터를 실행할 때 발생할 수 있는 오류이다. 연결정보 등록 시 JDBC 드라이버 파일을 선택하던 중, 디렉토리를 변경하면 프로그램이 비정상 종료되는 문제가 나타날 수 있다. 이는 JVM과 Windows 운영체제 사이의 커뮤니케이션 문제로 인해 발생하는 Java JVM crash이다. 아래 링크를 통해, 오래된 버전의 JVM에서 발생하는 Java crash 문제를 확인할 수 있다.
해결 방법#
최신 버전의 JRE를 설치하고 migcenter.bat 파일 내의 JAVA_HOME 경로를 수정한 뒤, 마이그레이션 센터를 재실행한다.
CLI 모드로 실행 시, UnsatisfiedLinkError: /usr/lib/jvm/java-8-oracle/jre/lib/amd64/libawt_xawt.so: libXrender.so.1: cannot open shared object file: No such file or directory 발생#
JVM에서 64-bit libXrender.so 파일을 요청했지만, OS에 해당 패키지가 설치되지 않았을 때 발생하는 오류이다. 해당 패키지는 AWT나 Swing을 포함한 64-bit 어플리케이션을 실행할 때 필요하다.
원인#
주로 64비트 장비에 32비트 JRE를 설치한 뒤, 이를 사용하여 자바 프로그램을 실행하려 할 때 발생한다.
해결 방법#
장비의 비트 값에 맞는 JRE를 새로 설치한 뒤, JAVA_HOME을 해당 위치로 변경한다. 데비안 계열의 리눅스는 아래와 같은 명령어를 실행하여 패키지를 설치한다.
sudo apt-get install libXrender1
참고#
- http://www.jmeter-archive.org/Bug-in-running-Jmeter-on-Ubuntu-12-04-td5722692.html
- https://www.spigotmc.org/threads/bungeecord-not-starting-up-on-java-8.24652/
마이그레이션 센터 실행시 "Could not create the java virtual machine" 메세지를 출력하고 시작 실패한다.#
원인#
bat, sh에서 설정된 최대 메모리 할당값(-Xmx
) 자바 옵션이 시스템에서 할당 가능한 메모리보다 더 큰 경우 발생 가능한 오류이다. 특히 Windows O/S 32bit에서 자주 리포팅되는 오류이다.
해결 방법#
bat, sh에서 -Xms -Xmx 값을 사용자 환경에 맞춰 변경한 뒤, Migration Center를 재실행한다.