ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle을 MySQL로 Migration하기.
    카테고리 없음 2010. 3. 16. 15:19
    Oracle을 MySQL로 변환한다고? 흠. 이런 일은 사실 별로 없습니다. Oracle은 회사내의 기간계 시스템에서 주로 사용되므로 한번 Oracle을 사용하게 되면 단단히 lock-in이 걸리게 되서 거의 바꾸지 않습니다. 게다가 trigger와 PL/SQL, sequence와 같은 oracle-specific한 기능들을 쓰는 경우가 많아지게 되면 더 힘들죠.
    그런데 제가 하는 프로젝트에서 급히 만들어야 될 것이 있어서 RoR을 도입하는 것을 생각해 보게 되었습니다. 그래서 처음 시도는 oracle_enhanced adapter를 사용하는 것이었습니다. 그러나 왠 걸, utf8으로 된 한글을 제대로 처리하지 못하는 게 아니겠습니까? 온갖 것을 다 찾아 보아도 쉽게 되지 않더군요. database.yml에서 encoding을 없애도 보고 utf8을 넣어도 보고. 심지어 utf-8으로 넣어 보고. 해결이 되지 않더군요. 결국 이 한글 문제때문에 oracle_enhanced adapter는 포기했고 결국 oracle을 포기하게 되었습니다. 다행히 데이터량이 많지 않아서 mysql로 사용해도 괜찮을 듯 싶었고 기존 데이터를 mysql로 옮기기만 하면 되는 듯 싶었습니다.

    그래서 열심히 찾아 본 결과(저희 부서는 거의 oracle만 쓰게 때문에 oracle2mysql migration은 거의 아는 사람이 없더군요) mysql migration toolkit 을 발견하게 되었습니다. 매뉴얼을 읽어 보니 조금 괜찮은 듯 싶어서 곧장 적용을 시작했습니다. 이 mysql migration toolkit은 GUI로 되어 있어서 설정이 참 쉬운 장점이 있는데 source는 remote oracle, target도 remote mysql을 처음에 잡아 주었습니다. 테이블을 한 10개 정도만 지정하고 migration을 시작했더니 왠걸 너무 느리더군요. 찾아보니 mysql이 있는 PC에서 이 migration toolkit을 돌려야 속도가 나오고 아니면 migration agent를 설치하라고 나오네요. migration agent가 뭔지 모르기 때문에 local에 mysql을 설치하고 다시 시작했습니다.

    잘 끝나나 싶더니 이상하게 테이블의 row수가 10 ~ 90% 정도가 비는 것이었습니다. 이것때문에 몇 시간을 삽질했는지 모르겠는데... ㅜㅜ 하여튼 결론적으로 my.ini의 max_allowed_packet=1M로 설정되어 있어서 문제였습니다. 알아서 설정대로 맞추어야지 으~~~ 참 황당한 시츄에이션이더군요. 실패했을 때의 최종 로그는 다음과 같습니다.

    Packet for query is too large (1082638 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
    Packet for query is too large (1065739 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.


    결과 로그를 안 살펴 본 제가 문제였지만 my.init를 잘 살펴보고 툴이 돌아가야 user-friendly한 시스템이 아닌가 싶습니다. 공짜라서 뭐라 말을 못하겠고. 

    암튼 my.ini를 재설정해서 지금은 migration을 성공적으로 마쳤습니다. 그 다음에는 mysql dump를 떠서 원하는 remote mysql에 퍼 나르면 되므로 아주 쉬운 일이 되겠죠. 향후에 oracle2mysql migration을 수행하실 기회가 있으신 분들은 제 삽질이 도움이 되셨으면 좋겠네요.


Designed by Tistory.