mysqlbinlog flashback 是淘寶彭立勳開發的強大功能(作者部落格),支援對 Row 格式 Binlog 進行逆向操作:DELETE→INSERT、UPDATE→反向 UPDATE、INSERT→DELETE,讓 DBA 快速恢復誤操作資料。
wget https://mysql.taobao.org/images/0/0f/5.5.18_flashback.diffpatch -p0 < 5.5.18_flashback.diff./configure ... && make./mysqlbinlog --help | grep -B 出現 -B 參數即成功。mysql> SELECT COUNT(*) FROM pic_url; -- 786476 筆 mysql> DELETE FROM pic_url; -- 誤刪全部 mysql> SELECT COUNT(*) FROM pic_url; -- 0 筆
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。
./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 筆,資料完整恢復
SET GLOBAL max_allowed_packet=1073741824;(1GB),否則報錯 Got a packet bigger than 'max_allowed_packet' bytes。DELETE 無 WHERE 或 WHERE 條件錯誤。UPDATE 大範圍資料。INSERT 髒資料需快速移除。Flashback 讓 Binlog 成為真正的「時光機」,是 DBA 必備技能。