| 階段 | 資料內容 |
| 誤操作後現狀 | id=1, name='老趙趙' |
| 期望恢復目標 | id=1 張三, id=2 李四, id=3 隔壁老王, id=4 老趙趙 |
恢復步驟
1. 確認備份起點與 Binlog 分佈
mysql> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000004 | 1144 |
+------------------+-----------+
備份位置:mysql-bin.000004, pos=4(建表語句後)。
2. 解析 Binlog 找到 TRUNCATE 位置
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000004';
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
| mysql-bin.000004 | 4 | Format_desc | ... | 120 | ... |
| mysql-bin.000004 | 120 | Query | ... | 209 | use `wubx`; TRUNCATE TABLE tb_wubx <-- 第一次 |
| ... | ... | Write_rows | ... | ... | t1 寫入 |
| ... | 633 | Query | ... | 722 | use `wubx`; TRUNCATE TABLE tb_wubx <-- 誤操作 |
| ... | ... | Write_rows | ... | ... | t3 寫入 |
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
目標區間:pos 4 → 633(第一次 TRUNCATE 到誤操作 TRUNCATE 之間的寫入)。
3. 建立恢復庫並重放 Binlog
# 建立恢復庫 re_wubx 及同結構表 tb_wubx(略)
mysqlbinlog --rewrite-db='wubx->re_wubx' \
--start-position=4 --stop-position=633 \
mysql-bin.000004 | mysql -S /tmp/mysql.sock re_wubx
4. 驗證恢復結果
mysql> SELECT * FROM re_wubx.tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
+----+--------------+
5. 合併 TRUNCATE 後的新增資料
INSERT INTO re_wubx.tb_wubx(name) SELECT name FROM wubx.tb_wubx;
RENAME TABLE wubx.tb_wubx TO wubx.bak_tb_wubx;
RENAME TABLE re_wubx.tb_wubx TO wubx.tb_wubx;
6. 最終結果
mysql> SELECT * FROM wubx.tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
| 4 | 老趙趙 |
+----+--------------+
關鍵點總結
- 必須有備份起點 Binlog 位置或完整 Binlog 鏈,否則無法恢復。
- 恢復區間截止於誤操作 TRUNCATE 之前,避免主鍵衝突(TRUNCATE 重置 AUTO_INCREMENT)。
- 使用
--rewrite-db 將原庫重導向恢復庫,隔離環境。
- TRUNCATE 後的新增資料需單獨合併(
INSERT ... SELECT + RENAME TABLE 原子切換)。
- 大表恢復前調大
max_allowed_packet。
此流程適用於 MIXED/ROW 格式,STATEMENT 格式需謹慎驗證。
- 上一篇文章: Linux 產生隨機密碼指令集:/dev/urandom 與 UUID 兩種方法
- 下一篇文章: MySQL 修改資料庫名稱變通方案:RENAME DATABASE 移除後的最佳實踐
Copyright ©
程式碼之家 All Rights Reserved