ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS SCT 사용법 정리
    개발 이야기/DB, 데이터분석, AI 2022. 9. 27. 09:52
    728x90
    반응형

    최근 아주 오래된 MSSQL DB (2008 R2)를 MySQL로 마이그레이션 작업을 하면서 AWS SCT(Schema Conversion Tool)를 사용해며 관련 내용을 정리해 보았습니다.

    이 링크에서 SCT 설치파일과 사용할 JDBC 드라이버를 다운받아 설치합니다. 그리고 Settings -> Global Settings -> Drivers에서 MSSQL과 MySQL 드라이버를 설정합니다.

    그리고 상단 메뉴에서 File -> New Project 를 선택해 새로운 프로젝트를 생성합니다.

    MSSQL 2008 R2는 SCT에서 지원하지 않습니다. 별도 MSSQL 라이센스가 없어도 AWS Console -> RDS에서 Free tier로 SQL 서버를 생성해 사용 후 삭제하면 거의 비용이 들지 않습니다.

    스키마만 필요하다면 DB 선택 -> 태스크 -> 스크립트 생성 메뉴를 통해 sql 파일을 만들어 최신 버전의 SQL 서버에 생성할 수 있으며, 데이터까지 필요하면 데이터 내보내기 혹은 전체 백업복을 최신 버전의 SQL 서버로 보내 복구, 생성하면 됩니다.

    AWS Console에서 SQL Server를 생성할 때 "자격 증명 설정"에서 admin의 암호를 입력합니다. 그리고 퍼블릭 액세스를 "예"로 선택, VPC 보안 그룹에서는 "새로 생성"을 선택하면 자신의 PC에서만 원격접속되도록 자동 설정됩니다.

    신규 SQL Server 설정이 마무리 되었다면 다시 SCT로 돌아가 "Add Source"를 선택, Microsoft SQL Server를 선택합니다.

    연결 정보 입력란 중 Server Name에는 생성된 SQL Server의 Endpoint를 입력하시고 인스턴스 이름을 임의로 입력, 위에서 설정했던 연결 계정(admin)과 비번을 입력 후 "Connect" 버튼을 입력하면 됩니다.

    이제 타겟 소스를 설정해야 합니다. 타겟은 (당연하겠지만..) AWS RDS만 대상이 됩니다. 

    타겟 소스까지 설정했다면 이제 스키마 변환 작업을 진행합니다. 이하 과정은  공식 문서에 잘 설명되어 있어 참고 링크만 남깁니다. 이 글에 기록하려는 중요 내용은 그 이후라서 설정 과정은 간략히 남깁니다.

    • 스키마 변환 - 타겟 DB에 마이그레이션하기 위한 코드를 생성합니다. 이 단계에서는 타겟 DB에 최종 적용된 것이 아닌 로컬에 sql 코드만 작성되는 단계입니다.
    • 변환된 스키마 적용 - 타겟 DB에 최종 적용하는 단계입니다.

    이 과정이 DB 종류에 따라 순조롭게 적용될 수 있는데 저의 경우 MySQL의 Function과 Procedure의 코드 중 일부에 문제가 있어 정상적으로 진행되지 않았습니다. 문제가 된 코드를 살펴보면 아래와 같습니다.

    • MSSQL의 SP(Stored Procedure)에서는 @@Error를 사용해 원하는 곳에서 에러 처리가 가능하지만 MySQL을 에러 핸들러를 별도로 선언해야 하며, DECLARE를 코드 중간에 사용할 수 없습니다. 하지만 MSSQL을 코드를 변환하면서 코드 중간에 에러 핸들러를 선언해 에러가 발생합니다. 이 경우 에러 핸들러 코드 위치를 sp 상단으로 옮기고 로직을 이에 맞게 수정해야 합니다.
    • PIVOT, UNPIVOT, CAST, XML,@@TRANCOUNT 과 같이 미지원하는 키워드가 존재하면 Severity CRITICAL .. 이라는 키워드를 사용해 주석 처리가 되어 있으므로 해당 코드 로직들을 별도로 수정해야 합니다.
    • 함수(function)의 경우 if exists 조건을 설정할 수 없어 별도 select 를 통해 해당 함수가 존재하는지 확인 후 삭제해야 하지만 스키마 변환 시 함수들은 단순 생성 코드만 만들어집니다. 그러므로 기존에 함수가 있을 경우 에러가 발생할 수 있습니다.
    • (에러는 아니지만) NOCOUNT 옵션의 활성화 코드의 경우 삭제하면 될텐데 불필요하게 906 - Severity CRITICAL 로 주석처리하여 의미없는 주석을 생성하기 때문에 삭제해야 합니다.

    위 사항만 주의해서 처리하면 많은 시간을 절약할 수 있는 좋은 툴이라고 생각되네요. 사용하시는 분들에게 도움이 되었으면 합니다. :)

    [추가 : mssql 에서 mysql로 마이그레이션 시 참고할 내용]

    • DBCC CHECKIDENT(table_name, RESEED, 0)  >>  ALTER TABLE table_name AUTO_INCREMENT = 0;
    • XML 관련 기능은 ExtractValue로 대체할 수 있다. 단순히 컨버팅하기 보다는 JSON으로 대체하는 것을 추천.
    • 자동 정의된 SQLEXCEPTION에서 ROLLBACK 코드가 빠져 있는지 해당 SP의 로직을 점검해야 한다.

     

     

    반응형

    댓글 0

Designed by Tistory.