1 minute read

0. MariaDB TO OracleDB

다음주 월요일날 실제 프로젝트 환경에 맞추어 테스트를 해야하기에, 오늘은 오라클db에 20억개의 데이터를 만들어야 했다..

일단 계획은 Test 서버의 MariaDB 데이터 약 5천만개를 Test 오라클db에 옮겨 이걸 duplicate 하는 방법을 생각했다.

Mysql/Mariadb에서 100만개만 넘어도 csv 파일로 만들어 직접 옮기는건 생각보다 큰 인내심을 갖게 만든다.

그렇다고 내가 만든 API는 오라클에서 Maria로 데이터를 보내는 API였기에 테스트 데이터를 만드는데 사용할 수는 없었다.

그러던중 선배의 도움으로 ETL서비스를 알게 되었다.

내가 쓴 ETL 서비스는 Talend라는 오픈소스 툴로 자바기반으로 돌아가는 툴이였다. (이클립스 기반)

GUI 식으로 편하게 사용도 가능했다. 심지어 바로바로 자바 코드까지 제공 ㄷㄷㄷ 물론 분석은 아직 안해봤다.

이걸 사용해보니 1시간정도 만에 5천만건을 모두 옮길수 있었다. 사용법도 크게 어렵지 않아 위 블로그나 다른 포스트를 찾아 사용법을 익혀 사용하면 될것 같다.

하지만 보안상의 이유로 이 ETL서비스를 실제 프로젝트에선 사용못한다고 한다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

이제 이 5천만건을 복제하여 20억건으로 만들어 테스트데이터를 모두 갖게 되었다.

duplicate 방법은 뭐 각자 입맛에 맞게 하면 되기에,,

1. OracleDB TO Maria, 문제의 시작………

이제 Test 데이터를 모두 만들었다. 오늘은 ETL툴을 공부하고, 테스트 데이터도 만들었으니 오늘은 적게 1억개만 옮겨지는걸 확인해보고 집을 갈 생각이였다…

내가 사용한 방법은 정말 1차원적인 Mybatis를 사용하는것, JPA는 편하지만 대량의 bulk insert작업엔 적합하지 못하려나??? 라는 생각에 (사실 공부하는게,,??)
무튼, Mybatis Mapping Query에 Rownum(=limit? 조금 다르지만 비슷하게 만들수 있다.) 을 주어 Offset으로 5만개씩 가져와 insert를 해주었다. 결과는 5만건당 5초 정도로 나쁘지 않은 성능이였다. 이정도면 20억건을 옮기는데 50시간이면 옮길수 있는 성능이였다.

그런데,, 뭔가 이상했다,, 천만건 이천만건이 넘어가면서 조금씩 느려졌다는 느낌을 받게 되었다.. 대략 1천만건당 1초씩 느려졌던것 같다.
하.. 1억건 원래라면 3시간정도면 모두 옮길수 있는 양이였다. 그런데 4시부터 돌린 이 프로그램이 9시가 되서야 끝이 났다.. 쿼리당 4~5초가 걸리던게 마지막엔 17초나 걸렸다.. 이 방법으론 20억개를 받으려면 얼마나 걸릴지 알수가 없는 상태였다..

모든 데이터를 뒤져 정렬을 다시 하다보니 너무 올래 걸리는것 같았다..

Offset의 성능저하를 경험한 순간이였다.. 그래서 지금 맨붕이다 이제 포스트들을 뒤지며 해결책을 찾고있지만, unique값도 없는 이곳에서 어떤식으로 문제를 해결해야 될지 고민이다.

PK index값들을 통해 SELECT을 할땐 6초로 일정했지만, 지금 PK Group의 크기는 70건,, 실제 프로젝트환경은 17만건,, 얼마나 차이가 있을지 잘 모르겠다.

아래는 몇몇 도움을 받은 글이다.
Clustering index 기법 Spring Batch, Migration, 튜닝 및 OOM 해결 후기

Categories:

Updated: