[MySQL to Oracle] MySQL에서 오라클19C로 데이터베이스 마이그레이션

leeng·2024년 6월 18일
0

database

목록 보기
1/1

운영 중인 시스템에서 데이터베이스를 MySQL에서 Oracle 19c로 변경하게 되면서 데이터를 마이그레이션해야했다. 마이그레이션하면서 에러들도 많이 만나고 마이그레이션 후에 확인해야하는 것들도 너무나 많아서 고생했다... 그래서 또 다른 누군가는 시행착오를 덜 겪길 바라면서 마이그레이션 과정을 적어보게 되었다.
다만 중간에 오라클 버전을 바뀔뻔한 적이 있어서 19c로 작업 -> 12c로 작업 -> 19c로 작업을 했었는데, 그 때마다 조금씩 다른 이슈들이 있었기에 아마 이 글이 모든 걸 다 커버할 수는 없을 거라는 생각이 든다. 버전이나 에디션에 따른 차이가 조금씩 있는 것 같았다.
그래도 처음 작업하시는 분들에게는 참고가 되길 바라면서 적어보겠습니다.

1. SQL Developer 다운로드 및 설치

https://www.oracle.com/database/sqldeveloper/technologies/download/
위 페이지에서 OS와 JDK에 맞는 SQL Developer를 다운로드 받은 후 설치한다.

2. MySQL, 오라클(시스템 계정) 접속 생성

MySQL과 오라클 각각 접속한다. 그러면 위 그림과 같이 오라클과 MySQL 접속이 생성된다.
오라클은 계정 생성 및 권한 부여가 가능한 계정(시스템 계정)으로 접속하여야한다. 데이터를 이전할 MySQL의 데이터베이스 명과 동일한 계정을 생성해 줘야하기 때문이다.

3. 오라클 계정(스키마) 생성

여러 번의 시행착오를 겪어보고 깨달은 것은.. MySQL에서 오라클로 마이그레이션할 때 무조건 MySQL의 데이터베이스 명과 동일한 오라클의 스키마로 데이터가 이전된다. 다른 이름의 스키마로 억지로 넣는 방법이 없는 것 같았다(혹시 아신다면 알려주세요..).
예를 들어서 이전하려는 MySQL의 데이터베이스 명이 'testuser'라면 아래와 같이 생성하면 된다.

DROP USER testuser CASCADE; -- 혹시라도 이미 존재할 경우 DROP

CREATE USER testuser IDENTIFIED BY password; -- 계정 생성

GRANT CONNECT, RESOURCE TO infant; 
GRANT DBA TO testuser; -- 'ORA-01400 NULL을 ("스키마명"."MD_PROJECTS"."ID") 안에 삽입할 수 없습니다' 에러가 발생할 경우 DBA 권한 부여

ALTER USER testuser DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS; -- 'ORA-01950 테이블스페이스 'USERS'에 대한 권한이 없습니다' 에러가 발생할 경우 TABLESPACE 부여

이전에 데이터 마이그레이션 테스트를 했을 때는 저런 에러가 발생한 적이 없었는데 이번에는 일반 계정을 생성한 후에 데이터 이전을 하려고 하는 경우 4-2번의 저장소를 설치할 때 에러가 발생했다. 에러를 무시하려고 마이그레이션하려고 할 경우 ORA-01400 에러와 ORA-01950 에러가 발생했다. 위와 같이 DBA 권한테이블스페이스를 주니 해결되었다. (이미 저장소를 설치하던 중에 에러가 발생한 경우라면 계정 DROP 후 다시 계정 생성해서 권한과 테이블 스페이스 부여해야함)

생성한 계정으로 접속한 후 이제 본격적으로 마이그레이션을 진행해보자.

4. 데이터 마이그레이션

1) 이전하려는 MySQL의 데이터베이스를 선택한 후 Oracle로 이전... 버튼을 클릭한다.

2) 저장소를 선택한다. 데이터를 옮기려고 하는 대상 오라클 접속을 선택하면 된다. (위에 예시로 보면 오라클 testuser 계정으로 접속한 다음 해당 접속을 선택하면 된다)

그러면 아래와 같이 저장소 설치 중이 뜨게 된다.

3) 프로젝트 관련 로그가 생성되는 경로 선택

4) 이전하려는 데이터베이스 접속 선택

5) 이전하려는 데이터베이스 선택

6) 데이터 타입이 일치하지 않는 것들이 있어서 어떻게 변환할지 선택해줘야한다.

이런 식으로 콤보 박스에서 선택해서 변환할 수도 있고

규칙 편집을 통해 더 세밀하게 변환할 수도 있다.

적절한 데이터 타입으로 변환해주면 되는데 본인의 경우에는 BINARY -> RAW(16), TIME -> DATE or TIMESTAMP, BIT(1) -> NUMBER(1,0) , DATETIME -> TIMESTAMP(그런데 DATE 타입까지 TIMESTAMP로 바꿔줘야 DATETIME 타입의 데이터들이 TIMESTAMP로 변경되는 이슈가 있었어서 DATE 타입도 TIMESTAMP로 변경한 후 데이터 이전이 완료된 다음 다시 오라클의 DATE 타입으로 바꿔주었다.)
여러 번 테스트해본 후 각자 상황에 맞게 변환해주면 될 것 같다.

7) 변환할 SQL 객체를 선택

그런데 선택해도... 어차피 마이그레이션 안되더라...

8) 대상 데이터베이스 선택

이 이후부터는 그냥 쭉쭉 다음 버튼을 클릭해주면 된다.

9) 데이터베이스 이전 진행

데이터베이스 이전이 진행된다. 생각보다 꽤 걸린다. 내가 마이그레이션하려는 데이터베이스는 그다지 용량이 크지 않은 편이었는데도 20분 넘게 걸렸던 것 같다.

5. 데이터 마이그레이션 완료 후 정상적으로 이전되었는지 확인

드디어 데이터베이스 마이그레이션 완료!... 가 아니라 데이터가 정상적으로 이전되었는지 꼭꼭 확인해줘야한다.

1) 이전되지 않은 테이블 복사
이상하게 꼭 테이블 몇 개는 이전이 되지 않았다. 이전되지 않는 테이블들은 수동으로 이전해준다.
MySQL의 데이터베이스의 테이블을 선택해서 Oracle에 복사..를 클릭한 후 확인을 눌러주면 된다.

2) 컬럼명 확인

간혹 'SIZE'나 'DATE'와 같이 오라클에서 사용할 수 없는 컬럼명은 _SIZE, _DATE처럼 오라클이 를 붙여서 이전해준다.

FILE_SIZE나 START_DATE처럼 다른 컬럼명으로 변경해준다. 이론적으로는 새로운 컬럼 생성 후 데이터를 옮기고 기존 컬럼 삭제하면 될 것 같은데 컬럼명 자체가 유효하지 않아서인지 SQL 오류가 발생한다.
다행히 SQLDeveloper에서 컬럼명 변경이 가능하다.

테이블을 더블 클릭한 후 우측 상단의 연필모양 아이콘을 클릭하면 테이블 편집 창이 뜨는데, 여기서 원하는 컬럼명으로 변경한 후 확인 버튼을 눌러주면 된다.

3) 제약조건 확인

그리고 PK, FK, UK, 인덱스, default, not null 제약조건 같은 것들도 제대로 이전이 되었는지 확인해줘야한다. 인덱스나 제약조건이 제대로 이전이 되지 않은 경우에는 수동으로 설정해주면 된다.
MySQL과 Oracle 둘 다 제약조건이나 인덱스와 같은 메타데이터를 조회할 수 있으니 조회한 후 비교해보면 좋을 것 같다.
아래는 PK와 FK를 수동으로 설정하는 예시이다.

ALTER TABLE A_post
ADD CONSTRAINT PRIMARY_38 PRIMARY KEY (id);

ALTER TABLE A_post
ADD CONSTRAINT FKovd5whm50u6h0m0olygova4rg
FOREIGN KEY (id)
REFERENCES B_post(id);

4) Function 추가
SQL Function(만약 트리거나 프로시저가 있다면 아마 이 것들도 안 옮겨지지 싶다)도 이전이 안되는 것 같다. 수작업으로 추가해주자

5) Migration 관련 테이블 삭제
그리고 마이그레이션 과정에서 아래처럼 요상한 테이블들이 생성되는데, 작업이 끝난 후 전부 삭제해주면 된다. (view랑 Materialized View도 생성된다 ㅠㅠ 전부 지워주자....)

참고로 이 작업은 디비버로 하면 훨씬 편하다! 디비버에서는 GUI로 테이블 여러 개를 한번에 지울 수 있다.

SQL만 날릴 줄 알았지 데이터베이스에 대해 그렇게 잘 알지 못하는 상태에서 마이그레이션을 하려니 너무 힘들었다. 그래도 여러 번 반복해서 작업하면서 점점 데이터베이스에 대한 이해도 할 수 있었고 많이 배울 수 있었다. 좋은 경험이었다고 생각한다!

profile
기술블로그보다는 기록블로그

0개의 댓글