-1. Flashback 기능이란
인스턴스, 특정 DB, 특정 테이블들을 특정 과거 시점으로 되돌릴 수 있는 기능.
MariaDB 10.2.4 에서 DML only (Insert,Delete,Update) 로 flashback 기능이 추가되었으며 향후에 DDL ( Drop, Truncate, Alter 등) 이 기능도 지원할 예정임
오라클의 flashback이 undo 등이 필요하다면 Ma면iaDB에선 해당 트랜잭션 로그가 있는 binary log가 필수로 있어야함
=> 10.2.12 stable version에서도 수행 가능 확인
*주의사항 : Flashback을 수행할 때 Flashback event들은 메모리에 저장되므로 수행 전 충분한 메모리가 있는지 확인해야함
-2. 10.2 아래 버전에서 수행 결과 (10.1.24 version)
=> mysqlbinlog 명령어가 flashback 관련 명령어를 인지 못함
[ip-172-31-13-44:masvc01]/logs001/masvc01/TEST/binary] mysqlbinlog /logs001/masvc01/TEST/binary/mysql-bin.000023 -vv -d test -T test --start-position=1596 --flashback > flashback.sql
mysqlbinlog: unknown option '-T'
[ip-172-31-13-44:masvc01]/logs001/masvc01/TEST/binary] mysqlbinlog flashback
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
mysqlbinlog: File 'flashback' not found (Errcode: 2 "No such file or directory")
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
-3. Flashback 수행 테스트
=> 두 테이블 중 test 테이블만 update 전으로 복구하는 시나리오
MariaDB [(none)]> select * from test.test;
+------+
| num |
+------+
| 2 |
| 2 |
| 2 |
| 1 |
| 1 |
| 1 |
+------+
6 rows in set (0.00 sec)
MariaDB [(none)]> select * from test.test2;
+------+
| num |
+------+
| 20 |
| 20 |
| 20 |
| 10 |
| 10 |
| 10 |
+------+
6 rows in set (0.00 sec)
--- 두 테이블 모두 업데이트
MariaDB [(none)]> select * from test.test;
+------+
| num |
+------+
| 5 |
| 5 |
| 5 |
| 5 |
| 5 |
| 5 |
+------+
6 rows in set (0.00 sec)
MariaDB [(none)]> select * from test.test2;
+------+
| num |
+------+
| 30 |
| 30 |
| 30 |
| 30 |
| 30 |
| 30 |
+------+
6 rows in set (0.00 sec)
--- test 테이블만 flashback 통해 복구
위 트랜잭션이 기록 된 binary log 파일에서 복구 시점
start position 과 stop position을 찾은 뒤 아래 커맨드 수행 (OS 커맨드로)
[ip-172-31-13-44:masvc01] mysqlbinlog mysql-bin.000003 -vv -d test -T test --start-position=611 --stop-position=2046 --flashback > flashback.sql
1) -vv : -verbose 와 같은 명령어로 flashback.sql을 이해가능한 형태로 출력
2) -d : 복구 테이블이 속한 db명
3) -T : 복구 테이블
4) --start-position : 복구 시점 start position
5) --stop-position : 복구가 종료될 stop position
6) --flashback : flashback 명령어
[ip-172-31-13-44:masvc01] mysql -uroot -p -D test <flashback.sql
-4. 결과 확인
=> 두 테이블 중 test 테이블만 복구된 것 확인
MariaDB [(none)]> select * from test.test;
+------+
| num |
+------+
| 2 |
| 2 |
| 2 |
| 1 |
| 1 |
| 1 |
+------+
6 rows in set (0.00 sec)
MariaDB [(none)]> select * from test.test2;
+------+
| num |
+------+
| 30 |
| 30 |
| 30 |
| 30 |
| 30 |
| 30 |
+------+
6 rows in set (0.00 sec)