首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 單機實時增量備份方案:Binlog 服務化與恢復演練實戰

     編輯:MySQL 資料庫相關知識

雙機主從是高可用標配,但單機場景下如何實現「準實時」增量備份?本文介紹基於 Binlog 的單機增量備份架構:mysqlbinlog --read-from-remote-server 遠程拉取 + 定期全量 + PITR (Point-in-Time Recovery) 恢復演練,實現 RPO < 1s、RTO 可控的備份體系。

一、核心原理

  • MySQL Binlog 記錄所有數據變更(ROW 格式最完整)
  • mysqlbinlog 可作為「Binlog 客戶端」持續流式拉取
  • 全量備份 + Binlog 增量 = 任意時間點恢復

二、配置啟用 Binlog

[mysqld]
log-bin=/data/binlog/mysql-bin
binlog-format=ROW
server-id=1
expire_logs_days=14
max_binlog_size=1G
sync_binlog=1
binlog_row_image=FULL
gtid-mode=ON
enforce-gtid-consistency=ON

三、備份腳本實現

1. 全量備份 (每日 02:00)

#!/bin/bash
# full_backup.sh
BACKUP_DIR="/backup/mysql/full_$(date +%F)"
mkdir -p "$BACKUP_DIR"

# 物理備份 (需停庫或使用 xtrabackup 熱備)
systemctl stop mysqld
tar -czf "$BACKUP_DIR/data.tar.gz" /var/lib/mysql
systemctl start mysqld

# 記錄 Binlog 位點
mysql -uroot -p -e "SHOW MASTER STATUS\G" > "$BACKUP_DIR/master_status.txt"
# 輸出示例: File: mysql-bin.000123, Position: 456789, GTID: xxxx:1-5000

2. 增量備份 (持續運行)

#!/bin/bash
# incremental_backup.sh - 以服務形式運行
BINLOG_DIR="/backup/mysql/binlog"
mkdir -p "$BINLOG_DIR"

# 從最後一個全量備份位點開始持續拉取
# 實際生產建議用 systemd 管理,支援自動重啟
mysqlbinlog \
  --read-from-remote-server \
  --host=127.0.0.1 \
  --user=backup_user \
  --password=StrongBackupPass \
  --raw \
  --stop-never \
  --result-file="$BINLOG_DIR/" \
  mysql-bin.000123  # 從全量備份記錄的文件開始

3. 專用備份賬號

CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongBackupPass';
GRANT REPLICATION SLAVE, REPLICATION CLIENT, SELECT, SUPER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;

四、恢復演練 (PITR)

場景:誤執行 DROP TABLE 於 2024-01-15 14:30:00,需恢復至 14:29:59

步驟 1:恢復全量備份

systemctl stop mysqld
rm -rf /var/lib/mysql/*
tar -xzf /backup/mysql/full_2024-01-15/data.tar.gz -C /
systemctl start mysqld

步驟 2:應用增量 Binlog 至指定時間點

# 解析 Binlog 文件範圍
mysqlbinlog --start-datetime="2024-01-15 02:00:00" --stop-datetime="2024-01-15 14:29:59" \
  /backup/mysql/binlog/mysql-bin.000123 \
  /backup/mysql/binlog/mysql-bin.000124 \
  ... > /tmp/incremental.sql

# 執行恢復
mysql -uroot -p < /tmp/incremental.sql

步驟 3:驗證數據完整性

CHECKSUM TABLE critical_table;
SELECT COUNT(*) FROM critical_table WHERE create_time < '2024-01-15 14:30:00';

五、自動化與監控

組件工具/方式頻率
全量備份Crontab + xtrabackup每日 1 次
增量拉取systemd 服務 (mysqlbinlog --stop-never)持續運行
備份驗證週度自動恢復演練 + Checksum 對比每週 1 次
磁碟監控Prometheus + Alertmanager (備份盤 > 80% 告警)實時
Binlog 積壓監控 mysqlbinlog 進程延遲 > 10s 告警實時

六、進階優化:Binlog Server (MySQL 8.0+)

部署專用 mysqlbinlogd (或 ProxySQL Binlog Router) 作為中繼:

  • 減輕主庫 Binlog 傳輸壓力
  • 多下游消費者(備份、同步、審計、CDC)共享一份流
  • 支援過濾、路由、格式轉換

七、避坑指南

坑 1:--stop-never 進程僵死不退出
systemd 配置 KillSignal=SIGTERM、TimeoutStopSec=30,健康檢查監控進程存活
坑 2:Binlog 文件被 expire_logs_days 清理導致斷點
增量備份盤獨立掛載、容量預留 3 倍日誌量、expire_logs_days=14 以上
坑 3:GTID 模式下 mysqlbinlog 輸出包含 SET GTID_PURGED
恢復時需確保目標實例 gtid_purged 為空,或使用 --skip-gtids (僅 ROW 格式)
坑 4:大事務導致 Binlog 巨大、恢復極慢
業務層拆分小事務;恢復時並行應用 (MySQL 8.0 SET SESSION sql_log_bin=0 + 多線程)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved