flashback 소개 이전 글

https://sarc.io/index.php/mariadb/1114-maria-db-flashback

 

데이터를 이전 시간으로 돌리기 위해서는 binary log들을 flashback 덤프파일로 생성해야 합니다.

데이터 유실이 발생하여 한시바삐 복구해야 하는 상황에서 이전에 경험했던 복구 시나리오와 달리 덤프파일로 떨궈야 할

binary log가 여러개가 되자 순서를 어떤 것 부터 적용해야 하는지 몹시 당황했던 경험이 있어 정리하고자 글을 남깁니다.

정말 당연하고도 바보같은 내용입니다.

 
 
create table test.tb_flashback
(
num1 int,
num2 int
)engine=innodb;

flush binary logs;

=> test 용 테이블 생성 후 binary log flush 하여 새로운 binary log 생성
 
 
-. Transaction 1 -> Insert
insert into test.tb_flashback values (1,1);
insert into test.tb_flashback values (2,2);
insert into test.tb_flashback values (3,3);
insert into test.tb_flashback values (4,4);
insert into test.tb_flashback values (5,5);
commit;

flush binary logs;
 
MariaDB [(none)]> select * from test.tb_flashback;
+------+------+
| num1 | num2 |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
|    4 |    4 |
|    5 |    5 |
+------+------+
5 rows in set (0.00 sec)
 
-. Transaction 2 -> Delete
 
delete from test.tb_flashback where num1 between 3 and 5;
commit;

flush binary logs;
 
select * from test.tb_flashback;
MariaDB [(none)]> select * from test.tb_flashback;
+------+------+
| num1 | num2 |
+------+------+
|    1 |    1 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)
 
-. Transaction 3 -> Update
 
update test.tb_flashback set num1=100;
commit;

flush binary logs;
 
select * from test.tb_flashback;
MariaDB [(none)]> select * from test.tb_flashback;
+------+------+
| num1 | num2 |
+------+------+
|  100 |    1 |
|  100 |    2 |
+------+------+
2 rows in set (0.00 sec)
 
=> 이걸 맨 처음상태로 돌리려면??
 
-. Flashback 덤프파일 생성
 
mysqlbinlog mysql-bin.000021 -vv -d test -T tb_flashback --flashback > flashback_insert.sql
mysqlbinlog mysql-bin.000022 -vv -d test -T tb_flashback --flashback > flashback_delete.sql
mysqlbinlog mysql-bin.000023 -vv -d test -T tb_flashback --flashback > flashback_update.sql
mysql -uroot -p -D test < flashback_insert.sql
Enter password:
ERROR 1032 (HY000) at line 26: Can't find record in 'tb_flashback'
 
=> 제일 먼저 발생한 트랜잭션으로 flashback 하려니 현재 tb_flashback 의 데이터와 flashback_insert.sql 이 맞지않아 에러 발생
 
mysql -uroot -p -D test < flashback_update.sql
Enter password:

MariaDB [(none)]> select * from test.tb_flashback;
+------+------+
| num1 | num2 |
+------+------+
|    1 |    1 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)
 
=> 가장 최근에 발생한 트랜잭션부터 flashback 반영해야함
 
[ip-172-31-13-44:masvc01]/logs001/masvc01/TEST_10.2.4/binary] mysql -uroot -p -D test < flashback_delete.sql
Enter password:
MariaDB [(none)]> select * from test.tb_flashback;
+------+------+
| num1 | num2 |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    5 |    5 |
|    4 |    4 |
|    3 |    3 |
+------+------+
5 rows in set (0.00 sec)

[ip-172-31-13-44:masvc01]/logs001/masvc01/TEST_10.2.4/binary] mysql -uroot -p -D test < flashback_insert.sql
Enter password:
MariaDB [(none)]> select * from test.tb_flashback;
Empty set (0.00 sec)