2년 전 퇴사를 했는데, 당시 다니던 회사에서 쓰려고 만들었던 B2B 쇼핑몰을 리뉴얼하고 싶다는 연락을 받고 지금 작업 중이다.
회사를 그만 둔 뒤 창업한 회사에서 쓰려고 바닥부터 새로 개발한 쇼핑몰 프로그램이 있었기에 그걸로 옮기기로 했다.
사실 DB는 한번도 이전을 해본 적이 없어서 어떻게 해야하나...고민을 하다가 실시간으로 기존 DB에서 데이터를 불러와서 새 DB에 insert하면 되지 않나 생각했는데, 같은 호스팅회사를 쓰고 있어도 원격 DB 접속은 지원을 하지 않아 불가능했다.
그 다음으로 생각한 것이 어차피 테이블명 등도 겹치지 않고 하니 DB를 dump해서 새 DB에 넣은 뒤 기존 테이블 데이터들을 가지고 와서 하면 되지 않을까 싶었는데, JSP를 하는 친구로부터 csv 파일을 받아서 작업을 한다는 얘기를 듣고 그렇게 시도를 해보기로 했다. (SQL문을 더 짜지 않고 이게 더 편한 것 같다.)
그런데 예전 DB나 프로그램은 모두 EUC-KR이고 현재는 UTF-8을 사용 중이다.
언어셋에서 문제를 일으킬 것 같아 사전조사를 해봤지만 쓸만한 내용이 없었다.
현재 맥에서 작업 중이기 때문에 일단 구 DB의 테이블을 csv로 다운받고(구분자는 , ), 맥의 Numbers에서 불러와 UTF-8로 다시 변환해서 저장한 파일을 가지고 작업을 진행했다.
사실 회원테이블이나 상품테이블 작업은 위와 같이 했던 것 같은데(적어도 내 기억엔...ㅠㅠ), 아무 문제없이 UTF-8로 insert가 되었는데, 주문테이블을 작업하면서 계속 몇몇 필드의 한글이 제대로 입력이 안되는 문제가 발생했다.
해결책을 찾다가 결국 윈도의 에디트플러스에서 불러와 UTF-8로 저장 후 작업하니 아무런 문제없이 모두 입력이 되었다.
csv 파일을 불러오는 루틴은 매우 간단했다.
위와 같이 한줄한줄 읽어들이면서 배열로 저장된 $data 값을 가지고 새 DB에 매칭해서 insert 해주기만 하면 끝났다.
위의 출력화면은 아래와 같다.
21개의 배열요소에 각각의 데이터들이 들어있어서 이것만 잘 매치를 시켜주면 된다.
물론 상품테이블을 작업할 때 상품코드는 switch문을 돌려 일일이 매치를 시켜주어야 했고, 그 때 그 때마다 이미지 파일들도 서버에 미리 임시폴더를 만들어 저장해 놓은 것을 새로운 프로그램의 경로에 맞게 복사를 해주었다.
98% 정도는 싱크가 완벽히 된 것 같다.
상품상세설명을 옮길 때 문제가 생겼는데, 기존 프로그램에서도 웹에디터를 사용한지라 내용이 html 소스 형태로 들어가 있는데, 이것을 그대로 insert하니 아예 HTML문법 그대로 출력이 되는 경우가 발생했다.
고민 고민하다가 아래와 같은 방법으로 했더니 해결이 되었다.
윗 줄은 csv 파일의 상품설명에 들어있는 따옴표나 겹따옴표 < > 등을 < 같은 html 엔티티로 바꿔서 저장을 하는 것이고, 아래는 저장한 상품설명 데이터를 SQL문으로 다시 불러와 디코딩을 해준 뒤 다시 SQL update를 해주었다.
남이 만든 프로그램이 아니라 내가 만들었던 프로그램인지라 정확히 기억이 나지는 않아도 대충 소스를 보면 DB구조 등도 쉽게 이해를 할 수 있어 그다지 어려움은 없었다.
지금도 계속 운영을 하고 있는 상황이기 때문에 매일매일 주문데이터가 쌓여서 어느 정도 테스트가 끝나면 한가위 때 잠시 운영을 멈추고 도메인도 옮기고 그간 새로 쌓인 데이터 등을 다시 받아 싹 옮기면 큰 문제는 없을 것 같다.
현재 주문 데이터를 매치시키는 작업을 하고 있는데, 기존에 테이블 2개에 나눠서 하나는 주문상품정보를 다른 하나는 주문자 정보 등을 각각 가지고 있어서 이 2가지를 어떻게 합쳐서 새로운 DB에 넣을지 고민 중이다.
아...머리 아포...ㅠㅠ
회사를 그만 둔 뒤 창업한 회사에서 쓰려고 바닥부터 새로 개발한 쇼핑몰 프로그램이 있었기에 그걸로 옮기기로 했다.
사실 DB는 한번도 이전을 해본 적이 없어서 어떻게 해야하나...고민을 하다가 실시간으로 기존 DB에서 데이터를 불러와서 새 DB에 insert하면 되지 않나 생각했는데, 같은 호스팅회사를 쓰고 있어도 원격 DB 접속은 지원을 하지 않아 불가능했다.
그 다음으로 생각한 것이 어차피 테이블명 등도 겹치지 않고 하니 DB를 dump해서 새 DB에 넣은 뒤 기존 테이블 데이터들을 가지고 와서 하면 되지 않을까 싶었는데, JSP를 하는 친구로부터 csv 파일을 받아서 작업을 한다는 얘기를 듣고 그렇게 시도를 해보기로 했다. (SQL문을 더 짜지 않고 이게 더 편한 것 같다.)
그런데 예전 DB나 프로그램은 모두 EUC-KR이고 현재는 UTF-8을 사용 중이다.
언어셋에서 문제를 일으킬 것 같아 사전조사를 해봤지만 쓸만한 내용이 없었다.
현재 맥에서 작업 중이기 때문에 일단 구 DB의 테이블을 csv로 다운받고(구분자는 , ), 맥의 Numbers에서 불러와 UTF-8로 다시 변환해서 저장한 파일을 가지고 작업을 진행했다.
사실 회원테이블이나 상품테이블 작업은 위와 같이 했던 것 같은데(적어도 내 기억엔...ㅠㅠ), 아무 문제없이 UTF-8로 insert가 되었는데, 주문테이블을 작업하면서 계속 몇몇 필드의 한글이 제대로 입력이 안되는 문제가 발생했다.
해결책을 찾다가 결국 윈도의 에디트플러스에서 불러와 UTF-8로 저장 후 작업하니 아무런 문제없이 모두 입력이 되었다.
csv 파일을 불러오는 루틴은 매우 간단했다.
$uploaddir = "order_info.csv";
$fp=fopen("$uploaddir","r");
while($data=fgetcsv($fp,40000,",")) {
echo "<pre>";
print_r($data);
echo "</pre>";
}
fclose($fp);
위와 같이 한줄한줄 읽어들이면서 배열로 저장된 $data 값을 가지고 새 DB에 매칭해서 insert 해주기만 하면 끝났다.
위의 출력화면은 아래와 같다.
Array
(
[0] => 20100811130915abc
[1] => a62f6569ec26b15c8a7675363b0e795c
[2] => kimkk
[3] => 626776
[4] => 60-147번지 지층
[5] =>
[6] => B
[7] => (1005-xxx-xxxxx) 예금주:홍길동
[8] =>
[9] => D
[10] => 35295
[11] => 3529
[12] => 2010. 8. 11.
[13] => NULL
[14] => NULL
[15] => abc@naver.com
[16] => 553647075
[17] => L
[18] => Y
[19] =>
[20] =>
[21] =>
)
(
[0] => 20100811130915abc
[1] => a62f6569ec26b15c8a7675363b0e795c
[2] => kimkk
[3] => 626776
[4] => 60-147번지 지층
[5] =>
[6] => B
[7] => (1005-xxx-xxxxx) 예금주:홍길동
[8] =>
[9] => D
[10] => 35295
[11] => 3529
[12] => 2010. 8. 11.
[13] => NULL
[14] => NULL
[15] => abc@naver.com
[16] => 553647075
[17] => L
[18] => Y
[19] =>
[20] =>
[21] =>
)
21개의 배열요소에 각각의 데이터들이 들어있어서 이것만 잘 매치를 시켜주면 된다.
물론 상품테이블을 작업할 때 상품코드는 switch문을 돌려 일일이 매치를 시켜주어야 했고, 그 때 그 때마다 이미지 파일들도 서버에 미리 임시폴더를 만들어 저장해 놓은 것을 새로운 프로그램의 경로에 맞게 복사를 해주었다.
98% 정도는 싱크가 완벽히 된 것 같다.
상품상세설명을 옮길 때 문제가 생겼는데, 기존 프로그램에서도 웹에디터를 사용한지라 내용이 html 소스 형태로 들어가 있는데, 이것을 그대로 insert하니 아예 HTML문법 그대로 출력이 되는 경우가 발생했다.
고민 고민하다가 아래와 같은 방법으로 했더니 해결이 되었다.
$contents = htmlspecialchars($data['16'], ENT_QUOTES);
... [새 DB에 insert] ...
... [새 DB에서 다시 상품 설명을 불러옴] ...
$decoded = html_entity_decode($row2['contents']);
... [새 DB에 다시 update] ...
... [새 DB에 insert] ...
... [새 DB에서 다시 상품 설명을 불러옴] ...
$decoded = html_entity_decode($row2['contents']);
... [새 DB에 다시 update] ...
윗 줄은 csv 파일의 상품설명에 들어있는 따옴표나 겹따옴표 < > 등을 < 같은 html 엔티티로 바꿔서 저장을 하는 것이고, 아래는 저장한 상품설명 데이터를 SQL문으로 다시 불러와 디코딩을 해준 뒤 다시 SQL update를 해주었다.
남이 만든 프로그램이 아니라 내가 만들었던 프로그램인지라 정확히 기억이 나지는 않아도 대충 소스를 보면 DB구조 등도 쉽게 이해를 할 수 있어 그다지 어려움은 없었다.
지금도 계속 운영을 하고 있는 상황이기 때문에 매일매일 주문데이터가 쌓여서 어느 정도 테스트가 끝나면 한가위 때 잠시 운영을 멈추고 도메인도 옮기고 그간 새로 쌓인 데이터 등을 다시 받아 싹 옮기면 큰 문제는 없을 것 같다.
현재 주문 데이터를 매치시키는 작업을 하고 있는데, 기존에 테이블 2개에 나눠서 하나는 주문상품정보를 다른 하나는 주문자 정보 등을 각각 가지고 있어서 이 2가지를 어떻게 합쳐서 새로운 DB에 넣을지 고민 중이다.
아...머리 아포...ㅠㅠ
'PHP > MySQL' 카테고리의 다른 글
로컬에서 MySQL 한글이 깨질 때 (0) | 2016.02.29 |
---|---|
테이블 내 특정 문자열 한꺼번에 바꾸기 - REPLACE (0) | 2009.09.13 |
SQL now() 사용하기 (0) | 2009.01.29 |
mySQL 패스워드 변경하기 (0) | 2008.11.12 |
mySQL에서 자주 쓰이는 함수 정리 (0) | 2008.11.11 |