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

MySQL 誤操作秒級回滾:binlog2sql 閃回實戰指南

     編輯:MySQL 資料庫相關知識

核心前提

  • MySQL 必須開啟 Row 格式 Binlog
  • 配置:binlog_format=ROW、log_bin、server_id
  • 無 Binlog 或 DDL 誤操作(DROP/TRUNCATE)無法閃回,只能靠備份

開啟 Binlog 配置

[mysqld]
server_id=1
log_bin=/var/log/mysql/mysql-bin.log
max_binlog_size=100M
binlog_format=ROW

安裝 binlog2sql

git clone https://github.com/danfengcao/binlog2sql.git
cd binlog2sql
pip install -r requirements.txt

實戰場景:誤 DELETE 全表

-- 原始數據
SELECT * FROM tbl;
+----+--------+---------------------+
| id | name   | addtime             |
+----+--------+---------------------+
| 1  | 小趙   | 2016-12-10 00:04:33 |
| 2  | 小錢   | 2016-12-10 00:04:48 |
| 3  | 小孫   | 2016-12-13 20:25:00 |
| 4  | 小李   | 2016-12-12 00:00:00 |
+----+--------+---------------------+

-- 誤操作
DELETE FROM tbl; -- 20:28 執行
-- 表已空

三步閃回流程

步驟 1:定位誤操作 Binlog 文件與時間窗口

SHOW MASTER STATUS;
+------------------+----------+
| Log_name         | File_size|
+------------------+----------+
| mysql-bin.000052 | 965      |

步驟 2:按時間範圍解析 SQL,定位精確位置

python binlog2sql.py \
-h 127.0.0.1 -P 3306 -u admin -p 'admin' \
-d test -t tbl \
--start-file='mysql-bin.000052' \
--start-datetime='2016-12-13 20:25:00' \
--stop-datetime='2016-12-13 20:30:00'

輸出關鍵信息: 刪除語句位於 position 728-938 之間。

步驟 3:按 Position 精確生成回滾 SQL 並執行

# 生成回滾 SQL 驗證
python binlog2sql.py \
-h 127.0.0.1 -P 3306 -u admin -p 'admin' \
-d test -t tbl \
--start-file='mysql-bin.000052' \
--start-pos=3346 --end-pos=3556 \
-B  # 關鍵參數:生成反向 SQL

# 確認無誤後管道執行
python binlog2sql.py ... -B | mysql -h127.0.0.1 -P3306 -uadmin -p'admin'

回滾 SQL 示例:

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, '小李');
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, '小孫');
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, '小錢');
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, '小趙');

驗證恢復

SELECT * FROM tbl;
-- 數據完整恢復

常見問題 FAQ

問題答案
DDL 誤操作(DROP TABLE)能閃回嗎?不能。Row 模式 Binlog 不記錄 DDL 逐行變更。需依賴備份或修改內核 Patch(阿里 Lin Xiaobin 方案,極少公司應用)。
還有其他閃回工具嗎?阿里彭立勳 mysqlbinlog + flashback Patch、去哪兒 Inception(備份恢復模式)、從庫延遲備份(浪費資源)。binlog2sql 輕量、無侵入、易用。
binlog2sql 支持哪些版本?MySQL 5.6/5.7/8.0,MariaDB 10.2+,需 Row 格式 Binlog。
大事務解析慢怎麼辦?工具支持 --stop-datetime/--stop-pos 精確截取,避免全量解析。

最佳實踐建議

  1. 核心業務庫強制開啟 ROW Binlog:閃回前提
  2. 定期驗證 Binlog 完整性:模擬閃回演練
  3. 權限最小化:僅 DBA/自動化工具持有 DELETE/TRUNCATE/DROP 權限
  4. 建立誤操作應急預案:SOP 文檔化,工具預裝,演練常態化

總結

Binlog2sql 將「數小時備份恢復」壓縮為「分鐘級閃回」,是 MySQL 運維工具箱必備利器。記住鐵律:ROW Binlog 是閃回的命門,DDL 只能靠備份。

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