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)