2009년 8월 25일 화요일

MySQL 리커버리

바이너리로그로 리커버리

바이너리로그를 사용하면 point in time recovery(roll forward recovery)라고도 말할 수 있는 리커버리가 가능하다.

바이너리 로그는 mysqlbinlog로 SQL문으로 변환이 가능하다.

shell$ ./bin/mysqlbinlog ./data/host-bin.000001
...
...
shell$ ./bin/mysqlbinlog ./data/host-bin.000001 | mysql -uroot


리커버리를 위한 운용
운용에 있어서 리커버리를 전제로 백업을 생각해 둘 필요가 있다.
단순한 방법은 풀 백업을 작성할 때 한번 MySQL서버를 정지시키는 것이다.
그 다음 기동후부터 바이너리로그를 리커버리에 사용하면 되기 때문이다.

MySQL서버를 정지시키지 않은 상태에서 풀 백업을 실행하고 바이너리 로그를 순환생성(rotate)하고 풀백업후의 바이너리로그 위치를 알기 위해서는 다음과 같은 SQL문을 사용하면 될 것이다.

//리커버리를 고려한 풀 백업 준비
FLUSH TABLES WITH READ LOCK;
SHOW MASTER TABLES;
FLUSH LOGS;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSATION WITH CONSISTENT SNAPSHOT;


권한테이블 이외에 모든 InnoDB의 경우 mysqldump의 다음 옵션으로 실현가능하다.

[mysqldump]
flush-logs
master-data=2
single-transaction

또, 모든 테이블이 MyISAM테이블인 경우에는 mysqldump의 다음 옵션으로 가능하다.

[mysqldump]
flush-logs
master-data=2
lock-all-tables

이것으로 풀백업을 하고 바이너리로그의 위치를 아는 것이 가능하다.
다만 local-all-tables옵션의 경우 READ 록을 건다는 것을 잊지 말길 바란다.