2016년에 작업했던 기록 저장용
oracle > mysql 과 같이 이기종간 마이그레이션은 지원하는 몇가지 툴이 있는것으로 알고있다.
사실 아는건 이것 뿐이지만…
test를 해보니까 생각보다 너무느렸다.
서비스하는 회사에서 보통 주어지는 시간은 6시간 남짓이다. (이것도 내경험상 00시 ~ 06시)
예전에 oracle DBA로 일했었는데.
그 때 동기종 migration는 꽤 자주 했다.
물론 거의 대부분 export / import를 이용해서 했는데.
sqlldr을 이용해서 해봤는데 속도가 괜찮아서 mysql 에 동일한 명령어가 있는지 찾아봤다.
mysql LOAD DATA
를 사용하기로 했다.
LOAD DATA
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
Oracle에서의 작업
LOAD DATA는 특정 구분자로 되어있는 file을 insert를 반복하는 작업이다.
그러기 위해선 Table을 먼저 만들어야 했다.
Table 생성
- Oracle 의 Table create script를 가져와서 아래 2가지 타입에 대해 변경 작업
- NUMBER TYPE -> INT TYPE
- VARCHAR2 TYPE -> VARCHAR TYPE
- 다른 TYPE도 확인해봐야한다. 내가 작업하는 DB는 저정도만 신경쓰면 됬다.
- 참고로 나는 java test case로 table 생성 스크립트를 가져와서 type 변환하는 코드를 만들었었다.
쿼리생성
- select 절을 만들어 보자. (oracle 기준이다.)
- Delimiter는
|
를 사용했다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19SELECT ltrim(sys_connect_by_path(column_name, '||''|''||'), '||''|''||') column_name
FROM (
SELECT
column_name,
row_number()
OVER (PARTITION BY num
ORDER BY num) rn,
count(0)
OVER (PARTITION BY num) cnt
FROM (
SELECT
column_name,
1 num
FROM cols
WHERE table_name = 'TABLE_NAME'
ORDER BY column_id))
WHERE level = cnt
START WITH rn = 1
CONNECT BY PRIOR cnt = cnt AND PRIOR rn = rn - 1;
생성한 쿼리로 데이터 추출
1 | SQL> set line 200 |
추출된 데이터 전송
scp를 통해서 전송했었다.
참고로 나는 IDC경로가 달라서 로컬에 받은 후 이관하려는 서버로 scp전송했다.
mysql에서의 작업
위 oracle 에서의 작업에서 table 생성 스크립트로 mysql에 table 생성이 되어있어야한다.
Character Set 변경
테스트 해보니 한글이 깨지는 경우가 있어서 변경 해줘야 하는 것 같다.
1 | iconv -c -f euc-kr -t utf-8 test.txt > test-utf8.txt |
데이터 import
1 | mysql>use theater; |