2009년 8월 18일 화요일

mysqldump를 이용한 백업

mysqldump는 논리 백업이다.

SQL문으로 데이터 내용을 얻는 것이 가능하다. 그렇지만 차분만 백업하는 것을 불가능하다.

사용방법은 다음과 같다.

mysqldump 옵션 데이터베이스명 [테이블명 [테이블명...] ]
mysqldump 옵션 --databases 데이터베이스명 [데이터베이스명..]
mysqldump 옵션 --all-databases

mysqldump는 my.cnf 의 [mysqldump] 그룹과 [client]그룹 설정을 읽어들인다.
옵션을 생략했을 경우는 다음과 같은 옵션이 지정된 것과 똑같다.

--opt --comments --tz-utc --set-charset --triggers

mysqldump와 데이터의 일관성
--single-transaction옵션은 InnoDB에 대해서 유효하다. 이 옵션은 다음 SQL를 실행한다.

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION WITH CONSISTENT SNAPSHOT;

이것으로 백업하는 모든 테이블이 InnoDB이면 데이터 일관성이 보증된다.
--master-data=2 옵션을 추가하면 바이너리 위치도 모순없이 기록된다.

InnoDB이외의 테이블 타입의 경우 일관성을 보증하고 싶다면 --lock-all-tables를 지정해서 테이블이 갱신되지 않게 록을 걸어 두어야 한다.

mysqldump와 캐릿터셋, 바이너리 데이터
mysqldump의 표준 캐릭터셋은 utf8이다.
만약 테이블 캐릭터셋이 utf8이 아니고 mysqldump에 --default-character-set=옵션을 지정하지 않으면 데이터의 문자코드 변환이 발생한다.

그러면 소실 혹은 다른 문자로 변환될 가능성이 있다. mysqldump를 사용할 때는 반드시 위 옵션을 지정해야한다.

데이터에 바이너리 컬럼이 포함되는 경우도 주의해야한다.
바이너리 컬럼이 포함되어있는 경우에는 다음과 같은 옵션을 지정한다.

--hex-blob

이것은 BLOB, BINARY필드값을 0xABCD같이 HEX리터널로 출력한다.
HEX리터널이기 때문에 리스토어할 때에 파괴될 걱정이 없어진다.

캐릭터셋은 데이터베이스 단위로 통일 시켜두는 게 좋다. 예를 들어 테이블 단위에 캐릭터셋을 변경한 경우 mysqldump를 실행해서 데이터베이스를 백업하면 다른 캐릭터셋이 혼재되어 출력된다.
SET NAMES의 구현은 불완전하기 때문에 안이하게 신용할 수도 없다.
따라서 캐릭터셋은 테이블 단위나 필드단위로 변경하지 않는 것이 좋다.