tb_wubx(InnoDB、id PK AUTO_INCREMENT)。mysql-bin.000004 pos 4(僅建表結構)。id=1,2,3)。TRUNCATE TABLE tb_wubx(自增重置為 1)。id=1,名為「老趙趙」)。id=1,2,3,4 連續無衝突。TRUNCATE 語句的 stop-position。INSERT ... SELECT 補齊。RENAME TABLE 秒級完成新舊表交換。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 <-- 第一次 TRUNCATE (測試殘留)
| ... | ... | ... | ... | ... | ... |
| mysql-bin.000004 | 633 | Query | ... | 722 | use `wubx`; TRUNCATE TABLE tb_wubx <-- 目標誤操作 TRUNCATE
| ... | ... | ... | ... | ... | 後續 INSERT/UPDATE |
+------------------+------+------------+-----------+-------------+----------------------------------+
目標區間:start-position=4(備份基點) → stop-position=633(誤 TRUNCATE 前)。
mysql> CREATE DATABASE re_wubx;
mysql> USE re_wubx;
mysql> CREATE TABLE tb_wubx (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32)) ENGINE=InnoDB;
shell> mysqlbinlog --rewrite-db='wubx->re_wubx' \
--start-position=4 --stop-position=633 \
mysql-bin.000004 | mysql -S /tmp/mysql.sock re_wubx
mysql> SELECT * FROM re_wubx.tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
+----+--------------+
mysql> INSERT INTO re_wubx.tb_wubx(name) SELECT name FROM wubx.tb_wubx;
Query OK, 1 row affected
mysql> RENAME TABLE wubx.tb_wubx TO wubx.bak_tb_wubx,
re_wubx.tb_wubx TO wubx.tb_wubx;
mysql> SELECT * FROM wubx.tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
| 4 | 老趙趙 |
+----+--------------+
| 參數 | 作用 |
|---|---|
--rewrite-db='src->dst' | 庫名重映射,將 binlog 中 src 替換為 dst |
--start-position | 起始位點(含) |
--stop-position | 結束位點(不含),精確到誤操作語句前 |
--base64-output=decode-rows | ROW 格式 binlog 解碼為可讀 SQL(調試用) |
-v | 顯示行事件詳細內容 |
--include-gtids / --exclude-gtids 定位事務集合。TRUNCATE 記錄為 Query 事件,定位較易;ROW 格式需解碼 Table_map+Delete_rows 確認。INSERT ... ON DUPLICATE KEY UPDATE 或應用層重新分配 ID。mysqlbinlog | mysql 多線程導入,或用 myloader。