데이터베이스

이종 데이터베이스 간 데이터 이관하기

mdowon285 2025. 4. 7. 17:02

 

데이터베이스 관리 시스템(DBMS)에는 여러 종류가 있다. 대표적으로 ORACLE과 MySQL, MS-SQL, PostrgreSQL 등이다. 각 DBMS 마다 사용하는 SQL 형식이 다르기 때문에 서로 연동하기 위해선 각자의 체계를 이해할 필요가 있다.

 

대표적으로 데이터 이관을 예시로 보자. MySQL에 있는 데이터를 ORCL로 이관하고자 한다.

 

이관 도중 오류가 발생했다. 메시지를 보면 ADDRESS란 컬럼에 대해 값이 너무 크다고 나온다. 이는 데이터 길이 문제로 이관하려는 데이터의 길이는 116인데 오라클이 받을 수 있는 길이의 최대값이 100으로 돼 있어 이관이 불가능하다는 의미다. 이 같은 경우 오라클의 최대값을 수정해야 한다.

 

 

 

 

이관 옵션에서 Configure을 통해 Source(MySQL)와 Target(ORCL)의 데이터 타입을 보자. 오류가 난 ADDRESS의 경우 MySQL은 VARCHAR(100)으로 돼있고 ORCL은 VARCHAR2(100)으로 설정돼 있다.

 

MySQL의 VARCHAR(10)에서 10은 10개의 문자를 의미한다. 반면 ORCL의 VARCHAR(10)은 10BYTE를 의미한다. 영어의 경우 알파벳 하나당 1BYTE를 차지하기 때문에 MYSQL의 VARCHAR나 ORCL의 VARCHAR나 상관 없지만, 한글의 경우 한 문자당 2~3BYTE를 차지한다. 따라서 각 플랫폼 간 받아들이는 데이터 타입이 다르기 때문에 이를 조정할 필요가 있다.

 

 

 

Target인 ORCL의 타입에서 길이를 늘려주자.

이후 똑같이 이관을 시도하면 완료. 행 개수도 일치한다.

 

그런데 이건 테이블 하나에 대해서만 이관할 때 세부적으로 조정하는 프로세스고... 하다보면 여러 개의 테이블을 한꺼번에 이관해야 할 필요가 많다. 그럴 땐 또 다른 방법을 사용한다.

 

 

 

 

 

우선 이관하고자 하는 모든 소스 테이블에서 DDL을 추출한다. 그리고 SQLines.com이란 홈페이지를 이용한다. sqlines는 특정 DBMS의 형식을 다른 DBMS의 형식으로 전환해주는 기능을 제공한다.

 

 

 

ORCL 형식으로 변환된 구문을 보면 데이터 타입에서 VARCHAR2(50 CHAR)으로 표시된다. 여기서 CHAR은 CHARACTER로 문자를 의미한다. 50 글자까지 받아들인다는 뜻. MYSQL의 VARCHAR(50)과 똑같다.

 

주의할 점은 하나의 DBMS에선 동일한 데이터 타입을 사용해야 한다. 어떤 테이블에선 VARCHAR2(* CHAR)를 쓰고 또 어떤 테이블에선 VARCHAR2(*)를 쓰면 헷갈릴 소지가 많다. 나만 기억하면 되는 문제가 아니라 추후 유지보수 할 때 다른 사람이 애를 먹게 될 가능성이 다분하다.

 

 

 

 

그렇게 테이블 구조를 만들어내고 데이터를 이관하면 문제 없이 들어간다.