레이블이 recovery인 게시물을 표시합니다. 모든 게시물 표시
레이블이 recovery인 게시물을 표시합니다. 모든 게시물 표시

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 록을 건다는 것을 잊지 말길 바란다.