마이그레이션

MySQL에서 사용하는 스키마 변환시 주의 사항

by 정만영 posted Mar 02, 2012

MySQL에서 사용하는 스키마 변환시 주의 사항.( CUBRID 2008 R4.0 기준)

 

주의사항 정리

1, MySQL에서 fulltext 인덱스가 있는 경우, 에러를 출력함. CUBRID에서는 fulltext 인덱스 지원하지 않음.

2, CUBRID SET 타입에 대해 Index를 걸 수 없음.

3, MySQL에서 Set 타입 사용 예: MySQL 의 컬럼이 set('News','Sports') 일 때, 1을 넣으면 mysql char 'News' INSERT해 준다. 따라서 cubrid 에서는 varchar로 선언하고, SQL에서 CASE WHEN으로 입력하도록 가이드하였음. (이 방법의 정확성은 계속 확인할 필요가 있음)

4, CREATE /*+ NO_STATS */ INDEX "idx3" ON "office"("type","office_id"); // 생성할 수 없는 인덱스

5, MySQL에서는 a,b,c 컬럼에 대해서 인덱스를 2개 이상 만들 수 있지만, CUBRID는 만들 수 없음.

6, MySQL 에서 "를 사용해서 문자열을 넣지만, CUBRID에서는 '을 사용한다.

7, MySQL DESC 인덱스를 생성할 수 없으므로, 고의로 -를 곱해서 넣은 경우가 있음. 이 경우 원 값을 저장하는 컬럼과 -를 곱한 컬럼을 테이블에 저장하고 있음. 따라서 CUBRID 가져올 때 인덱스 필요성 유무를 판단한 다음, 컬럼과 인덱스를 만들 때 주의해야 함

8, CUBRID blob 타입 컬럼은 NOT NULL로 지정 못 함.

9, float(5,1)--> numeric(5,1)의 형식으로 변환

10, CUBRID에서는 "timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP" 의 컬럼 정의가 불가능함. on update ~ 를 지워야 함.

 

질의 변환 예

1, CUBRID JOIN을 이용한 UPDATE 불가: 변환할 수 없는 경우도 있음. 아래의 경우는 패턴이 단순하여 변환이 가능하였음.

변경 전

변경 후

UPDATE video_info V,
(SELECT DISTINCT service_info_id
FROM service_info
WHERE post_key =?
AND service_id = ?) S
SET V.private_flag = #privateStatus#

WHERE V.service_info_id = S.service_info_id

 

 

 

UPDATE video_info V

SET V.private_flag = #privateStatus#
WHERE V.service_info_id in (SELECT DISTINCT service_info_id
FROM service_info
WHERE post_key =?
AND service_id =?)

 

 

 

UPDATE video_info_master vim, video_info vi

SET vim.play_count = vim.play_count + 1
WHERE
vi.video_master_id = vim.video_master_id
AND vi.video_id =?
AND vi.private_flag = 10

UPDATE video_info_master vim
SET vim.play_count = vim.play_count + 1
WHERE
vim.video_master_id in (SELECT vi.video_master_id
FROM video_info vi
WHERE vi.video_id =?

AND vi.private_flag = 10 )

 

마이그레이션시 고려할 부분

1, 소스 테이블의 NOT NULL column NULL 들어 있는 경우가 있을 수 있음. 소스 테이블의 최초 스키마는 Nullable column이었거나, 다른 문제로 유입되었을 것임.

2, mysqldump를 사용해서 마이그레이션할 때, --tab으로 데이터를 뽑을 때는 mysqld를 실행한 계정과 같은 계정으로 뽑아내야 함.

 

마이그레이션 완료후 필요한 작업

1, MySQL AUTO_INCREMENT 컬럼의 최대값보다 충분히 큰 값으로 CUBRID의 시리얼 값을 변경해주어야 함. 그렇지 않으면 Insert 질의 실행할 때 Unique Violation이 날 수 있음. 작업 지시서에 꼭 넣어야 함.

 


Articles

1