萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 誤執行 DELETE 後的 Binlog 數據恢復實戰

前提條件

  • MySQL 已啟用 Binlog:log-bin=mysql-bin
  • Binlog 格式為 ROW 模式(binlog_format=ROW),才會記錄逐行變更前後值

恢復步驟概覽

  1. 提取時間區間 Binlog:用 mysqlbinlog 導出誤操作時間段的日志
  2. 解析並反轉 DELETE 為 INSERT:將 Row 格式的 DELETE 事件轉換為 INSERT 語句
  3. 執行恢復腳本:在目標資料庫執行生成的 INSERT 語句

關鍵命令:導出 Binlog

mysqlbinlog --no-defaults \
  --start-datetime='2024-01-15 14:56:00' \
  --stop-datetime='2024-01-15 14:57:00' \
  -vv mysql-bin.000001 > /tmp/binlog_restore.txt

-vv 參數可將 Row 事件解碼為可讀的偽 SQL 格式。

Row 格式 DELETE 事件範例

### DELETE FROM test.me_info
### WHERE
###   @1=2165974  /* INT meta=0 nullable=0 is_null=0 */
###   @2='1984:03:17'  /* DATE meta=0 nullable=1 is_null=0 */
###   @3=NULL  /* DATE meta=765 nullable=1 is_null=1 */
###   @4=2012-10-25 00:00:00  /* DATETIME meta=0 nullable=0 is_null=0 */
###   @5=''  /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
###   @8=-1 (4294967295)  /* INT meta=0 nullable=1 is_null=0 */

轉換規則(需處理三類特殊值)

類型Binlog 顯示INSERT 需轉換為
DATETIME@4=2012-10-25 00:00:00'2012-10-25 00:00:00'(加單引號)
負數 INT@8=-1 (4294967295)-1(去除括號內無符號表示)
字串含轉義@5='O\'Reilly''O''Reilly'(單引號轉雙單引號)

Python 自動化恢復腳本核心邏輯

def read_binlog(file, column_num):
    with open(file) as f:
        last_table = None
        for line in f:
            if not line.startswith('###'): continue
            parts = line.split(' ', 3)
            if parts[1] == 'DELETE' and parts[2] == 'FROM':
                parts[1] = 'INSERT'
                parts[2] = 'INTO'
                last_table = parts[3].strip()
            elif parts[1].strip() == 'WHERE':
                parts[1] = 'VALUES ('
            # ... 依欄位號與類型做值轉換與拼接 ...
            print(' '.join(parts))

完整腳本需處理:欄位計數判斷最後一欄加 );、NULL 值保持、字串轉義、負數清洗等細節。

執行恢復

python restore.py binlog_restore.txt 16 > restore.sql
mysql -u root -p test < restore.sql

16 為目標表總欄位數,腳本以此判斷何時結束一行 INSERT。

避坑指南

  • 若 Binlog 為 STATEMENT 或 MIXED 格式,無法逐行恢復,需改用備份+時間點恢復(PITR)。
  • 大量 DELETE 時生成的 INSERT 腳本極大,建議分批執行或使用 LOAD DATA 導入 CSV。
  • 恢復前務必備份現狀資料,防腳本錯誤造成二次損壞。

掌握 Binlog 解析與 Row 事件反轉,是 DBA 從「會備份」進階到「會恢復」的關鍵技能。

copyright © 萬盛學電腦網 all rights reserved