--log-bin(二進制日誌)expire_logs_days 清理)SUPER 或 REPLICATION CLIENT 權限# 查看 binlog 事件
mysqlbinlog /var/log/mysql/bin.123456 | head -50
# 導出可讀 SQL 文件
mysqlbinlog --start-datetime="2024-01-15 10:00:00" \
--stop-datetime="2024-01-15 12:00:00" \
/var/log/mysql/bin.123456 > /tmp/replay.sql
# 直接管道恢複
mysqlbinlog --stop-datetime="2024-01-15 09:59:59" /var/log/mysql/bin.123456 | mysql -u root -p
--start-datetime/--stop-datetime)適用:已知大致故障時間窗口(如「今天 10:00 誤刪表」)
# 1. 全量備份恢複(假設備份完成於 09:00)
mysql -u root -p < full_backup_0900.sql
# 2. 增量恢複:備份後到故障前
mysqlbinlog --start-datetime="2024-01-15 09:00:00" \
--stop-datetime="2024-01-15 09:59:59" \
/var/log/mysql/bin.123456 | mysql -u root -p
# 3. 跳過故障 SQL,繼續恢複故障後
mysqlbinlog --start-datetime="2024-01-15 10:01:00" \
/var/log/mysql/bin.123456 | mysql -u root -p
缺點:秒級精度,同一秒內多事務無法精準切分;時區不一致導致偏差。
--start-position/--stop-position)— 生產環境推薦適用:需精確到事務級別(如跳過具體一條 DROP TABLE)
# 1. 導出故障時間窗口 SQL 供人工審查
mysqlbinlog --start-datetime="2024-01-15 09:55:00" \
--stop-datetime="2024-01-15 10:05:00" \
/var/log/mysql/bin.123456 > /tmp/audit.sql
# 2. 用編輯器打開 audit.sql,定位故障 SQL 的 position
# 格式:# at 368312
# DROP TABLE `biz`.`orders` /* generated by server id 1 */
# 3. 精準恢複:故障 position 前
mysqlbinlog --stop-position="368312" /var/log/mysql/bin.123456 | mysql -u root -p
# 4. 跳過故障事務:故障 position 後(注意:position 是下一事件起始位置)
mysqlbinlog --start-position="368315" /var/log/mysql/bin.123456 | mysql -u root -p
關鍵點:mysqlbinlog 輸出包含 SET TIMESTAMP=...,恢複後數據時間戳與原事務一致。
# 從庫設置延遲 1 小時
CHANGE MASTER TO MASTER_DELAY=3600;
# 故障發生時,停止從庫 SQL 線程,提升為新主
STOP SLAVE SQL_THREAD;
# 驗證數據完整後,應用切換寫入
T_backupT_faultmysqlbinlog --start-datetime=T_backup --stop-datetime=T_fault binlog... | mysql# 查看故障事務 GTID
SHOW BINLOG EVENTS IN 'bin.123456' FROM 368312 LIMIT 5;
# GTID: 3e11fa47-71ca-11ee-9f3a-005056a1b2c3:15
# 停止從庫,跳過該 GTID
STOP SLAVE;
SET GTID_NEXT='3e11fa47-71ca-11ee-9f3a-005056a1b2c3:15';
BEGIN; COMMIT; -- 空事務佔位
SET GTID_NEXT='AUTOMATIC';
START SLAVE;
| 痛點 | 優化方案 |
|---|---|
| 單線程恢複慢 | 拆分 binlog 按庫/表並行導入;或用 mysqlbinlog --database=db --table=tbl 過濾 |
| 網絡傳輸瓶頸 | 在目標服務器本地執行 mysqlbinlog,避免跨網絡管道 |
| 索引構建耗時 | 恢複前 SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; 導入後重建 |
| binlog 文件過大 | split --lines=100000 bin.123456 part_ 分片並行 |
| 事務過大導致內存飆升 | mysqlbinlog --max-allowed-packet=1G、分批提交 |
# 1. 核心表行數對比
SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.tables
WHERE TABLE_SCHEMA='biz' ORDER BY TABLE_ROWS DESC;
# 2. 關鍵業務指標
SELECT COUNT(*) FROM orders WHERE created_at > '2024-01-15';
SELECT SUM(amount) FROM payments WHERE status='success' AND date='2024-01-15';
# 3. 數據校驗和(關鍵表)
SELECT CHECKSUM TABLE orders, payments, users;
# 4. 主從一致性工具
pt-table-checksum --databases=biz --recurse=1 --recursion-method=hosts
pt-table-sync --execute --print h=master,D=biz,t=orders
ROW 格式恢複最安全,STATEMENT 可能因非確定函數導致不一致GTID 模式:恢複後需 RESET MASTER 重新生成 GTID,避免與舊集群衝突mysqlbinlog --set-charset=utf8mb4 確保編碼正確SUPER/CREATE/DROP 等完整權限--default-time-zone 參數指定二進制日誌恢複核心:全量備份 + 增量 binlog 重放。
生產環境鐵律:位點定位優於時間定位、人工審查 SQL 必不可少、驗證腳本自動化、演練常態化。
工具鏈:mysqlbinlog + pt-table-checksum/sync + GTID + 延遲從庫 = 企業級 PITR 體系。