萬盛學電腦網

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

MySQL 增量備份實戰:啟用 Binlog + mysqldump + mysqlbinlog

策略總覽

頻率類型工具關鍵點
每週完整備份mysqldump--single-transaction --flush-logs --master-data=2
每日增量備份mysqladmin flush-logs + 複製 Binlog切換 Binlog,備份舊 Binlog 檔案

完整備份命令

mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > fullbackup_sun.sql

輸出檔案中包含關鍵註釋:

-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000002', MASTER_LOG_POS=107;

表示:**此備份完成後的所有變更,從 bin-log.000002 的位置 107 開始**。

每日增量備份操作

# 1. 切換 Binlog (產生新檔案,舊檔案固化)
mysqladmin -u root -p flush-logs

# 2. 備份上一個 Binlog 檔案 (如 bin-log.000002)
cp /var/lib/mysql/bin-log.000002 /backup/incremental/

# 3. 重複每日執行,備份 bin-log.000003, 000004...

恢復流程 (例:週三中午故障)

  1. 導入週日完整備份:
    mysql -u root -p < fullbackup_sun.sql
  2. 依序重放增量 Binlog:
    mysqlbinlog /backup/incremental/bin-log.000002 /backup/incremental/bin-log.000003 | mysql -u root -p
  3. 若有最新 Binlog (bin-log.000004) 且未備份,可直接重放至故障時間點:
    mysqlbinlog --stop-datetime='2024-01-17 12:00:00' /var/lib/mysql/bin-log.000004 | mysql -u root -p

自動化腳本

#!/bin/bash
# daily_incremental.sh - 每日 02:10 執行
BINLOG_DIR="/var/lib/mysql"
BACKUP_DIR="/backup/mysql/incremental/$(date +%F)"
mkdir -p "$BACKUP_DIR"

mysqladmin -u root -p"$MYSQL_PWD" flush-logs
# 找出倒數第二個 binlog (剛被 flush-logs 切換前的)
PREV_BINLOG=$(ls -1 $BINLOG_DIR/mysql-bin.* | tail -2 | head -1)
cp "$PREV_BINLOG" "$BACKUP_DIR/"
# 保留 14 天增量
find /backup/mysql/incremental -type f -mtime +14 -delete

關鍵前提

  • log-bin=mysql-bin 在 [mysqld] 區段啟用
  • binlog_format=ROW 推薦 (語句/混合模式亦可,但 ROW 最安全)
  • expire_logs_days=15 防止 Binlog 佔滿磁碟 (備份腳本已複製則可安全清理)
  • 備份用戶需 RELOAD (flush-logs)、SELECT、LOCK TABLES (mysqldump)、REPLICATION CLIENT (mysqlbinlog) 權限

驗證備份可用性

# 定期在測試環境恢復驗證
mysqlbinlog --start-datetime='2024-01-14 00:00:00' --stop-datetime='2024-01-15 00:00:00' \
  /backup/incremental/mysql-bin.000002 | head -20  # 檢查事件可讀性

**增量備份核心:Binlog 是橋樑,flush-logs 是節拍,自動化腳本是保障。**

copyright © 萬盛學電腦網 all rights reserved