雙機主從是高可用標配,但單機場景下如何實現「準實時」增量備份?本文介紹基於 Binlog 的單機增量備份架構:mysqlbinlog --read-from-remote-server 遠程拉取 + 定期全量 + PITR (Point-in-Time Recovery) 恢復演練,實現 RPO < 1s、RTO 可控的備份體系。
mysqlbinlog 可作為「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
#!/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
#!/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 # 從全量備份記錄的文件開始
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongBackupPass'; GRANT REPLICATION SLAVE, REPLICATION CLIENT, SELECT, SUPER ON *.* TO 'backup_user'@'localhost'; FLUSH PRIVILEGES;
DROP TABLE 於 2024-01-15 14:30:00,需恢復至 14:29:59systemctl stop mysqld rm -rf /var/lib/mysql/* tar -xzf /backup/mysql/full_2024-01-15/data.tar.gz -C / systemctl start mysqld
# 解析 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
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 告警 | 實時 |
部署專用 mysqlbinlogd (或 ProxySQL Binlog Router) 作為中繼:
--stop-never 進程僵死不退出KillSignal=SIGTERM、TimeoutStopSec=30,健康檢查監控進程存活expire_logs_days 清理導致斷點expire_logs_days=14 以上mysqlbinlog 輸出包含 SET GTID_PURGEDgtid_purged 為空,或使用 --skip-gtids (僅 ROW 格式)SET SESSION sql_log_bin=0 + 多線程)