| 頻率 | 類型 | 工具 | 關鍵點 |
|---|---|---|---|
| 每週 | 完整備份 | 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...
mysql -u root -p < fullbackup_sun.sqlmysqlbinlog /backup/incremental/bin-log.000002 /backup/incremental/bin-log.000003 | mysql -u root -pmysqlbinlog --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 是節拍,自動化腳本是保障。**