풀백업본+binary log 후 ibd 파일 import 시키는 평범한 복구 작업이지만
10.2.x 버전 이상부터 사용할 수 있는 새로운 기능을 적용하여 복구해보았습니다.
이전 버전에서 시점 복구를 위해 전체 binary log를 적용하는 것은 시간이 엄청나게 소요되지만
이번과 같이 특정 테이블만 복구하는 작업을 새로운 기능을 활용하면 시간을 훨씬 단축시킬 수 있습니다.
* flashback 기능을 사용해도 되나 flashback 덤프파일 생성 과정에서 파일시스템 이슈로 활용 못했습니다
가능하면 flashback이 훨씬 간편합니다!!
https://sarc.io/index.php/mariadb/1114-maria-db-flashback
-1. 데이터 유실 시나리오
-. Master - Slave replication 구성된 DB에서 특정 테이블 데이터 유실 발생
-. update 쿼리 수행 직전인 16일 16:30분 시점으로 해당 테이블만 복구 필요하며 서비스 다운 타임 확보 불가
-2. 복구 시나리오
서비스 다운 타임 확보가 불가하므로
full 백업본 + binary log 로 slave db에 복구 후 slave db의 복구된 테이블 ibd 파일을 master db에 import 시키는 시나리오
10.2.x 버전부터 신규 추가된 mysqlbinlog -T 옵션 (테이블 지정)으로 binary-log에서 해당 테이블의 트랜잭션만 추출하여 반영할 것
* 10.2.x 버전의 flashback 기능을 사용하려 했으나 파일시스템 이슈로 수행 하지 못함
-3. 백업본 파악
[TESTSERVER:testuser]/bkup001/testuser/TESTDB/full_backup] ls -ltr 2018-08-13_09-18-31.tar -rw-r--r-- 1 testuser mysql 141202135040 Aug 13 11:34 2018-08-13_09-18-31.tar -rw-rw---- 1 testuser mysql 536903639 Aug 13 13:07 mysql-bin.000254 -rw-rw---- 1 testuser mysql 570654509 Aug 13 21:01 mysql-bin.000255 -rw-rw---- 1 testuser mysql 536873170 Aug 14 03:12 mysql-bin.000256 -rw-rw---- 1 testuser mysql 536875703 Aug 14 09:11 mysql-bin.000257 -rw-rw---- 1 testuser mysql 538306758 Aug 14 17:31 mysql-bin.000258 -rw-rw---- 1 testuser mysql 537593765 Aug 15 03:03 mysql-bin.000259 -rw-rw---- 1 testuser mysql 545101104 Aug 15 13:01 mysql-bin.000260 -rw-rw---- 1 testuser mysql 562316890 Aug 16 02:36 mysql-bin.000261 -rw-rw---- 1 testuser mysql 537237700 Aug 16 11:57 mysql-bin.000262 -rw-rw---- 1 testuser mysql 536871477 Aug 16 14:00 mysql-bin.000263 -rw-rw---- 1 testuser mysql 10440218116 Aug 16 18:05 mysql-bin.000264 -rw-rw---- 1 testuser mysql 799 Aug 16 18:05 mysql-bin.index -rw-rw---- 1 testuser mysql 27072847 Aug 16 18:30 mysql-bin.000265
=> 8/13일 09시 18분 풀백업본과 그 이후의 binary log 백업본 존재
특정테이블 하나만 8/16일 16시 30분 시점으로 복구 요청
-4. slave DB 복구 작업
1) 풀백업본 복구
innobackupex --defaults-file=my.cnf --copy-back ./2018-08-13_09-18-31
2) binary log에서 해당테이블 로그만 추출
mysqlbinlog mysql-bin.000254 -d test -T tb_test --start-datetime="2018-08-13 09:18:31" >recover_1.sql mysqlbinlog mysql-bin.000255 -d test -T tb_test > recover_2.sql . . . mysqlbinlog mysql-bin.000264 -d test -T tb_test --stop-datetime="2018-08-16 16:30:00" >recover_last.sql
3) 2번의 덤프파일 적용
mysql -uroot -p < recover_1.sql . . mysql -uroot -p < recover_last.sql
-5. master DB 복구 작업
1) master에서 tb_test의 복구 테이블 생성
create table test.tb_test_bk like test.tb_test;
2) master의 tb_test_bk 테이블과 slave의 복구 완료된 테이블 교체
alter table test.tb_test_bk discard tablespace; scp로 slave db 서버의 tb_test.ibd 파일 master서버로 전송 -> tb_test_bk로 rename 후 alter table test.tb_test_bk import tablespace;