log-bin=mysql-bin(my.cnf)。SHOW BINLOG EVENTS\G 或 mysql --user=root -p -e 'SHOW BINLOG EVENTS\G'。--start-date/--stop-date)場景:今天 10:00 誤刪大表,需恢復至 09:59:59。
# 1. 還原前一晚完整備份
mysql -u root -p < full_backup_20240119.sql
# 2. 重放 Binlog 至誤操作前一秒
mysqlbinlog --stop-date="2024-01-20 09:59:59" /var/log/mysql/mysql-bin.000123 | mysql -u root -p
# 3. 若誤操作後還有正常業務,續接重放
mysqlbinlog --start-date="2024-01-20 10:01:00" /var/log/mysql/mysql-bin.000123 | mysql -u root -p
缺點:秒級精度,同秒內多筆交易無法精準切割。
--start-position/--stop-position)——推薦mysqlbinlog --start-date="2024-01-20 09:55:00" --stop-date="2024-01-20 10:05:00" \
/var/log/mysql/mysql-bin.000123 > /tmp/review.sql
/tmp/review.sql,搜尋誤刪語句(DROP TABLE、DELETE FROM),記下其 # at xxx 位置號。# 重放至誤操作前一個位置
mysqlbinlog --stop-position=123456 /var/log/mysql/mysql-bin.000123 | mysql -u root -p
# 跳過誤操作,從誤操作後位置續放
mysqlbinlog --start-position=123789 /var/log/mysql/mysql-bin.000123 | mysql -u root -p
優點:位置號對應每個事件,精準至單一交易,不受同秒多交易影響。
# 依序處理多個 Binlog 檔案
mysqlbinlog mysql-bin.000123 mysql-bin.000124 mysql-bin.000125 | mysql -u root -p
gtid_mode=ON、enforce_gtid_consistency=ON。SET GTID_PURGED 或 mysqlbinlog --skip-gtids 配合 SOURCE_POSITION_WAIT()。mysqlbinlog --include-gtids=gtid_set 可直接提取特定 GTID 區間。ROW 或 MIXED,避免 STATEMENT 非確定性問題。Seconds_Behind_Master(若為 Slave)或錯誤日誌。ANALYZE TABLE 更新統計資訊。mysqlbinlog 輸出包含 SET TIMESTAMP=...,會影響 NOW()、SYSDATE() 行為,確保應用層不依賴此類函數做關鍵邏輯。max_allowed_packet,需調大或分檔處理。DROP DATABASE/TRUNCATE TABLE 等 DDL 也會記錄在 Binlog,恢復時會重執行,謹慎確認範圍。