Programming/Database

Windows에 설치된 Mysql 자료를 Linux로 옮기기

minarae7 2013. 3. 21. 15:29
728x90
반응형

뻘짓을 계속하다가 기록을 남겨놓기 위해서 글을 남긴다.


상황은 다음과 같다.


  • Windows에 Mysql 4 버전이 설치되어 있고 Default-Character-Set은 latin1으로 되어 있음
  • Linux Mysql 5 버전이 설치되어 있고 Default-Character-Set은 UTF-8임
  • Windows 머신 한 대와 MacBook Pro를 통해서 작업을 진행함.

일단 자료를 백업받아야 한다.

윈도우즈의 콘솔을 열어서 그냥 mysqldump를 실행하니 온갖 한글이 다 깨져서 저장된다. 그래서 구글링을 해본 결과 다음과 같은 명령어를 통해서 덤프를 떠야한다.

mysqldump --default-character-set=latin1 -u유저아이디 -p 데이터베이스이름 > 저장할 파일이름


Character-set을 latin1으로 지정했더니 이번에는 한글이 정상적으로 아주 잘 나온다!!


여기까지 성공!!!


이제 파일을 리눅스 서버에 복사해두고 mysql을 통해서 데이터베이스에 데이터를 옮겨놓았다


그런데 헐!!!


입력된 데이터들이 다 깨져있는 상황!!!뭥미ㅠㅠㅠㅠ


윈도우즈에서 생성된 덤프 파일의 encoding은 euc-kr이고 mysql이 설치된 리눅스 서버의 encoding은 UTF-8이다!!


그래서 iconv를 통해서 euc-kr의 encoding을 utf-8로 변환하였다.

iconv -f euc-kr -t utf-8 SourceFile > TargetFile

여기서 또 다시 난관에 봉착!!!


깨진 파일의 내용이 있을 경우에는 iconv가 돌다가 죽어버린다.


그래서 -c 옵션을 주어서 깨진 문자는 패스하도록 했다.


그러면 제대로 인코딩은 바뀌지만 정상적으로 바뀌지는 않는다.


한글의 오타 '읻옹' 이런 글자는 변환이 안되는 것이다.


그래서 간단하게 php 스크립트를 만들어서 이런 문자들까지 잘 처리될 수 있도록 코드를 만들었다.


참고로 PHP에서는 multibyte character set에 대한 인코딩을 지원해주는 함수가 있다. 이 함수를 이용하여서 encoding 변환.


코드는 다음과 같다.

<?php
$f = fopen( "원본파일", "r" );
$f2 = fopen( "저장할파일", "w" );

$bs = 1024*1024*1024; //버퍼사이즈
while( $content = fread( $f, $bs ) )
{
	$encoder = mb_convert_encoding( $content, "UTF-8", "EUC-KR" );
	fwrite( $f2, $encoder );
}

fclose( $f );
fclose( $f2 );
?>

이제 UTF-8로 변환은 끝!!!


다시 한번 시도!!


BUT!!! 역시 인코딩이 깨진다...ㅠㅠㅠㅠㅠ


그럼 이번에는 다른 방법으로 시도~


일단 스키마와 데이터를 따로따로 분리하여 덤프를 뜬다. 전체 용량이 700MB 정도 되었기 때문에 분리하여 작업하는 것이 에디터도 가볍게 쓸 수 있고 여러모로 편리하다.


스키마는 이렇게

mysqldump --default-character-set=latin1 -d(혹은 --no-data) -u유저아이디 -p 데이터베이스이름 > 저장할 파일이름

데이터는 이렇게

mysqldump --default-character-set=latin1 --opt --extended-insert -t(혹은 --no-create-info) -u유저아이디 -p 데이터베이스이름 > 저장할 파일이름

원래는 이렇게만 하려고 했는데 테이블별로 따로 추려서 작업하려고 데이터베이스 이름 뒤에 테이블 이름을 줘서 테이블별로 데이터를 추출~


최종적으로 사용한 명령어

mysqldump --default-character-set=latin1 --opt --extended-insert -t(혹은 --no-create-info) -u유저아이디 -p 데이터베이스이름 테이블이름 > 저장할 파일이름

이렇게 해서 테이블별로 덤프를 뜨는데 성공!!


이제 윈도우 머신과 맥 머신으로 파일을 복사합니다.


맥에서는 Sequel Pro라는 mysql client를 사용한다. 물론 무료!!!


그리고 윈도우즈에서는 SQLyog를 사용하고 에디터로 UltraEdit를 사용하였다.


일단 기본적으로는 Sequel Pro를 통해서 작업한다. 한글이 없는 덤프파일을 아주 정상적으로 잘 작동한다. 그런데 insert 쿼리에 이상이 있으면 편집하기가 아주 불편하다는 단점!!


이 때 사용한 것이 UltraEdit.


쿼리 한 줄씩 복사해서 수정한다. 대체로 '(작은따옴표) 빠진 것이다. 잘못 입력되었거나 필드의 길이보다 긴 문자를 입력한 경우 마지막의 '가 깨지는 현상이다. mysql 4버전에서 생기는 버그인 듯.


그래서 편집기에서 바꾸기 기능을 통해서 '를 붙여놓기 한다. 이건 알아서~


기본적으로 Sequel Pro에서 덤프 파일을 import하는 기능을 사용하고 에러가 발생하는 경우 덤프 파일을 열어서 SQLyog에 쿼리를 복사해 놓는 방식으로 파일을 입력.


이렇게해서 작업을 완료.


Tip.1

혹시 몰라서 임시로 데이터베이스를 생성하여 여기에 덤프된 파일을 테스트로 놓었다. 모두가 정상적으로 입력이 되었다고 생각되어서 이제 테이블을 복사해 간다. 다음 쿼리 참조

create table 생성할 테이블 이름
as
select * from 원본 데이터베이스.원본 테이블 이름

728x90
반응형

'Programming > Database' 카테고리의 다른 글

howto switch from mariadb to mysql in ubuntu 12.04  (0) 2014.12.18
pgsql sequence 초기화  (0) 2014.07.07