首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL mysqlbinlog Flashback 逆向恢復教學:誤刪/誤改資料的救命稻草

     編輯:MySQL 資料庫相關知識

mysqlbinlog flashback 是淘寶彭立勳開發的強大功能(作者部落格),支援對 Row 格式 Binlog 進行逆向操作:DELETE→INSERT、UPDATE→反向 UPDATE、INSERT→DELETE,讓 DBA 快速恢復誤操作資料。

編譯帶 Flashback 的 mysqlbinlog

  1. 準備 MySQL 5.5.18 源碼(示例用 Percona 分支)。
  2. 下載補丁:wget https://mysql.taobao.org/images/0/0f/5.5.18_flashback.diff
  3. 打補丁:patch -p0 < 5.5.18_flashback.diff
  4. 編譯(僅需 mysqlbinlog):./configure ... && make
  5. 驗證:./mysqlbinlog --help | grep -B 出現 -B 參數即成功。

實戰演練:恢復誤 DELETE 全表

場景準備

mysql> SELECT COUNT(*) FROM pic_url;  -- 786476 筆
mysql> DELETE FROM pic_url;            -- 誤刪全部
mysql> SELECT COUNT(*) FROM pic_url;  -- 0 筆

定位 Binlog 位置

mysql> SHOW BINARY LOGS;
...
mysql-bin.000011 | 195001447
mysql-bin.000012 | 106

當前檔較小,目標在 mysql-bin.000011。用 mysqlbinlog -v --base64-output=decode-rows 解碼並搜尋表名,找到 DELETE 事件的 start-position 與 stop-position。

生成逆向 SQL(驗證用)

./mysqlbinlog -v --base64-output=decode-rows -B \
  --start-position=377 --stop-position=195001377 \
  /u1/mysql/logs/mysql-bin.000011 > B11.sql

檢查 B11.sql 尾部應為 INSERT INTO pic_url ... 逆向語句。

執行恢復

./mysqlbinlog -B --start-position=377 --stop-position=195001377 \
  /u1/mysql/logs/mysql-bin.000011 | mysql test

驗證結果

mysql> SELECT COUNT(*) FROM pic_url;  -- 786476 筆,資料完整恢復

關鍵注意事項

  • max_allowed_packet:大表恢復前必須調大,建議 SET GLOBAL max_allowed_packet=1073741824;(1GB),否則報錯 Got a packet bigger than 'max_allowed_packet' bytes。
  • 風險警示:恢復操作不可逆,務必在備庫驗證或經驗豐富 DBA 指導下執行。
  • 僅支援 Row 格式:Statement/Mixed 格式無法精準逆向。
  • 二進位檔下載:編譯好的 64 位 Linux 版 GitHub 連結。

適用場景

  • 誤執行 DELETE 無 WHERE 或 WHERE 條件錯誤。
  • 誤 UPDATE 大範圍資料。
  • 誤 INSERT 髒資料需快速移除。

Flashback 讓 Binlog 成為真正的「時光機」,是 DBA 必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved