콘텐츠로 이동

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>#
  1. 실행 파일(migcenter.bat 또는 migcenter.sh)을 편집기로 연다.
  2. JVM 내 permanent generation space의 최대 크기를 정하는 옵션 -XX:MaxPermSize의 값을 기존 값보다 크게 설정한다.
<Metaspace>#

사용중인 JVM의 버전이 Java 8 이상인 경우, Metaspace의 공간 부족이 원인일 수 있다. Java 8부터 구현된 Metaspace는 PermGen (permanent generation space)의 대체제이다.

  1. 실행 파일(migcenter.bat 또는 migcenter.sh)을 편집기로 연다.
  2. JVM 내 permanent generation space의 최대 크기를 정하는 옵션 -XX:MaxPermSize를 metaspace의 최대 크기를 정하는 옵션으로 변경한 뒤, 기존 값보다 높게 수정한다.
    • 변경 전 : -XX:MaxPermSize=128m
    • 변경 후 : -XX:MaxMetaspaceSize=256m
  3. 참고

데이터 타입이 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 문자 집합 호환 여부를 꼭 확인해야 한다. 호환되지 않는 문자 집합 간의 이관을 강제 수행할 경우, 데이터가 깨지게 된다.

사례#

  1. 원본 데이터베이스 KSC5601에서 대상 데이터베이스 UTF8: 이관 가능

    KSC5601 한글 데이터는 UTF8로 표기될 수 있다. 따라서 각각의 문자 집합은 서로 호환된다.

    데이터 길이가 더 길어질 수 있으므로 테이블 객체 이관 시 문자형 타입 칼럼은 사이즈를 늘려야 한다.

  2. 원본 데이터베이스 KSC5601에서 대상 데이터베이스 GB231280: 이관 불가능

    KSC5601 한글 데이터는 GB231280으로 표기될 수 없다. 따라서 각각의 문자 집합은 서로 호환되지 않는다. 이러한 조건에서 꼭 데이터 이관이 필요한 경우, 대상 데이터베이스의 테이블 칼럼 데이터타입 CHAR, VARCHAR를 모두 NCHAR, NVARCHAR로 변경한 뒤, 데이터 이관을 수행해야 한다.

JDBC & 마이그레이션 센터의 문자 집합 처리 과정#

  1. 원본 데이터베이스로부터 데이터를 fetch할 때, char 데이터를 원본 데이터베이스 DB 문자 집합 포맷으로 가져와 바이트 배열에 저장한다.
  2. 바이트 배열에 저장된 데이터를 UTF-16 형태로 변환하여 Java 기본 타입인 String 객체에 저장한다.
  3. 대상 데이터베이스에 데이터를 삽입하는 PreparedStatement 객체에 setString 함수로 해당 String 객체를 전달한다.
  4. 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

참고#

마이그레이션 센터 실행시 "Could not create the java virtual machine" 메세지를 출력하고 시작 실패한다.#

원인#

bat, sh에서 설정된 최대 메모리 할당값(-Xmx) 자바 옵션이 시스템에서 할당 가능한 메모리보다 더 큰 경우 발생 가능한 오류이다. 특히 Windows O/S 32bit에서 자주 리포팅되는 오류이다.

해결 방법#

bat, sh에서 -Xms -Xmx 값을 사용자 환경에 맞춰 변경한 뒤, Migration Center를 재실행한다.