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

지난 번 위 글에서 살펴보았듯 mariadb 10.2.x 버전부터는 flashback 을 지원합니다.

그러나 mysql 은 8.0 버전이 되어서도 아직 flashback 기능을 지원하지 않고 있는데 

이번 글에서 mysql 에서도 mariadb 의 flashback 을 사용하는 방법을 소개드리겠습니다. ( mysql version 5.7이상부터 가능 , 5.6이하로는 안됨)

 

-1. mysql 5.7 version 의 mysqlbinlog 확인

root@3f8a5a300f38:/# mysqlbinlog --version
mysqlbinlog Ver 3.4 for Linux at x86_64
root@3f8a5a300f38:/# mysqlbinlog | grep flashback
root@3f8a5a300f38:/#

=> 5.7 version 의 mysqlbinlog 에는 flashback 기능이 없음

 

-2. mariadb의 mysqlbinlog 로 교체

dori:dockers mac$ docker cp mysqlbinlog 3f:/usr/bin/mysqlbinlog
dori:dockers mac$ docker exec -it 3f /bin/bash

root@3f8a5a300f38:/# mysqlbinlog --version
mysqlbinlog Ver 3.4 for Linux at x86_64

root@3f8a5a300f38:/# mysqlbinlog | grep flashback
  -B, --flashback     Flashback feature can rollback you committed data to a
flashback                         FALSE
root@3f8a5a300f38:/#

=> 미리 준비한 mariadb 10.2.x 버전의 mysqlbinlog 를 mysql의 mysqlbinlog 와 교체함

flashback 기능 확인

 

-3. Flashback TEST

mysql> insert into test.test value(1);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test.test value(2);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test.test value(3);
Query OK, 1 row affected (0.01 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> update test.test set num=1000;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test.test;
+------+
| num  |
+------+
| 1000 |
| 1000 |
| 1000 |
+------+
3 rows in set (0.00 sec)

 

 

#190703 12:07:37 server id 1  end_log_pos 123 CRC32 0x89bdd996  Start: binlog v 4, server v 5.7.22-log created 190703 12:07:37 at startup
#190703 12:14:49 server id 1  end_log_pos 1413 CRC32 0xfebef829  Table_map: `test`.`test` mapped to number 108

### UPDATE `test`.`test`
### WHERE
###   @1=1000 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
### UPDATE `test`.`test`
### WHERE
###   @1=1000 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
### UPDATE `test`.`test`
### WHERE
###   @1=1000 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
COMMIT

 

 
root@3f8a5a300f38:/var/lib/mysql# mysql -uroot -p < test.sql
Enter password:
root@3f8a5a300f38:/var/lib/mysql# mysql -uroot -p -e"select * from test.test"
Enter password:
+------+
| num  |
+------+
|    3 |
|    2 |
|    1 |
+------+
root@3750e4c8fcb0:/var/lib/mysql#

=> flashback 성공 확인

 

* 5.7,8.0 버전에서는 mariadb의 mysqlbinlog 로 교체 후 flashback 이 성공하나 5.6이하 버전에서는 교체한 mysqlbinlog 자체가 정상적으로 동작하지 않았음