ALTIBASE MIGRATION WITH DOCKER

임태환·2024년 11월 29일

Develop

목록 보기
2/2

VirtualBox내의 회사 개발 소스를 로컬 상으로 옮기기 위해 ALTIBASE를 DOCKER로 띄워서 쓰기로 결정했다.

연동 방법

먼저 docker altibase images를 먼저 pull 받는다.
VM상에서는 altibase 6점대를 사용하지만 images는 7.1.0를 사용한다.

문제점?

기존의 VM상의 license를 그대로 도커 컨테이너에 넣으면 라이센스 문제가 뜬다
이를 해결하기 위해서 http://support.altibase.com/kr 알티베이스 사이트에서 새로
라이센스를 발급 받아야한다. (키를 받기 위해 회원가입, MAC Address 필요)

컨테이너 생성 시 license 삽입

docker run -i -d --name altibase -e ALTIBASE_HOME=/home/altibase/altibase_home -p 20300:20300 -v "C:/path/license.dat:/home/altibase/altibase_home/conf/license" altibase/altibase /bin/bash -c "/home/altibase/altibase_home/bin/server start && tail -f /dev/null"

-i와 -d 옵션을 붙여 컨테이너의 입력을 열고 백그라운드에서 실행시킨다.
license파일의 경로는 Altibase 문서상에서 conf하위에 놓으라고 써져있다.

WINDOWS 방화벽 설정

고급 설정 → 인바운드 규칙(새 규칙) → altibase port인 20300 포트 허용
해당 설정으로 인해 클라이언트와 Altibase 서버 간 통신 가능
(20300port를 사용 중일 경우 altibase 기본 port 변경)

해당 작업까지 완료할 경우 컨테이너가 정상적으로 실행될 것이다.
컨테이너 내부에 접속하여 셸을 실행하려면 아래의 코드를 사용하면 된다.

docker exec -it altibase /bin/bash

DB 생성 및 DB DUMP 후 migration

필자는 altibase에서 DB를 먼저 dump시켰다.
altibase에서 DB를 import 또는 export를 할 경우 aexport와 iloader를 사용한다.
(필자의 경우 aexport 사용)
https://a07274.tistory.com/110 (참고 사이트)

export 이후 필자는 altibase_home 하위에 dump파일을 옮길 폴더를 생성하였다.
mkdir을 사용하여 디렉토리를 생성하면 된다.
이후 dump를 뜬 파일 폴더를 아래의 명령어로 컨테이너내에 이동시켰다.
docker cp C:\altibase_dump altibase:/home/altibase/altibase_home/dump

  1. server 및 altibase.properties (DB_NAME = DB명 입력)
  2. 서버 종료 (/bin 폴더에서 ./server stop)
  3. 서버 생성 (/bin 폴더에서 ./server create UTF8 UTF16)
    -오류 발생 시 /dbs 폴더내의 파일 전체 삭제 및 /logs하위의 loganchor,logfile 전체 삭제
  4. 이후 서버 실행 (/bin 폴더에서 ./server start)

disk tablespace나 user 생성이 필요한 경우

./isql -s localhost -u sys -p MANAGER

SYS계정으로 접속 후 생성해주면 된다.
만약 isql이 작동 안할 경우 export path를 수정해주면 된다.

이후 dump뜬 파일을 import를 하고싶으면

export PATH=$PATH:$ALTIBASE_HOME/bin
1번 ./run_is.bat
2번 ./run_il_in.bat
3번 ./run_is_index.bat
4번 ./run_is_fk.bat

해당 명령어를 입력하고 bat가 아닌 sh면 sh로 실행

.dat, .fmt파일 import(데이터 이동)

#!/bin/sh

# 데이터와 포맷 파일이 있는 디렉토리 설정
DATA_DIR="/home/altibase/altibase_home/dump"
CONTAINER_NAME="컨테이너 이름"  # 컨테이너 이름 수정

# Altibase 접속 정보 설정
USER_NAME="user"  # 사용자 이름 
PASSWORD="password"    # 비밀번호

# 모든 .fmt 파일을 반복 처리
for fmt_file in "$DATA_DIR"/*.fmt; do
   dat_file="${fmt_file%.fmt}.dat"
   if [ -f "$dat_file" ]; then
       filename=$(basename "$dat_file" .dat)
       echo "Importing $filename..."
       iloader -s 127.0.0.1 -u $USER_NAME -p $PASSWORD in -f "$fmt_file" -d "$dat_file"
   else
       echo "Warning: $dat_file not found for $fmt_file"
   fi
done

echo "Import completed."

Dump뜬 폴더내에 쉘 스크립트 위치후 권한 부여

docker exec -u root -it acaltibase bash
chmod +x /home/altibase/altibase_home/dump/import_all.sh
chown altibase:altibase /home/altibase/altibase_home/dump/import_all.sh

윈도우에서 쉘 스크립트 작성했을 경우 (줄 바꿈 문자 변환)
sed -i 's/\r$//' /home/altibase/altibase_home/dump/import_all.sh

컨테이너 접속 후 해당 import_all.sh 스크립트 실행 (data import 완료)


정상적으로 connection 및 import된걸 확인 가능하다.

주의 사항

소스 적용 및 DB 연결 이후
Mybatis Query Error가 발생하였는데

java.sql.SQLException: [0]:Invalid use of host variables

해당 에러는 Altibase에서 타겟 절에 호스트 변수 사용을 지원하지 않아서 생긴 문제다.

필자의 경우

USING (SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') AS DATE
                    , #{user_id} AS USER_ID
        FROM DUAL
               ) B

해당 쿼리에서 user_id 변수에서 오류가 발생하였는데

USING (SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') AS DATE
                    , CAST(#{user_id} AS VARCHAR2(20)) AS USER_ID
        FROM DUAL
               ) B

CAST로 parameter를 감싸여 해결하였다.

profile
웹 개발자

0개의 댓글