개요
Database를 구성할 시 DB NAME (SID), Data File 경로, Character Set을 결정해야 합니다. 특히 Character set의 경우, Database를 구성하면 이후 변경이 어렵기 때문에 초기 설치 시 사용자 환경 및 요구 사항을 고려하여 구성이 필요합니다.
MSWIN949 문자셋에서 UTF8 문자셋으로 Character Set을 전환하는 방법과 각 단계별 작업 내용을 설명합니다.
방법
MSWIN949 → UTF8로 캐릭터 셋 변경 순서
•
기존 2Byte(MSWIN949 ) → 3Byte(UTF-8) 변경 시 기존 테이블의 컬럼 사이즈 늘리는 작업 필요
•
기존 DB 사이즈 조정
•
기존 DB 백업 (tbexport) - 서버의 locale와 DB의 문자셋이 동일해야한다
•
신규 DB 생성 (변경하고자하는 문자열로 데이터베이스 생성)
•
백업한 데이터 신규 DB에 import
1.
기존 Tibero Character Set 확인
•
NLS_CHARACTERSET: MSWIN949
•
NLS_NCHAR_CHARACTERSET: UTF16
SQL> col name for a25
SQL> col value for a15
SQL> col COMMENT_STR for a60
SQL> set linesize 200
SQL> select * from database_properties;
NAME VALUE COMMENT_STR
------------------------- --------------- ------------------------------------------------------------
DFLT_PERM_TS USR Name of default permanent tablespace
DFLT_TEMP_TS TEMP Name of default temporary tablespace
DFLT_UNDO_TS0 UNDO Name of default undo tablespace
NLS_CHARACTERSET MSWIN949
NLS_NCHAR_CHARACTERSET UTF16
DB_NAME tibero database name
6 rows selected.
SQL
복사
2.
OS에서 Character Set 변경
OS 계정의 LANG 확인
$ locale | grep LANG
LANG=en_US.UTF-8
SQL
복사
변경 가능한 LANG 확인
$ locale -a | grep en_US.utf8
en_US.utf8
SQL
복사
변경이 필요할 시 LANG 임시 변경
$ LANG=en_US.utf8
SQL
복사
영구 변경
$ vi ~/.bash_profile
export LANG=en_US.utf8
-- 적용
$ source ~/.bash_profile
SQL
복사
3.
터미널 상의 Character Set 설정
사용 중인 터미널의 문자 인코딩도 UTF-8 설정이 필요합니다. (예: Putty, Terminal 설정)
4.
tbdns.tbr 파일 Character Set 설정
PATH : $TB_HOME/client/config/tbdsn.tbr
$ vi $TB_HOME/client/config/tbdsn.tbr
tibero=(
(INSTANCE=(HOST=localhost)
(PORT=8629)
(DB_NAME=tibero)
)
)
tibero_SP=(
(INSTANCE=(HOST=localhost)
(PORT=8630)
(DB_NAME=tibero)
)
)
TB_NLS_LANG=UTF8
SQL
복사
5.
기존 테이블의 컬럼 사이즈 늘려주기
•
테이블 스페이스 확인 후 65% 이상 사용 중: 1.5배 늘리기
•
VARCHAR/CHAR : 기존 컬럼에서 1.5 ~ 2배 사이즈 늘리기
아래 스크립트를 통해 컬럼 사이즈 늘리는 쿼리 확인하여 테이블에 적용합니다.
$ tbsql tibero/tmax
tbSQL 6
TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Connected to Tibero.
SQL> SELECT 'ALTER TABLE '|| table_name ||' MODIFY('|| LOWER(column_name) ||' VARCHAR2('|| LEAST(CEIL(data_length*1.5/10) * 10, 4000) ||'));' AS sqltext
FROM USER_TAB_COLUMNS
WHERE data_type LIKE 'VARCHAR%'
AND data_length > 1
AND data_length < 4000;
SQLTEXT -- 자동으로 1.5 ~ 2배 해준 상태
--------------------------------------------------------------------------------
ALTER TABLE TEST MODIFY(name VARCHAR2(20));
ALTER TABLE TEST MODIFY(address VARCHAR2(60));
ALTER TABLE TMAXKOREAN MODIFY(name VARCHAR2(20));
ALTER TABLE TMAXKOREAN MODIFY(address VARCHAR2(150));
ALTER TABLE TMAXKOREAN MODIFY(gender VARCHAR2(20));
5 rows selected.
SQL
복사
참고
MSWIN949는 2Byte, UTF-8은 최대 3Byte로, 데이터 손실을 방지하기 위해 컬럼 사이즈를 변경합니다.
쿼리 적용 전 테이블 상태 확인
SQL> desc TMAXKOREAN
COLUMN_NAME TYPE CONSTRAINT
---------------------------------------- ------------------ --------------------
NAME VARCHAR(10)
ADDRESS VARCHAR(100)
POST NUMBER(6)
NUM NUMBER(4)
GENDER VARCHAR(10)
SQL> ALTER TABLE TEST MODIFY(name VARCHAR2(20));
SQL> ALTER TABLE TEST MODIFY(address VARCHAR2(60));
SQL> ALTER TABLE TMAXKOREAN MODIFY(name VARCHAR2(20));
SQL> ALTER TABLE TMAXKOREAN MODIFY(address VARCHAR2(150));
SQL> ALTER TABLE TMAXKOREAN MODIFY(gender VARCHAR2(20));
-- 쿼리 적용 후 테이블 상태 확인
SQL> desc TMAXKOREAN
COLUMN_NAME TYPE CONSTRAINT
---------------------------------------- ------------------ --------------------
NAME VARCHAR(20)
ADDRESS VARCHAR(150)
POST NUMBER(6)
NUM NUMBER(4)
GENDER VARCHAR(20)
SQL
복사
6.
tbexport로 데이터 백업 (기존 캐릭터 셋 - mswin949)
$ tbexport username=sys password=tibero sid=tibero file=/work/bak_data.dat log=/work/bak_data.log full=y
SQL
복사
7.
새로운 Character Set으로 database 생성
(1) 새로운 서버 생성 후 database 생성 (UTF8)
(2) 동일 서버에 멀티 인스턴스로 database 생성 (UTF8)
8.
데이터 복구 (새로 생성한 database에 데이터 이관)
-- tbimport 전 유저 생성 & 권한 부여
SQL> create user {user name} identified by {user password} ;
User '{user name}' created.
-- 권한 부여
SQL> grant connect, resource, dba to {user name};
SQL
복사
tbimport 수행
$ tbimport username=sys password=tibero sid=tibero2 file=/work/test.dat USER=TIBERO IGNORE=y
SQL
복사
참고
•
OS, 터미널, DB 문자셋이 일치해야 tbexport/tbimport 수행 시 데이터 깨짐을 방지할 수 있습니다.
•
데이터 유실을 방지하기 위해서는 반드시 사전 백업이 필요합니다.
•
tbimport 시, ‘IGNORE=y’ 옵션은 기존 객체의 Duplicate 에러를 무시하고 복구를 계속 진행합니다.