티스토리 뷰



현재를 데이터베이스의 시대라 해도 과언이 아닐만큼 스마트폰부터 메인플레임까지 각종 데이터베이스 시스템으로 넘쳐나는 시대입니다. 결정권자에 의해 어떤 데이터베이스 시스템이 결정되면 해당 조직은 결정된 데이터베이스에 의존적인 구조가 되는 것도 현실입니다. 특히 오라클이나 SQL 서버를 DBMS로 사용하는 조직의 경우에는 이러한 의존적 구조가 심화되어 데이터베이스 시스템을 바꾸기란 여간 어려운 일이 아닙니다.

그렇지만 이미 데이터베이스 관련 기술은 일반화되어 오픈소스 데이터베이스 시스템으로도 기업의 핵심 업무를 수행하는데 아무런 지장이 없고 분야에 따라서는 오픈소스 데이터베이스가 오히려 좋은 성능을 내는 경우도 있습니다. 이런 배경 때문에 데이터베이스간에 손쉬운 변환을 지원하는 도구들이 많이 등장하고 있습니다. 서로 다른 데이터베이스간의 데이터 전환을 통상 DB 마이그레이션이라 합니다. 오픈 소스 데이터베이스라 하더라도 이런 도구들은 돈을 받고 파는 경우가 대부분이고 모든 데이터베이스를 지원하는 것도 아닙니다. 이런 경우 확실한 변환 방법은 중간에 텍스트 파일 형태의 CSV를 거치도록 하는 것으로 대부분의 데이터베이스 시스템이 텍스트 CSV 파일로의 내보내기(Export) 및 들여오기(Import)를 지원하기 때문에 양쪽에 적절한 스키마만 준비되어 있다면 전문적인 도구없이도 무리없이 DB 마이그레이션을 수행할 수 있습니다.

본 포스팅은 MS의 액세스(Access) DB를 MySQL로 마이그레이션하는 과정을 중간에 CSV 파일을 거쳐서 하는 것으로 가정했습니다. MS 액세스가 설치되어 있다면 엑셀로 내보내기 하면 간단히 해결될 수 있는 문제지만 많은 사용자들은 액세스 DB에 대한 권한이 없는 경우가 많으므로 SQL 서버의 들여오기/내보내기 마법사(SQL Server Import and Export Wizard)를 활용할까 합니다.(무료 개발자 버전인 SQL Server Express Edition을 사용하시는 분은 SQL Server Express Edition Toolkit를 설치하면 됩니다) 이 도구를 사용하면 액세스 뿐만아니라 SQL서버를 비롯하여 닷넷 드라이버로 연결할 수 있는 대부분의 데이터베이스를 입출력 대상으로 삼을 수 있습니다.



시작 메뉴에서 SQL 서버의 "Import and Export Data"를 선택합니다.



[Next]로 진행합니다.



데이터 소스로 액세스 DB를 선택하고 [Browse]버튼을 눌러 액세스 DB 파일(*.mdb)를 선택하고 [Next]로 진행합니다. 엑셀을 DB로 넣거나 다른 데이터베이스에서 데이터를 추출할 경우 데이터 소스로 적절하게 선택하면 됩니다.



변환 대상 선택 화면으로 위의 그림에서 보듯이 변환 대상도 다양한 데이터베이스를 선택할 수 있습니다. 본 예제에서는 원본 데이터베이스(*.mdb)에서 데이터를 추출해서 CSV 파일에 저장할 것이므로 "Flat File Destination"을 선택합니다.



[Browse]버튼을 눌러 저장할 파일을 입력하고 언어와 인코딩을 선택합니다. 우측의 "Unicode"를 체크하면 엑셀등에서 인식할 수 있는 UTF-16형태로 저장합니다. 최근에 많이 사용하는 utf-8등으로 저장하려면 "Code page"에서 선택합니다. "Delimited" 형식은 행구분, 항목구분자를 지정하겠다는 의미이며 다음 단계에서 어떤것을 구분자로 할지 선택하게 됩니다. "Text qualifier"" 를 입력한 이유는 문자 항목을 " 문자로 감싸기 위함입니다. "Column names in the first data row"를 체크하면 CSV파일의 첫행에 컬럼이름을 출력합니다. [Next]로 진행합니다. 



"Copy data from one or more tables or views"를 선택하고 [Next]로 진행합니다.



CSV파일로 저장하는 방식은 한번에 하나의 테이블만 작업할 수 있습니다. 대상 테이블을 콤보 박스를 통해 선택하고 행구분자와 항목 구분자를 선택한 다음 [Next]로 진행합니다. 행 구분자는 윈도우, 리눅스/유닉스, 맥에 따라 방식이 다르므로 적절한 방식을 선택합니다. 위의 예제에서 선택한 {CR}{LF}는 윈도우 방식 행구분입니다. 예제에서는 항목 구분자로 탭문자를 사용하도록 선택했습니다.



"Run immediately"를 체크하고 [Finish]로 변환을 시작합니다.


작업이 끝나면 위의 그림과 같이 저장한 행수를 출력하므로 원본의 개수를 확인해서 정합성을 확인합니다. 저장 대상 드라이버를 통해서 다른 데이터베이스로 직접 저장하는 것이 간편할 수는 있지만 이기종 데이터베이스 간에는 속성이나 방식의 차이로 정상적으로 마이그레이션 할 수 없을 수도 있으므로 본 포스팅 처럼 중간에 CSV를 거치는 방법이 안전한 방법일 수 있습니다.

끝으로 CSV로 내려받은 파일을 MySQL에 입력하려면 먼저 "Create table" 구문으로 테이블을 생성합니다. 주의할 점은 CSV파일에 저장된 컬럼 순서와 테이블의 속성 순서가 일치해야 한다는 점입니다. 테이블이 준비되었으면 MySQL 클라이언트로 접속하여 아래와 같은 형태의 구문을 입력하면 됩니다.

LOAD DATA LOCAL INFILE 'test_tbl.csv' INTO TABLE test_tbl FIELDS TERMINATED BY '\t' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

구문에서 인지할 부분은 행구분과 항목 구분을 CSV 파일과 일치시켰으며 제목행을 건너뛰도록 했다는 것입니다. 작업을 수행하면 몇행이 입력되었는지를 표시하는데 원본 행수와 일치하는지 확인합니다. 중간에 경고가 있는 경우에는 아래와 같은 구문으로 경고의 내용을 확인해서 재작업등을 검토해야 합니다.

SHOW WARNINGS;



댓글
댓글쓰기 폼