풀백업본+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;

 

-6. 복구 완료