http://pan.baidu.com/s/1nvGOOIl
注意事項
在指定--start-position時,需要注意包含table_map_event的位置,否則工具無法找到相關表的元數據信息。
如有疑問請聯系微信:onesoft007
簡介
DBA或者開發人員,有時會誤刪除或者誤更新數據。傳統的數據庫恢復方法是利用之前的備份再加上誤操作之前的binlog,來恢復數據。該方法需要耗費較長時間來恢復備份,甚至需要停機維護,嚴重降低系統的可用性。
MySQL的flashback功能是由淘寶的彭立勛,在MySQL-5.5.18的基礎上開發的。隨着binlog格式的變動和類型的增加,基於5.5.18的版本,無法用於目前主流的5.6版本的。因此平民軟件將該功能移植到5.6版本上,讓相關人員對數據庫有更強的掌控能力。
binlog格式選擇
MySQL的binlog格式分為三類:statement、mixed、row。其中,
statement格式,記錄了所有客戶端的執行語句。比如 update tb1 set name='aaa' where id=1;
row格式,記錄了數據庫的變更前和變更后數據。比如 update tb1 set name='aaa' ,id=1 where name='bbb' , id=1;
mixed格式,是二者的混合。在使用statement格式不會造成主從不一致時,使用statement格式,否則使用row模式。
因此想要把數據回退到上一個時間點,必須保證binlog_format=row
閃回原理
單個event閃回
舉例說明
- 在數據庫中創建如下表
mysql> show create table tb1\G
*************************** 1. row ***************************
Table: tb1
Create Table: CREATE TABLE `tb1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
- 執行增、刪、改動作
insert into tb1 values(1,'aaa'),(2,'aaa');
delete from tb1 where id=2;
update tb1 set name='bbb' where id=1;
- 查看binlog文件
mysqlbinlog -v 128.000129
########################################
SET TIMESTAMP=1459999601/*!*/;
BEGIN
/*!*/;
# at 301
#160407 11:26:41 server id 10 end_log_pos 346 Table_map: `test`.`tb1` mapped to number 224
# at 346
#160407 11:26:41 server id 10 end_log_pos 395 Write_rows: table id 224 flags: STMT_END_F
BINLOG '
cdMFVxMKAAAALQAAAFoBAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
cdMFVx4KAAAAMQAAAIsBAAAAAOAAAAAAAAEAAgAC//wBAAAAA2FhYfwCAAAAA2FhYQ==
'/*!*/;
### INSERT INTO `test`.`tb1`
### SET
### @1=1
### @2='aaa'
### INSERT INTO `test`.`tb1`
### SET
### @1=2
### @2='aaa'
# at 395
#160407 11:26:41 server id 10 end_log_pos 422 Xid = 271
COMMIT/*!*/;
# at 422
#160407 11:27:04 server id 10 end_log_pos 490 Query thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1459999624/*!*/;
BEGIN
/*!*/;
# at 490
#160407 11:27:04 server id 10 end_log_pos 535 Table_map: `test`.`tb1` mapped to number 224
# at 535
#160407 11:27:04 server id 10 end_log_pos 575 Delete_rows: table id 224 flags: STMT_END_F
BINLOG '
iNMFVxMKAAAALQAAABcCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
iNMFVyAKAAAAKAAAAD8CAAAAAOAAAAAAAAEAAgAC//wCAAAAA2FhYQ==
'/*!*/;
### DELETE FROM `test`.`tb1`
### WHERE
### @1=2
### @2='aaa'
# at 575
#160407 11:27:04 server id 10 end_log_pos 602 Xid = 272
COMMIT/*!*/;
# at 602
#160407 11:27:22 server id 10 end_log_pos 670 Query thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1459999642/*!*/;
BEGIN
/*!*/;
# at 670
#160407 11:27:22 server id 10 end_log_pos 715 Table_map: `test`.`tb1` mapped to number 224
# at 715
#160407 11:27:22 server id 10 end_log_pos 765 Update_rows: table id 224 flags: STMT_END_F
BINLOG '
mtMFVxMKAAAALQAAAMsCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
mtMFVx8KAAAAMgAAAP0CAAAAAOAAAAAAAAEAAgAC///8AQAAAANhYWH8AQAAAANiYmI=
'/*!*/;
### UPDATE `test`.`tb1`
### WHERE
### @1=1
### @2='aaa'
### SET
### @1=1
### @2='bbb'
# at 765
#160407 11:27:22 server id 10 end_log_pos 792 Xid = 273
COMMIT/*!*/;
# at 792
#160407 11:28:04 server id 10 end_log_pos 829 Rotate to 128.000130 pos: 4
DELIMITER ;
###################################################
- 反轉
insert:event中包含該行數據的每個字段值,刪除即可
delete:event中包含了刪除前,該行數據的所有字段值。將刪除的數據,重新插入即可
update:只需將set和where部分調換,即可完成反轉。
多個event閃回
如果誤操作的事務是由多個event組成的,那么必須將整個事務倒序恢復,即從最后一個event恢復到第一個event。
使用方法
舉例說明
- insert into tb1 values(1,'aaa'),(2,'aaa');
- delete from tb1 where id=2;
- update tb1 set name='bbb' where id=1;
- select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | bbb |
+------+------+
- mysqlbinlog -v --start-pos=557 128.000132
#####################
# at 557
#160407 12:04:15 server id 10 end_log_pos 602 Table_map: `test`.`tb1` mapped to number 224
# at 602
#160407 12:04:15 server id 10 end_log_pos 652 Update_rows: table id 224 flags: STMT_END_F
BINLOG '
P9wFVxMKAAAALQAAAFoCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
P9wFVx8KAAAAMgAAAIwCAAAAAOAAAAAAAAEAAgAC///8AQAAAANhYWH8AQAAAANiYmI=
'/*!*/;
### UPDATE `test`.`tb1`
### WHERE
### @1=1
### @2='aaa'
### SET
### @1=1
### @2='bbb'
# at 652
#160407 12:04:15 server id 10 end_log_pos 679 Xid = 540
COMMIT/*!*/;
#####################
- mysqlbinlog -v -B --start-pos=557 128.000132
############################
BINLOG '
P9wFVxMKAAAALQAAAFoCAAAAAOAAAAAAAAEABHRlc3QAA3RiMQACAw8CFAAD
P9wFVx8KAAAAMgAAAIwCAAAAAOAAAAAAAAEAAgAC///8AQAAAANiYmL8AQAAAANhYWE=
'/*!*/;
### UPDATE `test`.`tb1`
### WHERE
### @1=1
### @2='bbb'
### SET
### @1=1
### @2='aaa'
############################
可以看出update已經被反轉
執行反轉
- mysqlbinlog -B -v --start-pos=557 128.000132 | mysql -utest -ptest test
mysql> select * from tb1;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
有興趣的,可以繼續往下恢復。
注意:恢復之前先在不使用的從機上做測試,測試成功后,再在主庫上做。
限制
該軟件利用binlog中記錄了操作前的數據鏡像和操作后的數據鏡像。有如下限制
1) binlog_format=row
2) 只支持insert、update、delete
3) 不支持drop 、truncate、alter等ddl語句
結論
flashback功能,可以在緊急情況下,避免用戶漫長的數據庫恢復過程。讓高可用提升一個級別。
下載地址
http://pan.baidu.com/s/1nutwWg5
如有疑問請聯系微信:onesoft007
