Ubuntu 上 SQLAdmin 备份策略制定
一 目标与前提
二 备份策略设计
三 落地实施步骤
#!/usr/bin/env bash
set -Eeuo pipefail
BACKUP_ROOT="/backup"
DATE=$(date +%F_%H-%M-%S)
DB_HOST="127.0.0.1"
DB_PORT="3306"
DB_USER="backup"
DB_PASS="YourStrongPass"
MYSQL="mysql --host=$DB_HOST --port=$DB_PORT --user=$DB_USER --password=$DB_PASS --single-transaction --routines --triggers --default-character-set=utf8mb4"
MYSQLDUMP="mysqldump --host=$DB_HOST --port=$DB_PORT --user=$DB_USER --password=$DB_PASS \
--single-transaction --routines --triggers --set-gtid-purged=OFF --hex-blob --triggers --routines --events \
--default-character-set=utf8mb4 --databases your_db1 your_db2"
OUT_DIR="$BACKUP_ROOT/daily/$DATE"
mkdir -p "$OUT_DIR"
LOG="$BACKUP_ROOT/logs/backup_$DATE.log"
exec >"$LOG" 2>&1
echo "[$(date)] Start full backup"
# 全量导出
$MYSQLDUMP > "$OUT_DIR/full_$DATE.sql"
# 压缩与校验
gzip "$OUT_DIR/full_$DATE.sql"
sha256sum "$OUT_DIR/full_$DATE.sql.gz" > "$OUT_DIR/full_$DATE.sha256"
echo "[$(date)] Full backup OK: $OUT_DIR/full_$DATE.sql.gz"
[mysqld]
server-id=1
log_bin=/var/log/mysql/mysql-bin
binlog_format=ROW
expire_logs_days=7
mysql --host=127.0.0.1 --user=backup --password=YourStrongPass -sN -e \
"SHOW MASTER STATUS\G" | awk '/File:/ {file=$2} /Position:/ {pos=$2} END {print file, pos}' \
> /backup/logs/binlog_pos_$(date +%F).txt
0 2 * * * root /usr/local/bin/backup_mysql_full.sh
0 3 * * 0 root /usr/bin/find /backup/daily -maxdepth 1 -type d -mtime -8 -mtime +0 -exec mv {} /backup/weekly/ \;
0 4 * * * root /usr/bin/find /backup/daily -mtime +7 -delete
0 4 * * 0 root /usr/bin/find /backup/weekly -mtime +28 -delete
0 5 1 * * root /usr/bin/find /backup/monthly -mtime +365 -delete
0 6 * * * root /usr/bin/rclone copy /backup/daily remote:bucket/mysql/daily/ --log-file /backup/logs/rclone_$(date +\%F).log
四 恢复流程与演练
gunzip < /backup/daily/2026-01-01_02-00-00/full_2026-01-01_02-00-00.sql.gz | \
mysql --host=127.0.0.1 --user=root --password=YourRootPass
mysqlbinlog --start-datetime="2026-01-01 02:00:00" \
--stop-datetime="2026-01-01 10:15:00" \
/var/log/mysql/mysql-bin.00000[1-9]* | mysql --host=127.0.0.1 --user=root --password=YourRootPass
五 监控告警与优化
groups:
- name: backup
rules:
- alert: BackupJobFailed
expr: backup_last_exit{job="mysql_backup"} != 0
for: 5m
labels:
severity: critical
annotations:
summary: "MySQL backup job failed"
description: "Job mysql_backup exit code != 0 for more than 5m"