關於MySql數據庫誤操做數據找回的辦法

  先講個事,前段時間,系統長時間不用的一個功能被開放出來了,想固然的我沒有在測試平臺上測試,直接操做了正式系統(的確是我不嚴謹),致使好多數據異常,頁面展現錯亂了。因而我想到的第一個就是進行備份還原。項目進行了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是有三種格式的:函數

  • statement,基於SQL語句的模式,通常來講生成的binlog尺寸較小,可是某些不肯定性SQL語句或函數在複製過程可能致使數據不一致甚至出錯;
  • row,基於數據行的模式,記錄的是數據行的完整變化。相對更安全,推薦使用(但一般生成的binlog會比其餘兩種模式大不少);
  • mixed,混合模式,能夠根據狀況自動選用statement抑或row模式;這個模式下也可能形成主從數據不一致。它屬於MySQL 5.1版本時期的過渡方案,已不推薦使用了。

  注意:使用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語句

相關文章
相關標籤/搜索