先講個事,前段時間,系統長時間不用的一個功能被開放出來了,想固然的我沒有在測試平臺上測試,直接操做了正式系統(的確是我不嚴謹),致使好多數據異常,頁面展現錯亂了。因而我想到的第一個就是進行備份還原。項目進行了7天的備份,天天凌晨自動備份,可是凌晨到如今的數據就會丟失了,這但是重大問題啊。我頓時慌了,因而只能尋求DBA的幫助。這邊省略五百字。。。mysql
最後問題解決了,讓我對數據恢復產生了興趣,聽DBA講用的方法是Flashback閃回工具,也簡單,因而我也自學了一下,這邊作個介紹。sql
flashback能夠把數據庫恢復到之前某個時間點(或者說某個binlog的某個pos)。好比忘了帶where條件的update、delete操做,傳統的恢復方式是利用全備+二進制日誌前滾進行恢復,相比於傳統的全備+增備,flashback顯然更爲快速、簡單。這裏有個注意點,DDL語句是不支持進行flashback的,謹慎操做。數據庫
先講講所謂的閃回是什麼意思,瞭解他的原理是什麼。安全
其實很簡單,至關於回滾,MySQL的binlog以event的形式,記錄了MySQL中全部的變動狀況,利用binlog咱們就可以重現所記錄的全部操做。flashback工具(-B 參數)可對rows格式的binlog能夠進行逆向操做,將已執行的delete語句反向生成insert語句,將update語句生成反向update語句,將insert語句反向生成delete語句。這裏提一句,binlog是有三種格式的:函數
注意:使用mysqlbinlog flashback 工具必須設置:binlog_format = row。若是誤操做的事務是由多個event組成的,那麼必須將整個事務倒序恢復,即從最後一個event恢復到第一個event。工具
使用方法:測試
第一步:安裝flashbackui
MySQL自己是不自帶flashback的,咱們須要進行本身安裝。下載地址:https://pan.baidu.com/s/1U33OO79RjBMJPSi0dDpKdgspa
將mysqlbinlog文件移至mysql安裝路徑的bin目錄下,執行mysqlbinlog --help(自行解決報錯),無任何報錯後再執行mysqlbinlog -V,看是否mysql是否版本發生了變化,且多了一個 -B 參數,這樣就裝完了。日誌
第二步:測試效果
隨便建一張表,好比叫frame_ou
create table frame_ou(
ouguid varchar(50) not null,
ouname varchar(20),
oulevel int(5)
)
咱們往裏面插入一條數據,insert into frame_ou values('111','組織部',1);
看下binlog裏面,能夠看到這句插入語句mysqlbinlog -vv mysql-bin.000004
1 ### INSERT INTO `test`.`frame_ou` 2 ### SET 3 ### @ouguid=111 /* VARSTRING(50) meta=50 nullable=0 is_null=0 */ 4 ### @ouname='組織部' /* VARSTRING(50) meta=20 nullable=1 is_null=0 */ 5 ### @oulevel=1 /* SHORTINT meta=0 nullable=1 is_null=0 */
而後執行下flashback mysqlbinlog -vv mysql-bin.000004 -B,而後就會發現
### DELETE FROM `test`.`frame_ou` ### WHERE ### @ouguid=111 /* VARSTRING(50) meta=50 nullable=0 is_null=0 */ ### @ouname='組織部' /* VARSTRING(50) meta=20 nullable=1 is_null=0 */ ### @oulevel=1 /* SHORTINT meta=0 nullable=1 is_null=0 */
同理,delete操做將會被轉換爲insert,update被轉換爲反向的update;若在一個事務中既有insert、update、delete語句,經過使用-B參數後,不只三種DML語句完成了逆向轉換,而且語句順序也會發生顛倒。
在binlog中找到誤操做的pos變化區間後,使用mysqlbinlog -B 恢復:
# mysqlbinlog -B --start-position=431 --stop-position=509 mysql-bin.000004 | mysql -uroot -p
注意事項:
1) binlog_format=row
2) 只支持insert、update、delete
3) 不支持drop 、truncate、alter等DDL語句